my CSAPP Attack lab堆栈详解

本文详细解析了CSAPP(深入理解计算机系统)的Attack Lab,涵盖Code Injection Attacks的Phase 1, 2, 3以及Return-Oriented Programming的Phase 4和5。通过GDB调试,介绍了如何构造注入代码、找到关键地址和利用堆栈来实现攻击。作者还分享了在不同阶段的命令行操作和思考过程。" 111600115,10338328,Web应用系统功能测试详解,"['Web测试', '软件测试', '功能验证', '链接检查', '表单提交']

关注公号【逆向通信猿】更精彩!!!

这个实验时学习了简书上的一篇文章后,自己根据课程例子进行的一次小测试,phase 4和5的堆栈图解还没有画,等后续有时间会进行补充。

本人转载的简书原文:
https://blog.youkuaiyun.com/wlwdecs_dn/article/details/121249364#comments_19237060

一、Part I: Code Injection Attacks

Phase 1

在这里插入图片描述

root@itcast:/projects/attacklab/target51# gdb ctarget

(
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` 编辑) ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

codersnote

对学生党 赞赏是鼓励也是鞭策!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值