fastbin dup 一个变种打法的分析与思考
字数 2214 2025-08-29 08:30:30
Fastbin Dup 变种攻击技术分析与实践指南
1. 前言与背景
本技术文档详细分析了一种针对 libc 2.30 环境下受限制堆题的 fastbin dup 变种攻击方法。该方法在常规 fastbin dup 攻击受限的情况下(如禁止申请 0x70 字节 chunk),通过两轮 fastbin dup 操作控制 top 指针,绕过 libc 2.29 引入的安全检查,最终实现控制 malloc hook 的目标。
2. 题目环境与限制条件
2.1 环境配置
- 保护机制:全开(ASLR、NX、Canary 等)
- libc 版本:2.30
- 题目难度:HTB Challenge - Medium 级别
2.2 关键限制
- 内存申请限制:
- 只能申请小于 0x80 字节的 chunk
- 禁止申请 0x70 字节的 chunk
- 其他特性:
- 无 tcache 机制
- 存在 double-free 漏洞
- 无缓冲区溢出漏洞
3. 漏洞利用分析
3.1 信息泄露
在初始阶段,程序会要求输入一个短语:
- 使用未初始化的缓冲区,可通过输入超长字符串触发地址泄露
- 泄露的地址可用于计算 libc 基址
3.2 常规 fastbin dup 流程回顾
-
绕过 double-free 检查:
- 申请相同大小的 chunkA 和 chunkB
- 按顺序 A→B→A 释放,绕过检查(fastbin 只检查释放的 chunk 是否与链表第一个 chunk 相同)
-
获取重叠 chunk 并控制 fd 指针
-
寻找 fake chunk 并让 fd 指向它
-
申请 fake chunk 实现任意地址写入
- 通常使用 0x70 大小的 chunk 攻击 malloc hook 附近的 fake chunk
4. 变种攻击技术详解
4.1 常规方法受限原因
- 题目禁止申请 0x70 大小的 chunk,无法直接使用常规方法攻击 malloc hook
4.2 变种攻击思路
-
第一轮 fastbin dup:
- 在 arena 结构中伪造一个 fake fastbin chunk header
- 利用 arena 结构中 fastbins 头节点指针数组靠近 top chunk 指针的特性
-
第二轮 fastbin dup:
- 申请并覆盖 top 指针
- 需要绕过 libc 2.29 新增的 top chunk 安全检查
4.3 关键数据结构布局
main_arena 结构:
+-------------------+
| fastbins[] | # 头节点指针数组
| ... |
| top chunk pointer | # 靠近 fastbins 数组
| ... |
+-------------------+
4.4 绕过 libc 2.29 安全检查
- 新增检查:如果 top chunk 的 size 超过系统内存,会报错 "corrupted top size"
- 绕过方法:调整 top chunk 指针,使其指向一个 size 字段小于系统内存的位置(如 -0x24 的位置)
5. 攻击步骤详解
5.1 第一阶段:信息收集
- 通过初始输入泄露 libc 地址
- 计算关键偏移:
- malloc hook 地址
- main_arena 结构地址
- one_gadget 地址
5.2 第二阶段:双重 fastbin dup
-
第一次 fastbin dup:
- 创建 chunkA 和 chunkB
- 按 A→B→A 顺序释放,形成循环链表
- 修改 fd 指针指向 arena 结构中的特定位置
-
伪造 fake chunk:
- 在 arena 结构中构造合法的 fastbin chunk header
- 确保 size 字段符合 fastbin 要求
-
第二次 fastbin dup:
- 申请并获取对 arena 结构的控制权
- 修改 top chunk 指针指向精心计算的位置
5.3 第三阶段:控制流劫持
- 通过修改后的 top chunk 分配内存到 malloc hook 附近
- 覆写 malloc hook 为 one_gadget 地址
- 触发 malloc 调用获取 shell
6. 关键技术与注意事项
6.1 关键技术点
-
arena 结构利用:
- 利用 fastbins 数组与 top 指针的邻近关系
- 精心计算偏移,确保伪造的 chunk 能通过检查
-
双重 fastbin dup:
- 第一轮用于控制 arena 内部结构
- 第二轮用于修改 top 指针
-
安全检查绕过:
- 确保伪造的 top chunk size 字段合法
- 选择正确的偏移避免触发 "corrupted top size" 错误
6.2 注意事项
- 不同 libc 版本偏移可能不同,需精确计算
- 确保所有伪造的 chunk 头都符合分配器的合法性检查
- 操作顺序至关重要,错误的释放/申请顺序会导致利用失败
7. 防御措施
针对此类攻击,开发者可以采取以下防护措施:
- 及时清空释放后的指针
- 使用最新版本的 libc(已修复相关漏洞)
- 启用额外的堆保护机制(如 heap cookies)
- 限制用户申请特定大小的 chunk
8. 总结与扩展
本变种 fastbin dup 攻击提供了在受限环境下利用堆漏洞的新思路:
- 常规方法:利用 malloc hook 上方地址的 0x7f 作为 fake chunk,直接写 malloc hook
- 变种方法:通过操纵 arena 结构中的 top 指针,间接控制 malloc hook
这种技术展示了即使在某些限制条件下,攻击者仍可能通过深入理解内存分配器内部机制找到利用途径,强调了全面防御的重要性。