CSAPP 深入理解计算机系统 Buflab实验,缓冲区溢出攻击实验(5)

level3

前面的几个实验都是不管是去执行别的函数比如bang还是去执行我们自己的exploit的函数,最后都没有返回就退出了,我们通过我们的漏洞利用代码可以修改内存(比如把全局变量修改为我们的cookie)修改寄存器中的值,比如当前的level3,我们都把原来的恢复现场需要用的返回地址和原test的ebp给破坏了,这一关中,我们将修复这些被我们破坏的栈状态信息,让最后还是回到test中,让被攻击者不容易发现我们动了手脚,而我们还要把test调用的getbuf的返回值由0x1改成我们的cookie。

这里的基本思路就是函数调用栈,函数调用结束以后,栈被释放,而返回结果会放在eax寄存器中,这样test这个调用者不需知道调用的getbuf是怎么执行的,只需要到eax寄存器中去取返回值就好了,那么我们就在getbuf执行完以后,再把eax寄存器中的值动手脚修改为我们的cookie就ok了。然后,考虑栈的恢复,我的前面一篇文章函数调用以及栈过程中详细分析,需要两个部分,一个是ebp一个是eip的地址,一个是恢复pop出test的原ebp,所以在我们破坏之前,就先用gdb调试出来test的原ebp是多少记录下来,恢复的时候在赋值给它。我们用gdb来调试得到我们的ebp的值:


看到我们可以在0x8049262处设置断点。


可以看到原test的ebp是0x556832a0

然后eip的地址,就是返回地址,也就是test中在callgetbuf函数的下一条指令的地址,


可以看到call的下一条指令的地址是0x8048e50

我们就是写我们的exploit函数的内容主要是,修改eax,恢复原栈状态,写成的汇编版本,在像之前一样生成汇编指令的字节码,我们只需要在getbuf返回地址时执行我们的exploit函数了。因为我们要执行破坏一定会先破坏原栈状态的,所以我只需要在我们自己的代码中做到恢复就ok了,不矛盾的。

这里有两种方案,一种是覆盖掉原ebp的值不管别的,利用代码如下:


生成汇编指令的机器码



        

编写exploit  level3.txt



一种是在覆盖原保存的ebp的时候就用原ebp的值







猜你喜欢

转载自blog.csdn.net/shiyuqing1207/article/details/46316093