欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

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

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

随便输入一串测试码: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

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功