缓冲区溢出实验
实验目的
从硬件层面理解程序调用过程
理解操作系统为实现程序安全提供的保护
理解如何写出更加安全可靠的代码
实验内容
每人一个二进制程序attack
attack程序利用缓冲区溢出进行攻击
从exploit.txt中读取输入并执行
通过反汇编找到正确的输入,以实现对特定目标的攻击
实验步骤
-
打开gdb调试,在
test
函数设置断点。跟踪调试到Gets
函数,期间分析栈的存储情况,得到: -
并且得到
buf
字符串的存储位置0x7ffffffeddc0
,gdb
调试截图如下: -
可以看出
buf
在栈中最多可以存储40个字节,超出后的结果会覆盖test
函数的返回地址。将其设置为touch1
函数的入口地址0x8001549
。 -
结果在
vscode
中报错,而在powershell
中产生了段错误。通过在群里提问,得知地址应该设置为0x8001553
,跳过指令sub 0x8 %esp
,否则会执行该指令会产生栈顶的位置错误。touch1
函数如下:0000000000001549 <touch1>: 1549: f3 0f 1e fa endbr64 154d: 50 push %rax 154e: 58 pop %rax 154f: 48 83 ec 08 sub $0x8,%rsp 1553: 48 8d 3d b0 0b 00 00 lea 0xbb0(%rip),%rdi # 210a <_IO_stdin_used+0x10a> 155a: e8 71 fb ff ff callq 10d0 <puts@plt> 155f: bf 00 00 00 00 mov $0x0,%edi 1564: e8 b7 fb ff ff callq 1120 <exit@plt>
-
在
powershell
中 执行成功。
实验总结
- 实验的关键使用
gdb
在于分析栈中的存储内容,得到读取的buf
字符串的存储位置和最大存储长度。然后设置攻击字符串,使得touch1
函数的执行地址覆盖到栈中的一个RetAddr
,使得执行该函数的字符串输出函数。注意跳过该函数中的对%esp
减8的操作,使得不对栈的结构产生改变,触发段错误。 - 本次的实验,开始的时候,我花了大量时间分析
Gets
函数中的内容,没有对栈中的内容进行实时的分析,导致思路混乱,应该反思。而且对汇编指令不够熟悉,导致在分析的时候进度缓慢。