Fastbin Attack 学习
字数 2195 2025-08-24 16:48:16
Fastbin Attack 技术详解
1. Fastbin 基础概念
- Fastbin特性:
- 管理大小≤64B(32位系统)或≤128B(64位系统)的chunk
- 采用单链表结构(LIFO)
- 不改变chunk的
prev_inuse标志位,因此无法合并 - 释放时会检查链表的第一个chunk是否与当前chunk相同(防止double free)
2. Fastbin Attack 核心原理
Fastbin Attack利用堆溢出、UAF等漏洞篡改fastbin chunk的fd指针,使其指向目标内存地址。当malloc该chunk后再次malloc,即可将目标内存分配出来,实现任意地址写任意值。
3. 主要攻击技术
3.1 Double Free
原理:
- 通过释放同一个chunk两次,构造循环链表
- 绕过检查:释放顺序为A→B→A,避免直接检测到重复释放
关键点:
- 不能连续释放同一个chunk(会被检测)
- 需要构造A→B→A的释放顺序
3.2 House of Spirit
原理:
- 在目标位置伪造fastbin chunk并释放到链表中
- 后续malloc即可分配到伪造的chunk位置
伪造chunk要求:
- ISMMAP位不能为1
- 地址需要对齐(满足
MALLOC_ALIGN_MASK) - size大小需匹配对应的fastbin
- next chunk的size需满足:
2*SIZE_SZ ≤ size ≤ av->system_mem - 不能构成double free情况
3.3 Alloc to Stack
原理:
- 劫持fastbin链表中chunk的fd指针指向栈上地址
- 栈上需存在合法的size值
- 可实现控制返回地址等关键数据
3.4 Arbitrary Alloc
原理:
- 更通用的任意地址分配技术
- 只要目标地址存在合法的size域(可构造)
- 通过字节错位等方法绕过size检验
- 最终效果相当于任意地址写任意值
4. 实例分析
4.1 2015 9447 CTF: Search Engine
漏洞利用步骤:
-
泄露libc地址:
- 创建unsorted bin大小的chunk并释放
- 利用未初始化的指针泄露unsorted bin地址
- 计算libc基址:
libc_base = unsorted_addr - 0x3c4b78
-
构造Double Free:
- 分配三个相同大小的chunk(A,B,C)
- 释放顺序:C→B→A(形成A→B→C→NULL)
- 再次释放B构造循环链表(B→A→B→A...)
-
劫持__malloc_hook:
- 计算fake chunk地址:
fake_chunk_addr = main_arena - 0x33 - 利用字节错位构造合法size(0x7f)
- 通过find_fake_fast查找可用伪造地址
- 计算padding:
__malloc_hook - fake_chunk_addr = 0x23
- 计算fake chunk地址:
-
写入one_gadget:
- 分配chunk到__malloc_hook附近
- 写入one_gadget地址
- 触发malloc执行shell
4.2 0ctf2017 babyheap
两种利用方法:
方法一:通过fastbin劫持
- 分配多个fastbin chunk和一个small chunk
- 释放特定chunk构造fastbin链表
- 利用堆溢出修改fd指针指向目标地址
- 修复size域使检查通过
- 泄露libc地址(通过unsorted bin)
- 劫持__malloc_hook为one_gadget
方法二:通过unsorted bin泄露
- 分配多个unsorted bin大小的chunk
- 释放中间chunk进入unsorted bin
- 利用堆溢出扩大前一个chunk的size域
- 分配超大chunk包含被释放的chunk
- 修复size域后再次释放,泄露libc地址
- 通过fastbin attack劫持__malloc_hook
5. 关键调试技巧
-
pwndbg命令:
fastbin:查看fastbin状态find_fake_fast:查找可用的伪造chunk位置print (void*)&main_arena:获取main_arena地址print (void*)&__malloc_hook:获取__malloc_hook地址
-
libc偏移:
- main_arena偏移:0x3c4b20
- unsorted bin偏移:0x3c4b78
- __malloc_hook通常位于main_arena-0x10处
-
one_gadget常用地址:
- 0x45216
- 0x4526a
- 0xf02a4
- 0xf1147
6. 防御措施
- 对fastbin的fd指针进行完整性检查
- 加强double free检测机制
- 对size域的验证更加严格
- 使用安全版本的malloc实现
7. 扩展学习
建议进一步研究:
- tcache机制及其攻击方式
- unsorted bin attack
- large bin attack
- glibc新版本中的防护机制
通过深入理解fastbin attack,可以更好地掌握堆利用的基本原理,为学习更高级的堆利用技术打下坚实基础。