Reversing.kr -Replace

这道题乍一看很难,做起来也不简单。。。
在这里插入图片描述
一开始随便试试,他会自己崩溃,我也很崩溃。
在这里插入图片描述
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
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值