-
-
[原创]2017CTF秋-第二题分析
-
发表于: 2017-10-26 15:56 3017
-
随便输入一串测试码: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
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
看原图
赞赏
雪币:
留言: