【reversing.kr逆向之旅】Replace的writeup

无壳  vc++程序

载入Olydbg动态调试分析就好

可以通过下API断点GetWindowTextW来找到关键代码

【reversing.kr逆向之旅】Replace的writeup

因为它就是用来捕获我们的输入的    随意输入(这里可以发现只可以输入数字 长度什么的倒是没有限制)

就像下面一样  可以看到地址很大 在系统领空 user32.dll   所以这里不用管

【reversing.kr逆向之旅】Replace的writeup

上面循环过去之后

就来到了这里

【reversing.kr逆向之旅】Replace的writeup

可以看到成功的标志Correct!

但是CPU窗口有两个jmp指令   也就是说无条件跳转  肯定无法成功   向上向下跟踪    可以看到只有地址00401071处有一个跳转进来    可以使我们走向成功

接着向下单步  来到下图所示

【reversing.kr逆向之旅】Replace的writeup

可以发现  程序不管输入什么  总是走到0x004046A9这里就停止运行了

可以看到这个call跳转向的地址  是将eax所对应的地址进行nop

连续两个这样的call 中间inc eax    就是eax加1    也就是说连续nop两个地址

再来看下边那个向上跳转的jmp    跳转的地址0x00401071  对应其中一个jmp   挨着的下一条指令正好是个空指令

那么我们就可以利用这两个call   将这两条指令进行nop   即可走向Correct!

 

这时候重点就在eax是如何与我们的输入进行运算的

输入123时  eax=0x60160646     把123转成十六进制是0x7b     0x60160646-0x7b=0x601605cb

【reversing.kr逆向之旅】Replace的writeup【reversing.kr逆向之旅】Replace的writeup

重新输入1234时    eax=0x60160A9D   把1234转成十六进制是0x4d2    0x60160A9D-0x4d2=0x601605cb

多次输入 可以发现最终结果都是0x601605cb    

那么我们正确的输入应该要满足0x00401071-?=0x601605cb 

可以发现需要eax溢出才可能成立

所以?= 0x100401071-0x601605cb = 0xa02a0aa6

【reversing.kr逆向之旅】Replace的writeup

验证2687109798   成功

【reversing.kr逆向之旅】Replace的writeup

参考链接:

http://www.mottoin.com/article/reverse/88447.html

https://www.cnblogs.com/xiao-zhang/articles/5602504.html