Tcache Bin Attack
基本信息
有关 Tcache bin 是什么,请查看此页面:
首先,请注意 Tcache 是在 Glibc 版本 2.26 中引入的。
Tcache 攻击(也称为 Tcache 毒化)在 guyinatuxido 页面 中提出,与快速 bin 攻击非常相似,目标是覆盖已释放块内的 bin 中下一个块的指针到任意地址,以便稍后分配该特定地址并潜在地覆盖指针。
然而,现在,如果运行上述代码,将会收到错误:malloc(): unaligned tcache chunk detected
。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便实际对齐写入的地址)。
Tcache 索引攻击
通常可以在堆的开头找到一个包含 Tcache 中每个索引的块数量和每个 Tcache 索引的头块地址的块。如果由于某种原因可以修改此信息,则可以使某个索引的头块指向所需地址(如 __malloc_hook
),然后分配一个与索引大小相同的块并覆盖此处的 __malloc_hook
内容。
示例
Libc 信息泄漏:可以填充 tcaches,将一个块添加到未排序列表中,清空 tcache 并重新分配未排序 bin 中的块,仅覆盖前 8B,保留块的第二个地址到 libc 的地址,以便读取它。
Tcache 攻击:二进制文件存在 1B 堆溢出漏洞。这将被利用来更改已分配块的大小标头,使其更大。然后,释放此块,将其添加到具有虚假大小的块的 tcache 中。然后,我们将分配一个具有伪造大小的块,前一个块将返回,知道此块实际上更小,这为覆盖内存中的下一个块提供了机会。 我们将利用此来覆盖下一个块的 FD 指针指向**
malloc_hook
,然后可以分配 2 个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在malloc_hook
中的块,可以利用它来编写一个 gadget**。Libc 信息泄漏:存在使用后释放和双重释放。在此解决方案中,作者通过读取放置在小 bin 中的块的地址泄漏了 libc 的地址(类似于从未排序 bin 中泄漏,但是从小 bin 中泄漏)。
Tcache 攻击:通过双重释放执行 Tcache。同一块被释放两次,因此在 Tcache 中,该块将指向自身。然后,它被分配,其 FD 指针被修改为指向free hook,然后再次分配,因此列表中的下一个块将在 free hook 中。然后,这也被分配,可以在此处写入
system
的地址,因此当包含"/bin/sh"
的 malloc 被释放时,我们就获得了 shell。主要漏洞是可以通过指定其偏移量来
free
堆中的任何地址Tcache 索引攻击:可以分配和释放一个大小的块,当存储在 tcache 块中(包含 tcache bin 信息的块)时,将生成一个值为 0x100 的地址。这是因为 tcache 在不同字节中存储每个 bin 中的块数量,因此一个特定索引中的一个块会生成值 0x100。
然后,此值看起来像是一个大小为 0x100 的块。通过
free
此地址,将将该地址添加到 tcache 中大小为 0x100 的块的索引。然后,分配一个大小为0x100的块,前一个地址将作为一个块返回,允许覆盖其他 tcache 索引。 例如,将 malloc hook 的地址放入其中一个索引中,并分配该索引大小的块,将授予 calloc hook 中的一个块,从而允许编写一个 gadget 以获得 shell。
与之前相同的漏洞,但有一个额外的限制
Tcache 索引攻击:类似于前一个攻击,但使用更少的步骤,通过释放包含 tcache 信息的块,使其地址添加到其大小的 tcache 索引中,因此可以分配该大小并将 tcache 块信息作为一个块,从而将 free hook 添加为一个索引的地址,分配它,并在其上编写一个 gadget。
Write After Free 以将数字添加到
fd
指针。在此挑战中需要大量的堆 feng-shui。解决方案展示了如何非常方便地控制 Tcache 自由列表的头部。
通过
stdout
(FSOP)进行Glibc 泄漏。Tcache 毒化 以获得任意写入原语。
Last updated