hacktricks/binary-exploitation/heap/large-bin-attack.md

64 lines
3.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 大型 Bin 攻击
<details>
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS 红队专家)</strong></a><strong></strong></summary>
支持 HackTricks 的其他方式:
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版本的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFT**](https://opensea.io/collection/the-peass-family)收藏品
* **加入** 💬 [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**电报群组**](https://t.me/peass) 或在 **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** 上关注我们**。
* 通过向 [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 仓库提交 PR 来分享您的黑客技巧。
</details>
## 基本信息
有关大型 Bin 的更多信息,请查看此页面:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
您可以在 [**how2heap - 大型 Bin 攻击**](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/large\_bin\_attack.c) 中找到一个很好的示例。
基本上,您可以看到在最新的 glibc2.35)版本中,未检查:**`P->bk_nextsize`**,允许在满足某些条件的情况下修改任意地址为大型 Bin 块的值。
在该示例中,您可以找到以下条件:
* 分配了一个大块
* 分配了一个比第一个小但在相同索引中的大块
* 必须更小,以便在 bin 中首先进入
* (创建一个块以防止与顶部块合并)
* 然后,释放第一个大块并分配一个比它更大的新块 -> Chunk1 进入大型 Bin
* 然后,释放第二个大块
* 现在,漏洞:攻击者可以修改 `chunk1->bk_nextsize``[target-0x20]`
* 然后,分配比块 2 更大的块,因此块 2 被插入大型 Bin覆盖地址 `chunk1->bk_nextsize->fd_nextsize` 为块 2 的地址
{% hint style="success" %}
还有其他潜在的情景,关键是向大型 Bin 添加一个比当前 X 块**更小**的块,因此它需要在 bin 中刚好在 X 块之前插入,并且我们需要能够修改 X 的**`bk_nextsize`**,因为这是较小块的地址将被写入的位置。
{% endhint %}
这是来自 malloc 的相关代码。已添加注释以更好地理解地址是如何被覆盖的:
{% code overflow="wrap" %}
```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
}
```
{% endcode %}
这可以用来**覆盖libc的`global_max_fast`全局变量**然后利用更大的块进行快速bin攻击。
您可以在[guyinatuxedo](https://guyinatuxedo.github.io/32-largebin_attack/largebin_explanation0/index.html)找到关于这种攻击的另一个很好的解释。