1、过反调试
1298处是发现调试器的处理函数,注入DLL,直接写入C3过掉反调试
1
2
3
4
|
DWORD dwOldFlag;
VirtualProtect((void
*
)(ullModule
+
0x1298
),
1
, PAGE_EXECUTE_READWRITE, &dwOldFlag);
*
(char
*
)(ullModule
+
0x1298
)
=
(char)
0xC3
;
VirtualProtect((void
*
)(ullModule
+
0x1298
),
1
, dwOldFlag, &dwOldFlag);
|
2、分析
2-1、发现几处字符串解密,同样注入DLL,Hook之,拿到解密后的字符串
方便理解在IDA重命名函数为g_DecodeString
1
2
3
4
|
g_DecodeString(v0,
Format
.nSize, (__int64)
"&x+^x"
,
5
);
/
/
Please enter your key:
g_DecodeString(v15, v50.nSize, (__int64)
"*s>0?"
,
5
);
/
/
kctf
g_DecodeString(v19, lpModuleName.nSize, (__int64)
"!?>d*"
,
5
);
/
/
kernel32.dll
g_DecodeString(v21, lpProcName.nSize, (__int64)
"?x)da"
, v20);
/
/
RtlFillMemory
|
分析后发现程序将输入字符串拼接后丢给140001450函数处理
1
2
3
|
3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6
+
input
+
677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280
|
2-2、分析调用链140001450-->sub_140002A10-->sub_1400029C4
重点分析这个函数sub_140002818,用于保存Ntdll.dll的ZW系列函数地址,自己写代码验证了下,Zw系列函数的数量是0x1D9,与猜想一致。
2-3、提取hash函数,建立hash反查函数名的表
2-4、 Hook函数sub_1400029C4,根据上面的反查表打印出函数名
2-5、分析sub_140001450逻辑,发现创建一个线程并调用2347次RtlFillMemory,将shellcode写入内存
3、分析shellcode逻辑
3-1、shellcode主函数
3-2、shellcode关键逻辑函数
3-3、shellcode逻辑解析
将3201382652D139C0E22132DF1BC2212EA0991650A229B36436823D0B13D51E6拆分成21组3字节的十六进制,并转成10进制整数,如(320,138,265,2D1,...)。
转成十进制后(800 312 613 721,...), 表示0列0行是8,1列2行是3,1列3行是6,......
将677116575313142309154604431859253431473963507533496829080645035455771774602058076430276921790210013736267644383505517280转成60组2字节的整数,如(67,71,16,57,...),表示传入的60个数字的顺序
4、 将数独提取出来,使用在线网址求解
5、 将数独和行数、列数组合起来,并按照顺序打印
获得flag:11230A2CD3C31CA32E0D707D38E0743531F80F726C1D133B3A914E2F034B1D63BB17F34428E2A31B038C25E0FA2BF2301053752062AA16E20A2FC1971730E90823D01A724B0CA19B0652811541480B80943AE27E13122C30C120
6、多解分析
分析shellcode逻辑时发现十六进制转整数过程中允许'+','-'符号的存在,感觉可以将3位数的首位的'0'换成'+', 如"0D7"和"+D7"转出来的整数是相等的。
构造出几组多解:
11230A2CD3C31CA32E+D707D38E0743531F80F726C1D133B3A914E2F034B1D63BB17F34428E2A31B038C25E0FA2BF2301053752062AA16E20A2FC1971730E90823D01A724B0CA19B0652811541480B80943AE27E13122C30C120
11230A2CD3C31CA32E+D7+7D38E0743531F80F726C1D133B3A914E2F034B1D63BB17F34428E2A31B038C25E0FA2BF2301053752062AA16E20A2FC1971730E90823D01A724B0CA19B0652811541480B80943AE27E13122C30C120
11230A2CD3C31CA32E+D7+7D38E+743531F8+F726C1D133B3A914E2F034B1D63BB17F34428E2A31B038C25E+FA2BF2301053752062AA16E20A2FC197173+E9+823D01A724B+CA19B+65281154148+B8+943AE27E13122C30C120
整串中有11处'0'可以换成'+',理论上可以构成2^11 == 2048组多解
更多【KCTF 2023 第六题 WP 中午吃什么】相关视频教程:www.yxfzedu.com