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

从零到一:AttackLab缓冲区溢出攻击实战全解析

1. 缓冲区溢出攻击基础入门

第一次接触缓冲区溢出攻击时,我完全被那些专业术语吓到了。什么栈帧、返回地址、ROP链,听起来就像天书一样。但当我真正动手操作后才发现,这些概念其实就像搭积木一样简单直观。

缓冲区溢出本质上就是"数据装多了"。想象你有一个容量固定的水杯(缓冲区),如果一直往里倒水(输入数据),超过容量的部分就会溢出来,流到不该去的地方。在计算机中,这个"不该去的地方"往往就是存储着关键程序信息的内存区域。

AttackLab实验中的getbuf函数就是典型的缓冲区漏洞案例:

unsigned getbuf() { char buf[BUFFER_SIZE]; Gets(buf); return 1; }

这个函数使用不安全的Gets方法读取输入,它不会检查输入长度是否超过缓冲区大小(BUFFER_SIZE)。就像服务员不问你要多少水,直接往杯子里倒,直到你说停为止 - 但攻击者永远不会说"停"。

在x86-64架构中,栈是从高地址向低地址增长的。当函数被调用时,会在栈上分配空间存储局部变量(如buf),然后是保存的寄存器值,最后是返回地址。攻击者精心构造的超长输入可以覆盖这个返回地址,从而控制程序执行流程。

我第一次尝试phase1时,用objdump反汇编ctarget:

objdump -S ctarget > ctarget.s

在ctarget.s中查找getbuf函数,发现它分配了0x28(40)字节的缓冲区空间。这意味着我们需要构造一个至少48字节的字符串(40字节填满缓冲区 + 8字节覆盖返回地址)。

2. 阶段一:最简单的返回地址劫持

phase1是整个实验的"Hello World",它教会我们最基本的攻击模式 - 通过溢出修改返回地址。目标是将getbuf的返回地址从原本的test函数改为touch1函数。

具体操作就像玩填字游戏:

  1. 先用40个任意字符填满buf缓冲区(我习惯用00)
  2. 接着写入touch1的地址000000000040185d
  3. 注意x86是小端序,所以要倒着写:5d 18 40 00 00 00 00 00

把这段十六进制码保存为phase_1.txt,然后用实验提供的hex2raw工具转换:

./hex2raw < phase_1.txt > test.txt ./ctarget < test.txt -q

看到"Touch1!: You called touch1"的瞬间,我激动得差点从椅子上跳起来。这种亲手操控程序执行流程的感觉,比看十篇理论文章都来得深刻。

调试时有个实用技巧:在gdb中设置断点观察栈变化

gdb ./ctarget (gdb) break *getbuf (gdb) run -q < test.txt (gdb) x/20x $rsp

这个命令可以查看栈内存的前20个字,能清晰看到我们的攻击字符串是如何覆盖返回地址的。

3. 阶段二:注入可执行代码

phase2增加了难度要求:不仅要跳转到touch2,还要传递参数。这就需要在栈上注入可执行代码,就像在数据区偷偷藏了个小程序。

x86-64架构中,第一个参数通过rdi寄存器传递。所以我们的攻击代码需要:

  1. 将cookie值(如0x5134f5ad)存入rdi
  2. 跳转到touch2(地址000000000040188b)

汇编代码attack1.s大致长这样:

mov $0x5134f5ad, %rdi push $0x40188b ret

编译后用objdump查看机器码:

gcc -c attack1.s objdump -d attack1.o

关键是要确定这段代码在栈上的位置。通过gdb调试,在getbuf函数内打印$rsp的值就是buf的起始地址。把这个地址作为返回地址,程序就会执行我们注入的代码。

这里有个坑:现代系统默认开启了NX(不可执行栈)保护,但ctarget特意关闭了这个保护,所以我们的代码才能执行。实际环境中这种直接注入代码的方式已经很难奏效了。

4. 阶段三:传递字符串参数

phase3要求传递字符串形式的cookie作为参数。这就像phase2的升级版,需要考虑字符串存储位置和内存布局。

首先要把cookie 0x5134f5ad转换成ASCII码:35 31 33 34 66 35 61 64(注意末尾还要加\0)。字符串可以放在getbuf的栈帧上方,也就是test的栈帧里,这样不会被后续操作覆盖。

攻击代码需要:

  1. 计算字符串地址(通常是getbuf的rsp + 偏移量)
  2. 将地址存入rdi
  3. 跳转到touch3

通过gdb调试,我发现test的栈帧起始于getbuf的rsp+0x28。所以字符串可以放在rsp+0x30处,对应的攻击代码:

mov $0x5562fce8, %rdi # 字符串地址 push $0x4019a2 # touch3地址 ret

这个阶段最考验耐心,因为地址计算必须精确到字节。我失败了七八次才发现问题出在字符串末尾忘了加\0终止符。

5. ROP攻击原理与实践

phase4和phase5引入了ROP(Return-Oriented Programming)技术,这是现代绕过NX保护的经典方法。它就像用乐高积木拼装程序 - 从现有代码中找出有用的片段(gadget),通过ret指令把它们串起来。

每个gadget通常以ret(0xc3)结尾,形如:

