mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-27 07:01:09 +00:00
64 lines
3.5 KiB
Markdown
64 lines
3.5 KiB
Markdown
# 大型 Bin 攻击
|
||
|
||
<details>
|
||
|
||
<summary><strong>从零开始学习 AWS 黑客技术,成为</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE(HackTricks 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) 中找到一个很好的示例。
|
||
|
||
基本上,您可以看到在最新的 glibc(2.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)找到关于这种攻击的另一个很好的解释。
|