上次说的溢出0day的shellcode终于写完了,开始遇到了不少困难,但都一一解决了。
一开始,像大多数其它溢出那样,执行完shellcode后就sleep等死,可是这里不行,在进入有漏洞的函数前,系统占了一个锁,如果等死了,整个系统也立马卡死。函数调用是像下面这样的:
call func2()
{
getlocker();
bugfunc();//存在溢出的函数
releaselocker();
}
func1
{
call func2();
}
解决方法是在bugfunc函数返回到shellcode的开头时,记录下esp,根据这个esp计算出溢出前ebp与esp的值并恢复(ebp已经被覆盖,但esp是有效的),然后通过ebp回溯一层调用堆栈,得到func2的返回 地址,返回地址-5得到call func2语句的地址,然后在func2 中根据特征找到call bugfunc的地址,当shellcode执行完之后就跳到这个地址+5的位置。由于寄存器的值也都保存下来了,这样整个溢出就相当于bugfunc调用失败了(猜测模拟成功都是可以做到的),其它一切正常,继续从call bugfunc的下一行开始执行。