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要求

  1. ISMMAP位不能为1
  2. 地址需要对齐(满足MALLOC_ALIGN_MASK
  3. size大小需匹配对应的fastbin
  4. next chunk的size需满足:2*SIZE_SZ ≤ size ≤ av->system_mem
  5. 不能构成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

漏洞利用步骤

  1. 泄露libc地址

    • 创建unsorted bin大小的chunk并释放
    • 利用未初始化的指针泄露unsorted bin地址
    • 计算libc基址:libc_base = unsorted_addr - 0x3c4b78
  2. 构造Double Free

    • 分配三个相同大小的chunk(A,B,C)
    • 释放顺序:C→B→A(形成A→B→C→NULL)
    • 再次释放B构造循环链表(B→A→B→A...)
  3. 劫持__malloc_hook

    • 计算fake chunk地址:fake_chunk_addr = main_arena - 0x33
    • 利用字节错位构造合法size(0x7f)
    • 通过find_fake_fast查找可用伪造地址
    • 计算padding:__malloc_hook - fake_chunk_addr = 0x23
  4. 写入one_gadget

    • 分配chunk到__malloc_hook附近
    • 写入one_gadget地址
    • 触发malloc执行shell

4.2 0ctf2017 babyheap

两种利用方法

方法一:通过fastbin劫持

  1. 分配多个fastbin chunk和一个small chunk
  2. 释放特定chunk构造fastbin链表
  3. 利用堆溢出修改fd指针指向目标地址
  4. 修复size域使检查通过
  5. 泄露libc地址(通过unsorted bin)
  6. 劫持__malloc_hook为one_gadget

方法二:通过unsorted bin泄露

  1. 分配多个unsorted bin大小的chunk
  2. 释放中间chunk进入unsorted bin
  3. 利用堆溢出扩大前一个chunk的size域
  4. 分配超大chunk包含被释放的chunk
  5. 修复size域后再次释放,泄露libc地址
  6. 通过fastbin attack劫持__malloc_hook

5. 关键调试技巧

  1. pwndbg命令

    • fastbin:查看fastbin状态
    • find_fake_fast:查找可用的伪造chunk位置
    • print (void*)&main_arena:获取main_arena地址
    • print (void*)&__malloc_hook:获取__malloc_hook地址
  2. libc偏移

    • main_arena偏移:0x3c4b20
    • unsorted bin偏移:0x3c4b78
    • __malloc_hook通常位于main_arena-0x10处
  3. one_gadget常用地址

    • 0x45216
    • 0x4526a
    • 0xf02a4
    • 0xf1147

6. 防御措施

  1. 对fastbin的fd指针进行完整性检查
  2. 加强double free检测机制
  3. 对size域的验证更加严格
  4. 使用安全版本的malloc实现

7. 扩展学习

建议进一步研究:

  • tcache机制及其攻击方式
  • unsorted bin attack
  • large bin attack
  • glibc新版本中的防护机制

通过深入理解fastbin attack,可以更好地掌握堆利用的基本原理,为学习更高级的堆利用技术打下坚实基础。

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 写入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,可以更好地掌握堆利用的基本原理,为学习更高级的堆利用技术打下坚实基础。