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

level2

Level2是更进了一步,也是不返回到test,而是去执行函数bang,但是区别是bang也要传入参数,但是参数是是一个全局变量,这里就是不同于level1那样在栈上覆盖了,因为全局变量要去内存地址中修改了,但是又不能调用个一个可以修改全局变量的函数,这里就只能利用我们的exploit代码了,让我们的exploit代码具有执行这些功能的函数,那么怎么执行起来呢,那就是把区别与之前是用ret执行别的函数一样,这里是用ret来执行我们自己写的exploit代码函数,然后在我们自己的函数中做到修改全局变量的值还有执行bang函数。

我们自己的代码就是写一些汇编指令来实现,然后要利用gcc和objdump生成相应的可执行的机器码。

实验指导中提示我们不可以利用汇编指令的call和jmp来试图执行bang函数,因为这里是相对地址容易带来错误。


其实有了前面的经验,就很简单,如果我们想执行某一个函数,那么就把该函数的入口地址入栈就ok了。

下面是bang函数的c代码:


我们首先查看bang的汇编代码,看一下全局变量存在哪里:


这里我们看到,mov 应该就是把我们的0x804d10c中的全局变量取出来放入eax寄存器中,然后cmp一句可以看出来我们的全局变量与cookie进行比较。那么我们就要来编写我们的漏洞利用代码了,首先把我们的cookie写到全局变量的地址中,然后在把bang的入口地址入栈,通过ret指令来执行bang函数,这里的push bang的入口地址,在ret,是不是很像我们自己仿造的一个call指令,首先模仿系统把返回eip地址push,然后ret执行的时候,就会去执行我们这个返回地址所在的这条命令了,哈哈。下面就是我们的code.s


这里然后就是如何把code.s生成字节码了,拿实验指导文档中的例子说的已经很明确了:

首先是一个example.s


然后进行汇编和反汇编


得到以后:


这里68 ef cd ab 00 就是push $0xabcdef 这条汇编指令的十六进制字节码。Example.s的字节码就是:


然后在通过hex2raw把上面的字节码变成输入bufbomb的合适的字符串格式。

接下来我们就来生成我们的字节码:



接下来我们就要利用gdb调试找到我们的exploit的地址了,用我们的地址来覆盖返回地址,这样就像我们前面分析的就可以来执行我们的exploit代码了。

首先在getbuf函数里面设置断点:


可以看到buf的首地址在-0x28(%ebp),我们在0x804926e也就是call gets之前设置断点来查看eax寄存器中的内容,也就是我们buf的首地址,也就是我们的exploit的函数的入口地址,


现在就可以看到我们的地址是0x55683248

接下来就可以构造我们的expliot代码了level2.txt如下:



猜你喜欢

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