额 今天做的事缓冲区 溢 出 攻 击 实验
思路就是有个函数会一直读字符串,可是对字符串长度没有限制,所以会造成缓冲区的溢出,导致堆栈中的其他值被我们修改,达到攻击的目的
实验资源
链接: https://pan.baidu.com/s/1_ORsf-vCkZlccIlGYT5QIQ
提取码: bg27
预备知识
gdb常见指令
run 执行
si 单步执行
b 设置断点,可以在函数调用时中断,即
b func1
或者在指定地址处中断,比如
b *0x12f3de
p 查看数据
p (char*)0x123fed 查看对应地址的字符串
p *0x30fed4@7,查看0x30fed4往后对应7个数字
查看寄存器
p $rdx
查看寻址结果
p *(0x3014fd) 或者 p *($rdx)
实验介绍
本实验设计为一个黑客利用缓冲区溢出技术进行攻击的游戏。我们仅给黑客(同学)提供一个二进制可执行文件bufbomb和部分函数的C代码,不提供每个关卡的源代码。程序运行中有3个关卡,每个关卡需要用户输入正确的缓冲区内容,否则无法通过关卡!
要求同学查看各关卡的要求,运用GDB调试工具和objdump反汇编工具,通过分析汇编代码和相应的栈帧结构,通过缓冲区溢出办法在执行了getbuf()函数返回时作攻击,使之返回到各关卡要求的指定函数中。
(关卡是平行的,即输入三种答案,得到三种结果,而不是输入答案123得到最终结果这样子)
攻击目标:
实验攻击目标的程序为bufbomb(可执行文件,需要用objdump反汇编为汇编代码查看)。该程序中含有一个带有漏洞的getbuf()函数,它所调用的系统函数gets()未进行缓冲区溢出保护。其代码如下:
int getbuf()
{
char buf[12];
Gets(buf);
return 1;
}
系统函数gets()从标准输入设备读字符串函数。以回车结束读取,不会判断上限,所以程序员应该确保buffer的空间足够大,以便在执行读操作时不发生溢出。