深入理解 House of Botcake 堆利用手法
字数 1778 2025-08-06 21:48:53

House of Botcake 堆利用手法深入解析

1. House of Botcake 概述

House of Botcake 是一种针对 glibc 堆管理器的利用技术,主要应用于存在 Use-After-Free (UAF) 漏洞的场景。该技术通过精心构造的堆块布局和操作,最终实现任意地址写或代码执行的目的。

1.1 适用条件

  • 存在 Use-After-Free 漏洞
  • 能够进行多次分配和释放堆块
  • 可以控制被释放堆块的内容(如通过 UAF)

1.2 技术特点

  • 结合了 double free 和 tcache poisoning 技术
  • 适用于 glibc 2.32 及以上版本
  • 可以绕过 tcache key 和 safe-linking 保护机制

2. 技术原理详解

2.1 前置知识

2.1.1 glibc 堆管理机制

  • tcache: 线程本地缓存,单链表结构,每个 bin 最多存放 7 个相同大小的 chunk
  • fastbin: 单链表结构,LIFO 顺序
  • small/large bin: 双向链表结构
  • unsorted bin: 释放的 chunk 首先进入这里

2.1.2 关键保护机制

  • tcache key: 从 glibc 2.32 开始,tcache 增加了 key 字段用于检测 double free
  • safe-linking: 指针加密机制,防止直接篡改堆指针

2.2 House of Botcake 核心思想

  1. 构造 overlapping chunks: 通过特定的分配和释放顺序,创建重叠的内存块
  2. 绕过 tcache key 检查: 利用 unsorted bin 和 tcache 之间的交互来绕过保护
  3. 实现 tcache poisoning: 最终控制 tcache 链表实现任意地址分配

2.3 详细步骤

步骤 1: 初始堆布局

# 假设可以分配多个不同大小的chunk
chunk_A = malloc(0x100)  # 后续用于触发合并
chunk_B = malloc(0x100)  # 将被double free的chunk
chunk_C = malloc(0x100)  # 防止与top chunk合并

步骤 2: 填充 tcache

# 填充tcache bin,使得后续释放的chunk不会进入tcache
for i in range(7):
    temp = malloc(0x100)
    free(temp)  # 这些chunk会进入tcache

步骤 3: 关键释放操作

free(chunk_A)   # 进入unsorted bin
free(chunk_B)   # 进入tcache (因为tcache未满)
free(chunk_A)   # double free chunk_A,但由于在unsorted bin中,不会立即检测到

步骤 4: 重新分配触发合并

malloc(0x1a0)   # 分配比chunk_A大的空间,触发合并
                # 现在chunk_B被认为是free状态但实际上被合并了

步骤 5: 实现 tcache poisoning

# 现在可以修改chunk_B的fd指针
# 由于safe-linking,需要加密目标地址
target = 0xdeadbeef
encrypted = ((target >> 12) ^ target)
# 通过UAF修改chunk_B的fd
chunk_B->fd = encrypted

步骤 6: 分配到目标地址

# 清空tcache
for i in range(7):
    malloc(0x100)

victim = malloc(0x100)  # 正常分配
victim = malloc(0x100)  # 将分配到目标地址

3. 实际案例分析

3.1 JustCTF2022 例题分析

漏洞点:

  • UAF漏洞,可以释放后继续使用chunk
  • 可以控制释放的chunk内容

利用过程:

  1. 填充tcache bin
  2. 释放两个相邻chunk到unsorted bin
  3. 触发合并创建重叠chunk
  4. 修改tcache fd指针
  5. 分配得到任意地址写能力

3.2 CISCN2022 华东北赛区例题分析

保护机制:

  • Full RELRO
  • NX enabled
  • Stack Canary
  • glibc 2.33

利用技巧:

  1. 利用文件I/O缓冲区创建大chunk
  2. 通过特定大小分配触发合并
  3. 结合stdout结构体泄露libc地址
  4. 最后使用House of Botcake实现任意写

4. 防御与绕过技巧

4.1 常见防御措施

  1. tcache key检查: 检测double free
  2. safe-linking: 加密堆指针
  3. size检查: 验证chunk大小合理性

4.2 绕过方法

  1. 利用unsorted bin合并: 绕过tcache key检查
  2. 精确计算加密指针: 绕过safe-linking
  3. 构造合理size字段: 通过重叠chunk伪造size

5. 扩展与变种

5.1 结合其他利用技术

  • 与FSOP结合: 通过修改文件结构体实现更稳定利用
  • 与large bin attack结合: 实现更灵活的写操作

