随便输入个数,发现崩溃了PEID查发现没壳,IDA找到dialogproc,F5发现IDA报错代码逻辑前面就是GetDlgItemInt获取输入,(所以输入必须要是整形看下后面,得知错误原因很简单,sub_40466F是个函数,但是程序在运行的时候对他进行了动态修改,所以IDA认为这个程序对const进行了修改运行时改变代码,好,那就OD看下这里[0x4084d0]就是input,是个全局变量,跟进call,这里看到了sub_404689,功能很简单,把input+=1,这个函数在dialogfunc那里也有调用F7走起,再F7,注意eip的地址,第二张图eip的位置其实就在第一张eip的位置的后面一点然后调用inc input的那个函数,返回之后又会inc一次,这个不好说,大家自己跟一下就知道了。。。inc完两次之后如图所示,注意栈上的返回地址,所以再F7之后,到了这个地方,就是把input增加0x601605c7,可能会溢出,但是无所谓,取余一下就好下面一点指令貌似没什么用,因为没对input有什么影响,走到下面的call,又会inc input两次,最后retn会返回到dialogproc所以这个函数在被后面的指令修改之前,干了一件事,把input +2 + 0x601605c7 +2确认一下,我输入的是20192019,所以>>> hex(20192019+2+2+0x601605c7)'0x614a20de'如数据窗口所示,数是反过来的是因为little endian返回那个函数(change_f)之后(在xor eax,eax那里),被修改过的input被mov到了eax中,然后又调用一次inc_input,然后修改change_f函数的函数头,在call change_f那里F7进去,发现汇编被修改成了[eax]=0x90,注意此时eax的值,其实就是 input +2 + 0x601605c7 +2 ,所以随便输一个数会崩溃,因为访问了无效的内存地址返回后inc eax,然后再调用一次被修改后的change_f0x90,是不是很熟悉?没错,就是nop,再看看IDA的代码,有一个疑似成功的代码段 但是没有任何jmp之类的跳转到这里,空格看看,上面有个jmp short(刚好两个字节),很明显了,这道题就是要通过这个mov byte ds:[eax], 0x90来nop掉那个jmp short,所以 input + 2 + 0x601605c7 + 2 = 那个jmp short的地址。考虑到整数溢出,所以用C,//input + 2 + 0x601605c7 + 2 == 0x00401071unsigned int getinput(){ return 0x00401071/*jmp short 地址*/ - 4 - 0x601605c7;}int main(){ printf("%u\n", getinput()); system("pause");}//*/一个思路比较新奇的CM,利用nop爆破的题目,不难,但是比较有意思,发帖纪录一下
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)
会飞的鱼油 为什么我的od在地址404674处显示的是db 81,不是那个add指令,这个是怎么修改的