-
-
[原创]第二题 ctf2017_Fpc--------writeup
-
2017-10-27 16:12 2711
-
0x00 认清假验证,找到真入口
刚拿到题直接IDA走起,发现逻辑很清晰,获取输入,然后计算两个方程,都过了就成功。
//方程一 .text:004010A7 004 89 45 F4 mov [ebp+var_C], eax .text:004010AA 004 6B C0 05 imul eax, 5 .text:004010AD 004 03 C8 add ecx, eax .text:004010AF 004 81 F9 42 3A 50 8F cmp ecx, 8F503A42h .text:004010B5 004 75 20 jnz short loc_4010D7 .text:004010B7 004 8B 45 F4 mov eax, [ebp+var_C] .text:004010BA 004 6B C0 0D imul eax, 0Dh .text:004010BD 004 03 D0 add edx, eax .text:004010BF 004 81 FA 42 3A 50 EF cmp edx, 0EF503A42h //方程二 .text:004010F7 004 89 45 F4 mov [ebp+var_C], eax .text:004010FA 004 6B C0 11 imul eax, 11h .text:004010FD 004 03 C8 add ecx, eax .text:004010FF 004 81 F9 83 48 A9 F3 cmp ecx, 0F3A94883h .text:00401105 004 75 20 jnz short loc_401127 .text:00401107 004 8B 45 F4 mov eax, [ebp+var_C] .text:0040110A 004 6B C0 07 imul eax, 7 .text:0040110D 004 03 D0 add edx, eax .text:0040110F 004 81 FA 83 48 A9 33 cmp edx, 33A94883h
但是整理了方程之后发现并不能有解,而且规则要求答案只会是字母和数字,接收输入地方也没有字符串转数字的处理,所以应该是有别的解法,仔细看接收输入处,发现用的scanf没用检查长度,猜测是栈溢出,但是要溢出到哪里呢,直接修改返回到you get it
是不行的,因为地址0040102F
中的102F
不符合规则中解的限制。所以继续往后看,发现奇怪之处。
.text:0040112B 90 90 90 90 90 db 5 dup(90h) .text:00401130 00 00 00 00 00 00 00 00 00 00+ db 12000h dup(0) .text:00413130 C3 retn
这里明显是故意填充的数据,为了能用符合要求的输入来溢出,使得流程转到这个地址,但是看后面的代码乱遭遭的,猜测是加了混淆,上OD开始溢出跟混淆。
0x01 剥去混淆,得到答案
输入aaaaaaaaaaaa11A
跳到 00413131
处,然后开启run 追踪
人肉过滤掉混淆后的代码如下:
add esp,-0x10 ;回到输入栈头 xor eax,eax mov dword ptr ds:[0x41B034],eax pop eax ;取输入前4字节 mov ecx,eax pop eax ;取中4字节 mov ebx,eax pop eax ;取后4字节 mov edx,eax ;ecx, ebx, edx ;开始计算 mov eax,ecx sub eax,ebx shl eax,0x2 add eax,ecx add eax,edx sub eax,0xEAF917E2 ;不相等,提示错误并退出 ;整理 4 * (x - y) + x + z = 0xEAF917E2 ;化简 5x - 4y + z = 0xEAF917E2 ;相等 计算第二轮 add eax, ecx sub eax, ebx mov ebx, eax ;y = x - y shl eax, 1 add eax, ebx add eax, ecx mov ecx, eax ;x = 3 * (x - y) + x add eax, edx sub eax, 0xE8F508C8 ;不相等,提示错误并退出 ;整理 3 * (x - y) + x + z = 0xE8F508C8 ;化简 4x - 3y + z = 0xE8F508C8 ;相等 计算第三轮 mov eax, ecx sub eax, edx sub eax, 0xC0A3C68 ;整理 3 * (x - y) + x - z = 0xC0A3C68 ;化简 4x - 3y - z = 0xC0A3C68 ;相等 计算第四轮 pop eax xor eax, 0x8101 mov edi, eax xor eax, eax pop eax push eax mov edi, eax push 0x4E000969 pop eax xor eax, edx xor eax, 0x10A3E xor eax, ebx xor eax, 0x22511E14 xor eax, 0x61642D xor eax, dword ptr ds:[0x41B034] jmp eax
分析得到3个方程
5x - 4y + z = 0xEAF917E2 4x - 3y + z = 0xE8F508C8 4x - 3y - z = 0xC0A3C68 解得: x = 0x7473754A, y = 0x726F6630, z = 0x6E756630
由于内存中是小端模式,所以应该是 4A757374 30666F72 3066756E
转为ASCII对应的字符Just0for0fun
综上,最终的解为: Just0for0fun11A
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图