5.2 不同glibc版本的适配

  • glibc 2.32-2.34: 需要处理safe-linking
  • glibc 2.35+: 可能需要额外技巧绕过新增保护

6. 实践练习建议

  1. 在libc 2.32环境下搭建实验环境
  2. 使用pwntools编写自动化利用脚本
  3. 通过gdb调试观察每一步堆状态变化
  4. 尝试修改关键步骤理解其必要性

7. 总结

House of Botcake是一种高效的堆利用技术,特别适用于现代glibc版本。掌握该技术需要深入理解:

  • glibc堆管理机制
  • 各种保护机制的工作原理
  • 精确控制堆布局的能力
    通过精心构造的堆操作序列,可以绕过多种现代保护机制,最终实现任意地址写或代码执行。
House of Botcake 堆利用手法深入解析 1. House of Botcake 概述 House of Botcake 是一种针对 glibc 堆管理器的利用技术,主要应用于存在 Use-After-Free (UAF) 漏洞的场景。该技术通过精心构造的堆块布局和操作,最终实现任意地址写或代码执行的目的。 1.1 适用条件 存在 Use-After-Free 漏洞 能够进行多次分配和释放堆块 可以控制被释放堆块的内容(如通过 UAF) 1.2 技术特点 结合了 double free 和 tcache poisoning 技术 适用于 glibc 2.32 及以上版本 可以绕过 tcache key 和 safe-linking 保护机制 2. 技术原理详解 2.1 前置知识 2.1.1 glibc 堆管理机制 tcache : 线程本地缓存,单链表结构,每个 bin 最多存放 7 个相同大小的 chunk fastbin : 单链表结构,LIFO 顺序 small/large bin : 双向链表结构 unsorted bin : 释放的 chunk 首先进入这里 2.1.2 关键保护机制 tcache key : 从 glibc 2.32 开始,tcache 增加了 key 字段用于检测 double free safe-linking : 指针加密机制,防止直接篡改堆指针 2.2 House of Botcake 核心思想 构造 overlapping chunks : 通过特定的分配和释放顺序,创建重叠的内存块 绕过 tcache key 检查 : 利用 unsorted bin 和 tcache 之间的交互来绕过保护 实现 tcache poisoning : 最终控制 tcache 链表实现任意地址分配 2.3 详细步骤 步骤 1: 初始堆布局 步骤 2: 填充 tcache 步骤 3: 关键释放操作 步骤 4: 重新分配触发合并 步骤 5: 实现 tcache poisoning 步骤 6: 分配到目标地址 3. 实际案例分析 3.1 JustCTF2022 例题分析 漏洞点 : UAF漏洞,可以释放后继续使用chunk 可以控制释放的chunk内容 利用过程 : 填充tcache bin 释放两个相邻chunk到unsorted bin 触发合并创建重叠chunk 修改tcache fd指针 分配得到任意地址写能力 3.2 CISCN2022 华东北赛区例题分析 保护机制 : Full RELRO NX enabled Stack Canary glibc 2.33 利用技巧 : 利用文件I/O缓冲区创建大chunk 通过特定大小分配触发合并 结合stdout结构体泄露libc地址 最后使用House of Botcake实现任意写 4. 防御与绕过技巧 4.1 常见防御措施 tcache key检查 : 检测double free safe-linking : 加密堆指针 size检查 : 验证chunk大小合理性 4.2 绕过方法 利用unsorted bin合并 : 绕过tcache key检查 精确计算加密指针 : 绕过safe-linking 构造合理size字段 : 通过重叠chunk伪造size 5. 扩展与变种 5.1 结合其他利用技术 与FSOP结合 : 通过修改文件结构体实现更稳定利用 与large bin attack结合 : 实现更灵活的写操作 5.2 不同glibc版本的适配 glibc 2.32-2.34 : 需要处理safe-linking glibc 2.35+ : 可能需要额外技巧绕过新增保护 6. 实践练习建议 在libc 2.32环境下搭建实验环境 使用pwntools编写自动化利用脚本 通过gdb调试观察每一步堆状态变化 尝试修改关键步骤理解其必要性 7. 总结 House of Botcake是一种高效的堆利用技术,特别适用于现代glibc版本。掌握该技术需要深入理解: glibc堆管理机制 各种保护机制的工作原理 精确控制堆布局的能力 通过精心构造的堆操作序列,可以绕过多种现代保护机制,最终实现任意地址写或代码执行。