【Reversing.kr】Replace.exe

本文介绍了一道关于寻找有效序列号的挑战题目解析过程。通过逆向工程分析,确定了输入数字与程序行为之间的关联,并利用内存地址溢出技巧找到了正确的序列号。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

做Reversing.kr上的题除了带Easy的都很吃力,而且能搜到的中文WP比较少,自己抠出来的题目分享给大家。

首先打开这道题会出现一个界面,如图所示:


观察这个界面,大致可以推测出这道题是让我们找到一个有效的序列号,而且注意一下这个文本框里只能输入数字,输入字母是没有反应的。

而且假如随便输入一个数字会导致程序出错:


由于拖进IDA的程序比较复杂恶心,我就直接展示拖到OD中的情况吧。

首先按快捷键Ctrl+n,查看程序调用的所有函数,发现一个调用了一个函数GetDlgItemInt,由于输入的文本框中不能有非数字符号,于是推测文本框所调用的就是GetDlgItemInt这个函数。


我们跟进这个函数,惊喜的发现下面有我们的目标函数。


现在我们在加断点后随意输入一个数字后点击check按钮,用F8不断跟进,发现一旦调用0x0040466F函数时程序就会自动终止:


于是跟进这个函数,惊讶的发现这个函数除了Ret只进行了一个操作,那就是mov eax所在地址一个0x90的值,此时如果输入数值为0,eax为0x601605CB:



于是我们恍然大悟,此处由于我们输入的数字有误,eax修改的是一个非法的内存地址,于是会导致程序出错而中止,那么我们观察得知,eax此处的数值与我们输入的数值是eax=0x601605CB+(我们输入的数值),回到我们的目标函数位置,发现在进行到我们的目标函数之前,有一个强制的jmp操作会使我们无法运行到目标函数:


此处查阅资料可知,在刚才我们进入的函数中,mov到eax指向地址的 0x90为nop指令,也就是说我们可以想办法让刚才的函数修改的地址为这个强跳指令,把目标函数之前的jmp给nop掉,但由于0x601605cb的地址是要比0x0040105A要大的,可以利用溢出,结果为10040105A也可以达到我们的目的,于是flag 就是0x10040105A-0x601605CB,结果为:2687109798


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值