CSAPP——Attack Lab Report
Attack Lab
姓名:张**
学号:S********7
实验介绍
本报告为中科大研究生课程计算机系统Lab3——Attack Lab(参考CMU CSAPP Lab1 )的实验报告,主要记录实验 3 的攻击过程以及主要思考。通过本实验能过更加深刻的理解栈帧概念,机器及程序的控制与数据管理,并掌握利用栈溢出进行攻击以及汇编代码注入的能力。
实验环境
Lenovo Laptop
- CPU: AMD Ryzen 5 2.10GHz
- RAM: 16GB
- OS: Ubuntu 20.04
实验详解
Level 0: Candle
针对 getbuf 反汇编
1 | |
smoke函数地址0x8048e20,。GDB 调试发现,原本的 getbuf 返回地址存放在栈0xffffb54c。压栈存入%ebp栈指针为0xffffb548,0x08048fe3 <getbuf+3>,分配栈空间 24 个字节,栈指针为0xffffb530。缓冲区起始地址打印:
1 | |
从0xffffb53c覆盖到0xffffb54c,需要先填充 10 字节字符串内容,然后填充20,8e,04,08(小端机器),如果是 64 位机器则需要继续覆盖后面为 0.
所以我们需要构造字符串十六进制表示:
1 | |
./sendstring <exploit.txt> exploit-test.txt 使用工具构造输入。
实验结果:

Level 1: Sparker
和 Level 0 要求类似,这次要求返回到fizz函数并传入参数,反汇编结果如下:
1 | |
阅读fizz的反汇编可知,压入调用者旧%ebp,该位置也为覆盖的返回地址,此时应该为 fizz 的起始地址,%ebp+4存放的是正常调用 fizz 的返回地址,而参数的地址应该为%ebp+0x8的位置,我们只需要将自己的 cookie 放置在该位置即可。
所以我们需要构造字符串十六进制表示:
1 | |
实验结果:

注:在 32 位的程序里面,我们可以往返回地址后面写上 cookie 作为参数,但是 64 位程序前 6 个参数采用寄存器传参,那么要成功攻击就必须修改 rdi 寄存器的值为 cookie
做了一些额外的尝试 汇编注入编写如下汇编代码
1
2
3
4
5.code32
mov $0x2a2ef0cf, %edi
pushl $0x8048dc0
ret运行
gcc -m32 -c exploit-sparkler.s,以及objdump -d exploit-sparkler.o得到:
1
2
3
400000000 <.text>:
0: bf cf f0 2e 2a mov $0x2a2ef0cf,%edi
5: 68 c0 8d 04 08 push $0x8048dc0
a: c3 ret寻找栈指针,之前 Lab 0 已查看过,原本的 getbuf 返回地址存放在栈
0xffffb54c,压栈存入%ebp栈指针为0xffffb548构造
1
2
3bf cf f0 2e 2a 68 c0 8d
04 08 c3 00 00 00 00 00
3c b5 ff ff实验结果
从实验结果看,尝试的注入成功,也跳转到了构造的指令处,但是执行会报段错位(应该是 IA32 和 x84-64 的一些区别)
本实验完成的实验结果见上面栈填充的结果图
本博客所有文章除特别声明外,均采用 CC BY-SA 4.0 协议 ,转载请注明出处!
