# Large Bin Attack {{#include ../../banners/hacktricks-training.md}} ## 基本信息 有关大型 bin 的更多信息,请查看此页面: {{#ref}} bins-and-memory-allocations.md {{#endref}} 在 [**how2heap - large bin attack**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c) 中可以找到一个很好的示例。 基本上,在最新的 glibc(2.35)“当前”版本中,可以看到没有检查:**`P->bk_nextsize`**,这允许在满足某些条件时用大型 bin 块的值修改任意地址。 在该示例中,可以找到以下条件: - 分配了一个大型块 - 分配了一个小于第一个块但在同一索引中的大型块 - 必须更小,因此它必须首先进入 bin - (创建一个块以防止与顶部块合并) - 然后,释放第一个大型块并分配一个比它更大的新块 -> Chunk1 进入大型 bin - 然后,释放第二个大型块 - 现在,漏洞:攻击者可以将 `chunk1->bk_nextsize` 修改为 `[target-0x20]` - 然后,分配一个比 chunk 2 更大的块,因此 chunk2 被插入到大型 bin 中,覆盖地址 `chunk1->bk_nextsize->fd_nextsize`,其值为 chunk2 的地址 > [!TIP] > 还有其他潜在场景,关键是向大型 bin 添加一个 **小于** 当前 bin 中 X 块的块,因此它需要在 bin 中插入到 X 之前,并且我们需要能够修改 X 的 **`bk_nextsize`**,因为较小块的地址将写入该位置。 这是 malloc 中的相关代码。已添加注释以更好地理解地址是如何被覆盖的: ```c /* if smaller than smallest, bypass loop below */ assert (chunk_main_arena (bck->bk)); if ((unsigned long) (size) < (unsigned long) chunksize_nomask (bck->bk)) { fwd = bck; // fwd = p1 bck = bck->bk; // bck = p1->bk victim->fd_nextsize = fwd->fd; // p2->fd_nextsize = p1->fd (Note that p1->fd is p1 as it's the only chunk) victim->bk_nextsize = fwd->fd->bk_nextsize; // p2->bk_nextsize = p1->fd->bk_nextsize fwd->fd->bk_nextsize = victim->bk_nextsize->fd_nextsize = victim; // p1->fd->bk_nextsize->fd_nextsize = p2 } ``` 这可以用来**覆盖libc的`global_max_fast`全局变量**,从而利用更大块的快速堆攻击。 您可以在[**guyinatuxedo**](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)找到对该攻击的另一个很好的解释。 ### 其他示例 - [**La casa de papel. HackOn CTF 2024**](https://7rocky.github.io/en/ctf/other/hackon-ctf/la-casa-de-papel/) - 在[**how2heap**](https://github.com/shellphish/how2heap/blob/master/glibc_2.35/large_bin_attack.c)中出现的相同情况的大型堆攻击。 - 写入原语更复杂,因为`global_max_fast`在这里无用。 - 需要FSOP来完成利用。 {{#include ../../banners/hacktricks-training.md}}