首页
社区
课程
招聘
[原创]2017CTF秋-第二题分析
2017-10-26 15:56 2547

[原创]2017CTF秋-第二题分析

ccfer 活跃值
16
2017-10-26 15:56
2547
随便输入一串测试码:aaaabbbbccccdddd,调试到下面retn的地方,发现有栈溢出,会返回到输入值dddd指向的地方:
.text:0040106D                 lea     eax, [esp+0Ch+var_C]
.text:00401071                 push    eax
.text:00401072                 push    offset aS       ; "%s"
.text:00401077                 call    _scanf
.text:0040107C                 lea     eax, [esp+14h+var_C]
.text:00401080                 add     esp, 14h
.text:00401083                 retn

先想到的是,直接控制跳转到下面这里就可以了,但这样似乎和注册码无关了,作者不会这样设计
.text:0040102F                 push    offset aYouGetIt ; "You get it!\n"
.text:00401034                 call    sub_413D42
.text:00401039                 add     esp, 4
.text:0040103C                 xor     eax, eax
.text:0040103E                 retn

于是猜测应该是返回到一个验证算法的代码块里去会比较合理,把exe扔ida里翻翻,在可执行区段看到可疑的地方:
.text:00413130                 retn
.text:00413131                 add     esp, 0FFFFFFF0h
后面带了很多花指令的代码,0x413131这个地址可能就是验证算法的入口

重新输入:aaaabbbbcccc11A,可以控制执行流程跳转到那个可疑的入口,反正代码不算很长,慢慢单步跟踪吧,把关键指令逐行记录如下:
00413131    83C4 F0         ADD     ESP,-10
00413150    33C0            XOR     EAX,EAX
00413184    A3 34B04100     MOV     DWORD PTR DS:[41B034],EAX
004131BA    58              POP     EAX                                //aaaa
004131EB    8BC8            MOV     ECX,EAX
0041321F    58              POP     EAX                                //bbbb
00413254    8BD8            MOV     EBX,EAX
00413289    58              POP     EAX                                //cccc
004132AD    8BD0            MOV     EDX,EAX
004132E2    8BC1            MOV     EAX,ECX
00413316    2BC3            SUB     EAX,EBX
00413349    C1E0 02         SHL     EAX,2
00413380    03C1            ADD     EAX,ECX
004133B5    03C2            ADD     EAX,EDX
004133E9    2D E217F9EA     SUB     EAX,EAF917E2
00413420    0F85 DD060000   JNZ     00413B03                        //不等最后会返回注册失败

00413455    03C1            ADD     EAX,ECX
00413489    2BC3            SUB     EAX,EBX
004134BF    8BD8            MOV     EBX,EAX
004134F3    D1E0            SHL     EAX,1
00413525    03C3            ADD     EAX,EBX
00413559    03C1            ADD     EAX,ECX
0041358F    8BC8            MOV     ECX,EAX
004135C3    03C2            ADD     EAX,EDX
004135F7    2D C808F5E8     SUB     EAX,E8F508C8
0041362E    0F85 CF040000   JNZ     00413B03                        //不等最后会返回注册失败

00413665    8BC1            MOV     EAX,ECX
004136A7    2BC2            SUB     EAX,EDX
004136D8    2D 683C0A0C     SUB     EAX,0C0A3C68
00413710    0F85 ED030000   JNZ     00413B03                        //不等最后会返回注册失败

根据上面三个判断条件列出一个方程组:
(a-b)*4 + a + c = 0xEAF917E2
(a-b)*3 + a + c = 0xE8F508C8
(a-b)*3 + a - c = 0x0C0A3C68
解出:
a=0x7473754A
b=0x726F6630
c=0x6E756630

拼出的答案是:
Just0for0fun11A

[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

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