Tcache Bin Attack
Reading time: 7 minutes
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。
Basic Information
有关 Tcache bin 的更多信息,请查看此页面:
首先,请注意 Tcache 是在 Glibc 版本 2.26 中引入的。
Tcache attack(也称为 Tcache poisoning)在 guyinatuxido page 中提出,与快速 bin 攻击非常相似,其目标是在已释放的 chunk 中覆盖指向下一个 chunk 的指针,以指向一个任意地址,以便后续可以分配该特定地址并可能覆盖指针。
然而,如今,如果运行上述代码,您将收到错误:malloc(): unaligned tcache chunk detected
。因此,需要在新指针中写入一个对齐的地址(或执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
Tcache indexes attack
通常可以在堆的开头找到一个 chunk,其中包含 每个索引的 chunk 数量 和 每个 tcache 索引的头 chunk 地址。如果出于某种原因可以修改此信息,则可以使某个索引的头 chunk 指向所需地址(如 __malloc_hook
),然后分配一个与索引大小相同的 chunk,并在这种情况下覆盖 __malloc_hook
的内容。
Examples
- CTF https://guyinatuxedo.github.io/29-tcache/dcquals19_babyheap/index.html
- Libc info leak:可以填充 tcaches,将一个 chunk 添加到未排序列表中,清空 tcache,然后仅覆盖前 8B 从未排序 bin 中重新分配该 chunk,使得第二个地址保持不变,以便我们可以读取它。
- Tcache attack:该二进制文件易受 1B 堆溢出攻击。这将被滥用以更改已分配 chunk 的 size header 使其变大。然后,这个 chunk 将被 释放,将其添加到假大小的 tcache 中。接着,我们将分配一个假大小的 chunk,之前的 chunk 将被 返回,知道这个 chunk 实际上更小,这为覆盖内存中的下一个 chunk提供了机会。
我们将利用这一点覆盖下一个 chunk 的 FD 指针,使其指向malloc_hook
,然后可以分配 2 个指针:首先是我们刚刚修改的合法指针,然后第二次分配将返回一个在malloc_hook
中的 chunk,可以利用它写入 one gadget。 - CTF https://guyinatuxedo.github.io/29-tcache/plaid19_cpp/index.html
- Libc info leak:存在使用后释放和双重释放。在这篇文章中,作者通过读取放置在小 bin 中的 chunk 的地址泄露了 libc 的地址(就像从未排序 bin 中泄露,但来自小 bin)。
- Tcache attack:通过 双重释放 执行 Tcache。相同的 chunk 被释放两次,因此在 Tcache 中,chunk 将指向自身。然后,它被分配,其 FD 指针被修改为指向 free hook,然后再次分配,因此列表中的下一个 chunk 将在 free hook 中。然后,这也被分配,可以在这里写入
system
的地址,因此当包含"/bin/sh"
的 malloc 被释放时,我们获得一个 shell。 - CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps0/index.html
- 这里的主要漏洞是通过指示其偏移量来
free
堆中的任何地址的能力。 - Tcache indexes attack:可以分配和释放一个大小的 chunk,当存储在 tcache chunk 中(包含 tcache bins 信息的 chunk)时,将生成一个 值为 0x100 的地址。这是因为 tcache 在不同字节中存储每个 bin 的 chunk 数量,因此一个特定索引中的 chunk 生成值 0x100。
- 然后,这个值看起来像是一个大小为 0x100 的 chunk。允许通过
free
这个地址来滥用它。这将将该地址添加到 tcache 中大小为 0x100 的 chunk 的索引。 - 然后,分配一个大小为 0x100 的 chunk,之前的地址将作为 chunk 返回,允许覆盖其他 tcache 索引。
例如,将 malloc hook 的地址放入其中一个索引中,并分配与该索引大小相同的 chunk 将获得一个在 calloc hook 中的 chunk,这允许写入一个 gadget 以获得 shell。 - CTF https://guyinatuxedo.github.io/44-more_tcache/csaw19_popping_caps1/index.html
- 与之前相同的漏洞,但有一个额外的限制。
- Tcache indexes attack:与之前类似的攻击,但通过 释放包含 tcache 信息的 chunk 来减少步骤,因此其地址被添加到其大小的 tcache 索引中,因此可以分配该大小并将 tcache chunk 信息作为 chunk 获取,这允许将 free hook 添加为一个索引的地址,分配它,并在其上写入一个 gadget。
- Math Door. HTB Cyber Apocalypse CTF 2023
- Write After Free 以将数字添加到
fd
指针。 - 在这个挑战中需要大量的 heap feng-shui。这篇文章展示了 控制 Tcache 空闲列表的头部是多么方便。
- 通过
stdout
的 Glibc leak(FSOP)。 - Tcache poisoning 以获得任意写入原语。
tip
学习和实践 AWS 黑客技术:HackTricks Training AWS Red Team Expert (ARTE)
学习和实践 GCP 黑客技术:HackTricks Training GCP Red Team Expert (GRTE)
支持 HackTricks
- 查看 订阅计划!
- 加入 💬 Discord 群组 或 Telegram 群组 或 在 Twitter 🐦 上关注我们 @hacktricks_live.
- 通过向 HackTricks 和 HackTricks Cloud GitHub 仓库提交 PR 来分享黑客技巧。