打开程序看到了wrong,打开OD字符串搜索
发现Correct!双击进入
GetDlgItemInt获取输入,
同时猜测0040466F是进行一些处理,先在这里下断点,
顺着程序往下看,下面有两个jmp,第一个jmp最后会跳转至第二个jmp处,但是第二个jmp会直接跳过correct!
(这里的时候百思不得其解,以为要nop掉第二个jmp)但其实不是让自己nop掉,是要根据输入来让程序自己nop掉。
开始调试程序:
输入个123(7B)
来到第一个jmp的地方
这里发现0040469F处,将一些奇怪的指令传递(修改)至0040466F,然后又调用了两次0040466F,之间还让eax自加1
看一下修改后的是什么指令:
0040466F $ C600 90 mov byte ptr ds:[eax],0x90
00404672 ? C3 retn
0x90就是nop,mov byte ptr ds:[eax],0x90就是将nop放在当前eax的值对应的地址处
再联系一下
00401071 > /EB 11 jmp short Replace.00401084
中的 EB 11 和两次调用0040466F中间的eax自加1
可以判断这里就是需要将EB 11都改为转换为nop(就把第二个jmp给nop掉了)
所以任务就是在调用0040466F时,令eax = 0x401071,这个就与输入有关
而我这里输入的123(7B),此时的eax是60160646
我重新调试,再输入另一个值111(6F),调试到004046A9,此时6016063A
0x6016063A – 0x6F = 6016 05CB
0x60160646 – 0x7B = 6016 05CB
即 将输入的10进制数转为16进制与6016 05CB相加作为eax,于是:
0x6016 05CB - 0x401071 = 0x A02A 0AA6(前面的FFFFFFFFF略去,因为eax只保存后8位)
0xA02A0AA6 = 2687109798 即是flag