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