写在前面:
上交的实验报告需要包含账户的姓名全拼以及学号,本报告的相应部分已经打码处理,请在自己的环境中完成实验!
一、 实验目的:
1. 理解程序函数调用中参数传递机制;
2. 掌握缓冲区溢出攻击方法;
3. 进一步熟练掌握GDB调试工具和objdump反汇编工具。
二、实验环境:
1. 计算机(Intel CPU)
2. Linux 64位操作系统
3. GDB调试工具
4. objdump反汇编工具
三、实验方法与步骤:
本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过关卡!
要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。第一关只需要返回到指定函数,第二关不仅返回到指定函数还需要为该指定函数准备好参数,最后一关要求在返回到指定函数之前执行一段汇编代码完成全局变量的修改。
本实验要求解决关卡1、2、3,给出实验思路,通过截图把实验过程和结果写在实验报告上。
四、实验过程及内容:
准备工作:
首先在desktop目录下新建一个文件夹experiment_4用于保存本实验的所有文件。从网站上下载实验所需文件,并将其存入此文件夹中。
接着在root权限下输入命令:apt-get install lib32ncurses5-dev,安装一个32位的库。
再使用命令:apt install sendmail,安装sendmail。
接下来即可开始实验:
首先使用反汇编指令查看getbuf函数的汇编代码:
图:getbuf函数的汇编代码
由图可知,函数首先将%ebp的值存入栈中,接着使用%ebp保存当前的栈指针%esp。接下来将%esp减去0x28,为栈分配空间。接下来将%eax赋值为%ebp的值-18,也就是初始栈指针的位置-18,以此作为字符数组buf的起点。最后将%eax的值存入栈中,调用gets函数。