- 实验目的
这项作业将帮助你发展对 IA-32 调用约定和堆栈组织的详细理解。它包括对实验室目录中的可执
行文件 bufbomb 进行一系列缓冲区溢出攻击
- 实验要求
本实验的各个阶段需要每个学生提供稍微不同的解决方案。正确的解决方案将基于您的用户 id。
cookie 是一个由八个十六进制数字组成的字符串,它(很有可能)对您的用户 id 是唯一的。您可以使用
makecookie 程序生成您的 cookie,并给出您的用户 id 作为参数。例如:
unix >。/makecookie bovik
0x1005b2b7
在五次缓冲区攻击中的四次中,你的目标是让你的 cookie 出现在通常不会出现的地方。
- 实验内容(所修改函数代码,功能以及重要代码的解释):
先解压压缩包,再根据自己对应的学号生成对应的cookie值。
Level 0:candle
当test函数调用完getbuf函数后,会向下执行,我们要让它跳转到smoke函数,那我们就要修改getbuf函数的返回地址,首先我们反汇编getbuf函数和smoke函数。
可以看出lea把buf的指针地址(-0x32(%ebp))传给了Gets()函数,也就是buf距离返回地址有0x32+4(%ebp的字节数)=54个字节的距离,所以我们只要在buf开始位置填入54个字节,并在返回地址中填入smoke的地址就行了,smoke的地址为0x08048ba1.
Level 1:sparker
要让getbuf函数的返回地址指向fizz函数,同时要让fizz的参数设置为对应的cookie值。
先反汇编fizz函数:
找到fizz函数的首地址:0x08048bce
fizz函数的参数在fizz函数首地址和cookie值之间:
Level 2:Firecracker
Getbuf函数调用后,不执行test函数,而要执行bang函数,同时我们要修改global_value的值为cookie值,但是global_value是一个全局变量,没有出现在函数里,所以我们要利用函数调用来赋值。
首先反汇编bang函数:
根据mov 0x804d140,%eax;mov %eax,%edx;mov 0x804d138,%eax可知value的值储存在0x804d140中,cookie的值储存在0x804d138中,所以写出他们的汇编代码:
然后再将汇编代码转换成二进制文件:
由于bang函数的首地址为0x08048c1f,所以我们要将getbuf的返回地址改为buf的首地址运行,上一个栈的4字节改成bang函数的地址,这样的话,当在getbuf函数调用完ret返回时程序会跳转到buf上面的恶意函数指令,再跳转到bang函数的地址,所以我们要得到buf的地址:
所以buf的地址为0x556833be,再构造文件:
Level 3:Dynamite
这个实验要求getbuf调用完之后返回到test中,且不能破坏test函数的堆栈状态,同时返回值为cookie值。
先反汇编test函数:
从汇编代码中可以看出getbuf函数返回地址为0x08048c8d,写出它的汇编代码:
然后转为二进制文件:
由于覆盖getbuf返回地址时会覆盖保存的ebp的值,所以ebp应该取寄存器指向的值,为0x55683410:
构造文件:
Level 5:Nitroglycerin
这关需要加上-n运行bufbomb,进入testn和getbufn函数。
这关会要求提供输入5次字符串,每一次都要求getbufn的返回值为自己的cookie值,其他要求与上一个实验相同。
反汇编getbufn函数与testn函数:
可以看出再getbufn函数中ebp比esp中的内容大0x2c2,调用完getbufn函数后返回到0x08048d07,所以写出恶意代码:
先根据mov %esp,%ebp和sub $0x18,%esp恢复ebp中的内容,再返回cookie值,最后返回地址指向testn中的getbufn调用后的一条指令,再返回testn继续执行。
找到buf的首地址:
得到最大的地址为0x55683198,将它作为跳转地址,有效机器代码至于跳转地址之前,并将它所有的字符作为nop指令,此时五个buf地址的写入都能满足跳转到0x55683198后顺利到达有效机器代码。
所以构造文本:
因为0x2c2为706,所以buf首地址距离ebp寄存器为706字节,填充超过706就溢出;前691个90为机器空指令操作,紧接着15个字节恢复栈和赋值cookie指令,再4字节填充,最后4字节为buf最高跳转地址。
四、实验总结
这个实验有个地方有陷阱:
等级五那里恢复ebp寄存器的内容,刚开始我用的是0x32,但一直报错,仔细看了testn的代码后,发现只进行了0x18(%esp),所以构造恶意代码时,进行lea 0x18(%esp),%ebp操作。