堆攻击——House of Botcake
堆攻击——House of Botcake
QcN3ep介绍
House of Botcake 算是我第一个真正学会的 House of XXX 系列的攻击手段。它利用 glibc 堆管理器本身的设计缺陷来制造 double-free ,不仅非常精妙,而且方便使用、威力巨大。搭配 tcache poisoning 能够轻松制造任意写。
原理
虽然 glibc 在 2.29 为 tcache 添加了 double-free 检查,但是仅会检查
tcache 链表本身是否存在 double-free,而不会检查其他 bin 中是否存在 free
过的 chunk。
由于 tcache 本身的设计,这使得一个可以进入 tcache 的 chunk 必然可以进入
fast bin 或 unsorted bin。House of Botcake 利用这一点,将同一个 chunk
首先释放到 unsorted bin,之后再次释放到 tcache。成功实现
double-free。
条件
- House of botcake 需要程序能同时分配 10 个 chunk,且存在 UAF 漏洞或可以多次释放一个指针的漏洞。
- 需要
glibc >= 2.27,因为在此之前没有 tcache
利用
首先分配 7 个 chunk,一个攻击用 chunk vict和辅助用 chunk
prev,它们的大小都应当大于 fast bin 的上限且小于 tcache
的上限。之后再随意分配一个小堆块,防止释放的 chunk 与 top chunk
合并。
1 | for i in range(0, 7): |
之后依次释放分配的堆块,前七个 chunk 进入 tcache 并将其填满。
1 | for i in range(0, 7): |
之后释放 vict 和 prev ,此时它们只能进入
unsorted bin,之后触发合并成为一个大堆块。
1 | free(7) # vict #7 |
之后从 tcache 中分配出一个 chunk,使其产生一个空位。
1 | allocate(0x80) |
再次释放 vict ,此时 vict 同时存在于 tcache
和 unsorted bin 中,产生 double-free ,这里相当于 unsorted bin 和 tcache
重叠到了一起。
1 | free(7) # vict #7 |
这时我们再分配一个稍大于 vict 的 chunk ,由于 tcache
中没有符合要求的 chunk ,所以堆管理器会切分由 vict 和
prev 合成的 chunk ,这时我们就可以覆盖 vict 的
next 指针,进行 tcache poisoning。
1 | allocate(0x100) #9 |
例题
ISCTF 2025 ez_tcache
虽然官解并不是House of
Botcake,但是并不妨碍这道题成为一道优秀的板子题。
delete 函数里有 UAF 漏洞,我们按照利用流程走,在释放
vict 后,我们可以使用 show 一便把 libc
基地址泄露出来,之后劫持 __free_hook 成 system。
完整exp如下:
1 | from pwn import * |
