做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