这道题乍一看很难,做起来也不简单。。。
一开始随便试试,他会自己崩溃,我也很崩溃。
od打开它,因为他有个wrong,猜想正确的时候会有correct,所以直接搜一下,
还真有,双击嗲点进去,在此断点。
上面有个getdlgitemint函数,因为只能输数字,猜测这就是被调用的输入函数,在这里断一下。
然后F8单步过,到0040106C处,他会跳转到00404690处,在往后走,会来到004046A9处,他执行函数0040466F,然后,就没有然后了,程序崩了…
在这里我们F7跟进,
可以看到,这个函数,将以eax的内容为地址的地址的内容改成了0x90(查资料可知,这是个nop,即空指令,不执行)。
我们再回头看看,当程序执行到004046A9时,eax的值。经试验,输入12时,eax=601605D7;当输入1234时,eax=60160A9D;当输入零时,eax=601605CB !
综上所述,eax的值等于601605CB+输入值,而接下来执行的函数会将这一地址变为空指令。实验时,应该是该函数修改非法的内存地址而导致程序退出。
而这又有什么用呢?继续往下看,在最后有一个跳转。
而这个00401071,恰巧在我们的correct上面,
按说,有个jmp,无论如何也不会执行到我们想要的地方,此时,上一个函数就起作用了,可以利用上一个函数,将这个jmp变成nop,程序便自然而然的到了我们想要的地方。
那么问题就变成了:输入一个数,使之与601605CB的和等于00401071。可以看出,601605CB大于00401071,怎么办呢?可以利用溢出,结果为10040105A也可以达到我们的目的,于是,我们输入的数就成了0x10040105A-0x601605CB,结果是A02A0AA6,即2687109798
Reversing.kr -Replace
最新推荐文章于 2020-10-14 09:37:49 发布