58 pop %rax c3 ret

这样的代码片段可以从farm.c提供的机器码中挖掘。使用objdump反汇编rtarget后,在start_farm和end_farm之间搜索:

  1. 首先找pop %rax的gadget(机器码58 c3)
  2. 然后找mov %rax,%rdi的gadget(48 89 c7 c3)
  3. 最后跳转到touch2

构造ROP链就像写购物清单:

[填充40字节] [gadget1地址] # pop %rax [cookie值] # 会被pop到rax [gadget2地址] # mov %rax,%rdi [touch2地址]

实际调试时,我花了三小时才找到可用的gadget组合。关键技巧是在gdb中单步执行,观察每个gadget执行后寄存器的变化。

6. 高级ROP链构造技巧

phase5是终极挑战,需要构造更复杂的ROP链来传递字符串参数。由于ASLR(地址随机化)的关系,我们无法直接知道字符串在栈上的绝对地址,必须通过相对计算得到。

解决方案是:

  1. 用mov %rsp,%rax获取当前栈指针
  2. 通过加法计算字符串偏移量(lea指令)
  3. 最终传递到rdi

从farm中挖掘的gadget链如下:

401ad1: mov %rsp,%rax 401a82: lea (%rdi,%rsi,1),%rax # 需要设置rsi为偏移量 401a4d: mov %rax,%rdi

字符串偏移量需要精心计算。在我的实验中,字符串距离rsp初始位置0x37字节,所以构造:

[填充40字节] [gadget1] # mov %rsp,%rax [gadget2] # lea (%rdi,%rsi,1),%rax [占位符] # 实际是pop %rsi的gadget [0x37] # 偏移量 [gadget3] # mov %rax,%rdi [cookie字符串]

这个阶段让我深刻理解了ROP的精髓 - 就像玩俄罗斯方块,要把各种形状的gadget完美拼接,才能达成目标。每次失败后调整gadget顺序和参数的过程,就是对计算机系统理解不断加深的过程。

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

相关文章:

  • ChatGPT Plus深度解析:上下文、模型调度与文件解析的技术真相
  • 从RoboCup到智能工厂:仙工SRC控制器的进化之路与生态构建
  • 2026东莞黄金回收门店,哪家价更高回款更稳测评 - 名奢变现站
  • 闲置黄金奢品变现怎么选?5家本地靠谱回收机构横向深度对比 - 奢品小当家
  • 2026白城本地连锁黄金回收,承接铂金回收白银银条回收业务+公安备案门店 - 信誉隆金银铂奢回收
  • 2026重庆黄金回收权重榜单|收的顶综合分值断层领跑 - 奢侈品回收测评
  • 从平面到立体:Adobe Dimension如何成为PS/AI设计师的3D捷径
  • 选对缠绕包装机直销厂家:沃锐智能的“3大核心+5步筛选法”,专业的缠绕包装机哪个好 - 品牌推荐师
  • 2026延安黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 2019年CSP-X复赛真题及题解(T1:随机数)
  • 2026年天津黄金回收避坑指南:不迷信连锁看本地口碑 - 讯息早知道
  • 超强的资源搜索神器,附带去水印高清下载功能!
  • 告别Windows臃肿:用Win11Debloat让你的电脑重获新生
  • StarUML Java插件:3步实现UML与Java代码的双向同步
  • 2026大理放心贵金属回收,CCIC 中检授权收黄金回收铂金回收白银回收持证实体门店 - 中业金奢再生回收中心
  • 阿克苏地区黄金回收实体店怎么选?这份清单帮你货比三家 - 奢金汇
  • 3分钟快速上手BepInEx:让Unity游戏模组开发变得简单
  • 2026佛山黄金回收测评!横向对比5家靠谱门店,老手推荐 - 奢侈品回收测评
  • 阿拉善盟黄金回收去哪儿好?整理了5家靠谱实体店地址电话 - 奢金汇
  • WarcraftHelper魔兽辅助工具:终极指南让经典魔兽争霸3焕发新生
  • 2026 宁波闲置名包处置全测评:正规连锁门店横向对比,看懂皮具估价底层逻辑 - 奢侈品回收评测
  • 渭南黄金回收指南:六家靠谱店铺推荐,覆盖全市区县安心变现 - 清奢黄金上门回收
  • 物联网LoRa系列-24:SX1261/2射频芯片寄存器配置实战——从零构建稳定收发链路
  • 体外纯化体系对SPR检测的重要性
  • 2026西宁黄金回收白银回收铂金回收门店+工商公安双备案+中检认证商家推荐 - 诚金汇钻回收公司
  • 如何用163MusicLyrics彻底解决音乐歌词管理难题:一个开源工具的完整指南
  • 深圳黄金回收实测指南,六大本地奢品门店走访测评 - 薛定谔的梨花猫
  • 2026东营放心贵金属回收,CCIC 中检授权收黄金回收铂金回收白银回收持证实体门店 - 中业金奢再生回收中心
  • 2026潮州放心贵金属回收,CCIC 中检授权收黄金回收铂金回收白银回收持证实体门店 - 中业金奢再生回收中心
  • TC818A芯片实战指南:集成运放配置、电阻选型与LCD驱动优化