一、 实验目标
- 理解程序函数调用中参数传递机制;
- 掌握缓冲区溢出攻击方法;
- 进一步熟练掌握GDB调试工具和objdump反汇编工具。
二、实验环境
- 计算机(Intel CPU)
- Linux 64位操作系统
- GDB调试工具
- objdump反汇编工具
三、实验内容
本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过关卡!
要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。
实验代码bufbomb和相关工具(sendstring/makecookie)的更详细内容请参考“实验四 缓冲区溢出攻击实验.pptx”。
本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。
四、实验步骤和结果
1.安装32位的lib库
安装sendmail
生成反汇编文件并查看
查看getbuf函数
(1)返回到smoke函数
由getbuf汇编代码可知该函数没有缓冲区溢出保护,使用gdb调试。
在getbuf函数设置断点并运行
逐步调试,得知buf首元素地址为ebp-0x18。
返回地址的首地址是ebp+0x04
两个位置相差28字节,因此构造28个任意字符,然后加上smoke()的地址,就能准确覆盖到”返回地址”,完成溢出攻击返回到smoke()。新建0.txt文件。
输入符合条件的字符串
成功实现要求
(2)返回到fizz()并准备相应参数
观察fizz函数汇编代码
发现fizz函数取了ebp+0x8地址中的值与0x804a1d4中的内容进行比较。因此,设置断点查看此处内容。
用makecookie生成自己的cookie值
为了返回到fizz函数中,同样先准备56个任意字符填充,然后加上fizz函数的首地址。另外,因为在fizz函数中取的是ebp+0x8地址中的值,而每个字节需要使用两个字符填充,因此再添加8个0,最后添加cookie的小端表示的值。
成功实现要求
(3)返回到bang()且修改global_value
在root权限下关闭内存地址随机化
观察bang函数汇编代码
发现bang函数在比较0x804a1c4和0x804a1d4的内容,若相同则通关。使用gdb调试查看:
可知0x804a1c4是全局变量global_value地址,0x804a1d4是cookie地址。我们只需在代码中,把地址0x804a1d4的内容存到地址0x804a1c4即可。通过反汇编,可以获得bang()函数的入口地址为0x08048e10。
新建1.s文件
转换为机器代码
修改字符串为自己写的汇编代码生成的机器码(20个字符)+8个任意字符+buf数组的首地址。
运行程序
满足要求
五、实验总结与体会
通过此次实验,理解了程序函数调用中参数传递机制;掌握了缓冲区溢出攻击方法;进一步熟练掌握了GDB调试工具和objdump反汇编工具。
(by 归忆)