首页
社区
课程
招聘
[原创]第二题 ctf2017_Fpc--------writeup
2017-10-27 16:12 2711

[原创]第二题 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直播授课

收藏
点赞1
打赏
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回