不知道为什么 ,最近睡眠不好,晚上睡不着,早上醒得早。看吧,今天早上又被鸟吵醒了。
醒了,看着无事来破解下这个,在测试过程中发现,这个crackme有个搞笑的地方。
就是注册码只要是1234,无论你输入或者不输入用户名,都会提示成功(当然有例外,这也是本题的所在),到官方一提交,夷,错了,我勒个去,居然没看题目就做了。
原来是要求用户名必须是2012,得,你牛。
看我怎么搞定你!
当然,首先还是找到按钮事件。
1 00401004 . 55 push ebp 2 00401005 . 8BEC mov ebp, esp 3 00401007 . 81EC 10000000 sub esp, 10 4 0040100D > 6A FF push -1 5 0040100F . 6A 08 push 8 6 00401011 . 68 11000116 push 16010011 7 00401016 . 68 01000152 push 52010001 8 0040101B . E8 D7010000 call 004011F7 ; 获取注册码 9 00401020 . 83C4 10 add esp, 10 10 00401023 . 8945 FC mov dword ptr [ebp-4], eax 11 00401026 . 68 04000080 push 80000004 12 0040102B . 6A 00 push 0 13 0040102D . 8B45 FC mov eax, dword ptr [ebp-4] 14 00401030 . 85C0 test eax, eax ; 注册码输入是否为空 15 00401032 . 75 05 jnz short 00401039 16 00401034 . B8 509B4600 mov eax, 00469B50 17 00401039 > 50 push eax 18 0040103A . 68 01000000 push 1 19 0040103F . BB 60124000 mov ebx, 00401260 20 00401044 . E8 A8010000 call 004011F1 ; eax为注册码的十六进制形式 21 00401049 . 83C4 10 add esp, 10 22 0040104C . 8945 F8 mov dword ptr [ebp-8], eax ; 注册码放入XXX 23 0040104F . 8B5D FC mov ebx, dword ptr [ebp-4] 24 00401052 . 85DB test ebx, ebx 25 00401054 . 74 09 je short 0040105F 26 00401056 . 53 push ebx 27 00401057 . E8 8F010000 call 004011EB 28 0040105C . 83C4 04 add esp, 4 29 0040105F > E8 AF000000 call 00401113 ; 关键call,其实就是读取用户名的值 30 00401064 . 3945 F8 cmp dword ptr [ebp-8], eax ; 注册码与XXXXX进行比较 31 00401067 . 0F85 40000000 jnz 004010AD ; 关键跳 32 0040106D . 68 04000080 push 80000004
来看看关键call中的一部分。
1 0040118F |. 8945 FC mov dword ptr [ebp-4], eax 2 00401192 |. 8B45 FC mov eax, dword ptr [ebp-4] 3 00401195 |. E9 00000000 jmp 0040119A 4 0040119A |> 8BE5 mov esp, ebp
如果你仔细看,你会觉得真他妈脑残。
就像看a=b; b=a;一样。而且还jmp到下一句。
反正总的来说,关键call就是把用户名,也就是2012放入堆栈中,等着对比就可以了。