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 协议 ,转载请注明出处!