前言
写这个的目的就是想记录一下自己做过的东西,内容可能比较简单,不喜请略过.
写得比较详细,按步骤大概率可重复进行实验.
本次的内容是CSAPP上的实验Attack Lab.
部分参考了CSDN上的其他一些文章,感谢大佬们
实验环境
- MobaXterm
- Linux系统
- Objdump命令反汇编
- GDB调试工具
实验内容
准备阶段
(实验所需材料略)
- 先读一遍实验介绍文档,其中有基本步骤,包括c函数本来长什么样子之类的.
- 用
tar -xvf target30.tar
解压实验文件.
阶段1
- 从实验介绍中得知会运行test函数,然后调用getbuf,任务是在执行完getbuf函数之后执行touch1函数而不是继续执行test函数
- 先反汇编ctarget程序,储存为c.d
objdump -d ctarget > c.d
- 用vi查看c.d,找到getbuf和touch1函数
注意看816行,%rsp减了0x18也就是说缓存区大小为24;
824行,touch1函数的地址为0x4017d4;
这两个是关键信息,然后可以构造攻击字符串了:先输一堆无关的值把缓存区填满(为了简洁我们就用00来填充一个单元,共需24个00,为了便于计数每四个换个行),再在后面接上我们想要返回的地址,这样会溢出到缓存区外面,也就是读取返回地址的地方,即可调到touch1函数执行,构造完如图(命名为1.txt):
注意要遵循小端规则. - 再执行指令
./hex2raw <1.text >2.txt
把16进制串转换为字符(2.txt)
./ctarget < 2.txt
将2.txt输入到ctarget中,通过
阶段2
- 第二关的任务是执行touch2函数,然后还要传入我们的cookie
先找到touch2:
touch2的参数 val 存储于寄存器 %rdi ,我们要先跳转到一个地方执行一段代码,这段代码能够将寄存器 %rdi 的值设置为cookie,然后再跳转到 touch2执行。
第835行,touch2起始地址为0x401800。
那么要注入的汇编代码应该写成:(0x4bca8e48为cookie)
把这个文件储存为3.s - 执行指令
gcc -c 3.s -o 4.o
把源代码链接
执行指令objdump -d 4.o > 5.txt
反汇编4.o,储存为5.txt,如图:
这样就可以看到汇编指令对应的十六进制串了,这就是我们要注入的字符串 - 利用缓冲区溢出将返回地址修改为这段代码的起始地址,就能让程序执行注入的这段代码。内存中存储这段代码的地方便是 getbuf开辟的缓冲区(因为我们把传入这段代码的方式是让getbuf读取它,所以会存在这里),我们利用gdb查看此时缓冲区的起始地址(设断点、看寄存器):
可以看到%rsp地址为0x556489a8,就是要找的地址
4.结合第2,3步,构造如下:
1到4行是注入的代码的十六进制串,第七行是溢出的地址,接下来就与阶段1一样了,把这段代码变成字符串再输入到ctarget中就通过了
阶段3
- Touch3的汇编代码: