由于程序控制的EIP最终为0c0c0c0c,如果不修改一下的话,跟踪调试的时候,调试器是不会停下来的,那么很简单,直接把0c0c0c0c改为FFFFFFFF即可,这样调试器会发现程序在执行非法内存地址的指令,就会停下来。停下来后,你可以去检查栈中的蛛丝马迹。根据函数调用的原理,我们可以知道覆盖EIP为FFFFFFFF前执行的指令应该是RET指令,在这个指令执行前一定有一个函数被调用,而这个函数也很有可能就是最终发生溢出的函数,那么在ESP指向的栈空间的上部一定有一些返回地址,那么我们可以把几个可以的返回地址记下来,然后在下一次程序加载了这个地址所属的dll文件或exe文件时拦截,并把断点下到刚才记录下来的地址紧邻的前一条指令处,那么一旦断下来,有两种境况,第一种情况是,栈还未被覆盖,说明溢出还没有发生,那么只要单步跟踪仔细调试,就可以跟到发生溢出的那行代码;第二种境况是,栈已经被覆盖了,那说明记录下来的几个可疑地址是不正确的,根本就没有在这些函数内部发生溢出,这就需要在刚才发生了溢出后的栈中继续前溯,一定会在溢出之前断下程序,因为无论如何程序在溢出之前一定调用过某个程序。而这个程序的返回地址会保存在栈中。
时间: 2024-10-04 21:25:50