深入理解 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 核心思想
- 构造 overlapping chunks: 通过特定的分配和释放顺序,创建重叠的内存块
- 绕过 tcache key 检查: 利用 unsorted bin 和 tcache 之间的交互来绕过保护
- 实现 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内容
利用过程:
- 填充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堆管理机制
- 各种保护机制的工作原理
- 精确控制堆布局的能力
通过精心构造的堆操作序列,可以绕过多种现代保护机制,最终实现任意地址写或代码执行。