Translated ['binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc

This commit is contained in:
Translator 2024-06-12 15:27:11 +00:00
parent d10c460f0c
commit 83cd4ccd6c
6 changed files with 261 additions and 33 deletions

View file

@ -736,6 +736,7 @@
* [Fast Bin Attack](binary-exploitation/heap/fast-bin-attack.md)
* [Unsorted Bin Attack](binary-exploitation/heap/unsorted-bin-attack.md)
* [Large Bin Attack](binary-exploitation/heap/large-bin-attack.md)
* [Tcache Bin Attack](binary-exploitation/heap/tcache-bin-attack.md)
* [Off by one overflow](binary-exploitation/heap/off-by-one-overflow.md)
* [House of Spirit](binary-exploitation/heap/house-of-spirit.md)
* [House of Lore](binary-exploitation/heap/house-of-lore.md)
@ -762,7 +763,7 @@
* [WWW2Exec - atexit()](binary-exploitation/arbitrary-write-2-exec/www2exec-atexit.md)
* [WWW2Exec - .dtors & .fini\_array](binary-exploitation/arbitrary-write-2-exec/www2exec-.dtors-and-.fini\_array.md)
* [WWW2Exec - GOT/PLT](binary-exploitation/arbitrary-write-2-exec/aw2exec-got-plt.md)
* [WWW2Exec - \_\_malloc\_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
* [WWW2Exec - \_\_malloc\_hook & \_\_free\_hook](binary-exploitation/arbitrary-write-2-exec/aw2exec-\_\_malloc\_hook.md)
* [Common Exploiting Problems](binary-exploitation/common-exploiting-problems.md)
* [Windows Exploiting (Basic Guide - OSCP lvl)](binary-exploitation/windows-exploiting-basic-guide-oscp-lvl.md)

View file

@ -1,14 +1,14 @@
# WWW2Exec - \_\_malloc\_hook
# WWW2Exec - \_\_malloc\_hook & \_\_free\_hook
<details>
<summary><strong>从零开始学习AWS黑客技术,成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
<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)!
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](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来分享您的黑客技巧。
@ -18,7 +18,7 @@
正如您可以在[GNU官方网站](https://www.gnu.org/software/libc/manual/html\_node/Hooks-for-Malloc.html)中看到的,变量**`__malloc_hook`**是一个指针,指向**将在调用`malloc()`时调用的函数的地址**存储在libc库的数据段中。因此如果将此地址覆盖为例如**One Gadget**,并调用`malloc`,则将调用**One Gadget**。
要调用malloc可以等待程序调用它也可以通过**调用`printf("%10000$c")`**,这会分配太多字节,使得`libc`调用malloc在堆中分配它们。
要调用malloc可以等待程序调用它也可以通过**调用`printf("%10000$c")`**,这将分配太多字节,使`libc`调用malloc在堆中分配它们。
有关One Gadget的更多信息请参见
@ -27,23 +27,48 @@
{% endcontent-ref %}
{% hint style="warning" %}
请注意,对于GLIBC >= 2.34,挂钩是**禁用**的。现代GLIBC版本可以使用其他技术。请参阅[https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。
请注意,**GLIBC >= 2.34**已禁用挂钩。现代GLIBC版本可以使用其他技术。请参见[https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md)。
{% endhint %}
## References
## Free Hook
这在页面中滥用快速bin攻击之后滥用未排序bin攻击的示例中被滥用
{% content-ref url="../heap/unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](../heap/unsorted-bin-attack.md)
{% endcontent-ref %}
现在执行**快速bin攻击**
* 首先发现可以在**`__free_hook`**位置使用大小为200的快速**块**
* <pre class="language-c"><code class="lang-c">gef➤ p &#x26;__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 &#x3C;__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* 如果我们设法在此位置获得大小为0x200的快速块则可以覆盖将执行的函数指针
* 为此,创建一个大小为`0xfc`的新块并使用该指针两次调用合并函数这样我们就可以在快速bin中获得一个大小为`0xfc*2 = 0x1f8`的释放块的指针。
* 然后在此块中调用编辑函数将这个快速bin的**`fd`**地址修改为指向先前的**`__free_hook`**函数。
* 然后,创建一个大小为`0x1f8`的块以从快速bin中检索先前无用的块因此创建另一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速bin块该块被覆盖为**`system`**函数的地址。
* 最后,释放包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`参数的**`__free_hook`**函数。
## 参考资料
* [https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook](https://ir0nstone.gitbook.io/notes/types/stack/one-gadgets-and-malloc-hook)
* [https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md](https://github.com/nobodyisnobody/docs/blob/main/code.execution.on.last.libc/README.md).
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS红队专家</strong></a><strong></strong></summary>
<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)!
* 如果您想看到您的**公司在HackTricks中做广告**或**下载PDF格式的HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方PEASS & HackTricks周边产品**](https://peass.creator-spring.com)
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](https://opensea.io/collection/the-peass-family)收藏品
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家[**NFTs**](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来分享您的黑客技巧。

View file

@ -6,17 +6,23 @@
支持 HackTricks 的其他方式:
* 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](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 来分享您的黑客技巧。
- 如果您想看到您的**公司在 HackTricks 中做广告**或**下载 PDF 版的 HackTricks**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
- 探索[**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家[**NFTs**](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 是单链的,与其他 Bin 相比,保护措施要少得多,只需**修改释放的快速 Bin 块中的地址**就足以**在任何内存地址后分配一个块**。
有关快速 Bin 的更多信息,请查看此页面:
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
由于快速 Bin 是单链的,与其他 Bin 相比,保护措施要少得多,只需**修改释放的快速 Bin 块中的地址**就足以**稍后在任何内存地址分配一个块**。
总结一下:
@ -126,20 +132,24 @@ printf("Chunk 5: %p\t Contains: 0x%x\n", ptr5, (int)*ptr5);
printf("\n\nJust like that, we executed a fastbin attack to allocate an address to a stack variable using malloc!\n");
}
```
## 例子
{% hint style="danger" %}
如果有可能用一个大数值覆盖全局变量 **`global_max_fast`** 的值,这将允许生成更大尺寸的 fast bin潜在地允许在以前不可能的情况下执行 fast bin 攻击。
{% endhint %}
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
- 可以分配块,释放块,读取其内容并填充它们(利用溢出漏洞)。
- **合并块以泄露信息**:该技术基本上是利用溢出来创建一个虚假的 prev\_size使一个先前的块被放入一个更大的块中因此在分配包含另一个块的更大块时可以打印其数据并泄漏到 libc 的地址main\_arena+88
- **覆盖 malloc 钩子**:通过利用前面的重叠情况,可以有两个指向相同内存的块。因此,释放它们两个(在中间释放另一个块以避免保护),可以将相同的块放入快速 bin 两次。然后,可以再次分配它,覆盖下一个块的地址,指向 malloc\_hook 之前的一点(因此指向 malloc 认为是一个空闲大小的整数 - 另一个绕过),再次分配它,然后分配另一个将接收 malloc 钩子地址的块。最后在其中写入一个 **one gadget**
- **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
- 存在堆溢出以及用户释放后和双重释放,因为当释放一个块时,可以重用并重新释放指针。
- **Libc 信息泄漏**:只需释放一些块,它们将获得指向主要 arena 位置的指针。由于可以重用已释放的指针,只需读取此地址即可。
- **Fast bin 攻击**:所有分配的指针都存储在一个数组中,因此我们可以释放几个快速 bin 块,在最后一个块中覆盖地址,指向这些指针数组之前的一点。然后,分配几个相同大小的块,我们将首先得到合法的块,然后得到包含指针数组的虚假块。现在我们可以覆盖这些分配指针,指向 `free` 的 got 地址以指向 system然后写入块 1 `"/bin/sh"`,然后 `free(chunk1)`,这将执行 `system("/bin/sh")`
## 示例
您可以在以下示例中找到通过未排序 bin 攻击滥用的 Fast Bin 攻击:
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/0ctf\_babyheap/index.html)**:**
* 可以分配块,释放它们,读取它们的内容并填充它们(利用溢出漏洞)。
* **整理块以获取信息泄漏**:该技术基本上是滥用溢出来创建一个虚假的 prev\_size使一个先前的块被放入一个更大的块中因此在分配包含另一个块的更大块时可以打印它的数据并泄漏到 libc 的地址main\_arena+88
* **覆盖 malloc 钩子**:通过利用先前的重叠情况,有可能有 2 个指向相同内存的块。因此,释放它们两个(在中间释放另一个块以避免保护),有可能将相同的块放入 fast bin 2 次。然后,有可能再次分配它,覆盖下一个块的地址指向 malloc\_hook 之前的位置(这样它指向 malloc 认为是一个空闲大小的整数 - 另一个绕过),再次分配它,然后分配另一个将接收 malloc 钩子地址的块。\
最后在其中写入了一个 **one gadget**
* **CTF** [**https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html**](https://guyinatuxedo.github.io/28-fastbin\_attack/csaw17\_auir/index.html)**:**
* 存在堆溢出以及用户在释放后和双重释放时的问题,因为当释放一个块时,可以重用并重新释放指针。
* **Libc 信息泄漏**:只需释放一些块,它们将获得指向主要堆区位置的指针。由于可以重用已释放的指针,只需读取此地址即可。
* **Fast bin 攻击**:所有分配的指针都存储在一个数组中,因此我们可以释放几个 fast bin 块,并在最后一个块中覆盖地址以指向这些指针数组之前的位置。然后,分配几个相同大小的块,我们将首先得到合法的块,然后是包含指针数组的伪造块。现在我们可以覆盖这些分配指针,将其指向 `free` 的 got 地址以指向 system然后写入块 1 `"/bin/sh"`,然后 `free(chunk1)`,这将执行 `system("/bin/sh")`
* 您可以找到一个通过未排序 bin 攻击滥用的 Fast Bin 攻击。
* 注意&#x20;
{% content-ref url="unsorted-bin-attack.md" %}
[unsorted-bin-attack.md](unsorted-bin-attack.md)
@ -151,10 +161,10 @@ printf("\n\nJust like that, we executed a fastbin attack to allocate an address
支持 HackTricks 的其他方式:
- 如果您想在 HackTricks 中看到您的 **公司广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
- 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
- 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](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****HackTricks Cloud** github 仓库提交 PR 来分享您的黑客技巧。
* 如果您想看到您的 **公司在 HackTricks 中做广告** 或 **下载 PDF 版本的 HackTricks**,请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
* 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
* 探索 [**PEASS 家族**](https://opensea.io/collection/the-peass-family),我们的独家 [**NFTs**](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****HackTricks Cloud** github 仓库提交 PR 来分享您的黑客技巧。
</details>

View file

@ -0,0 +1,64 @@
# 大型 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)找到关于这种攻击的另一个很好的解释。

View file

@ -0,0 +1,43 @@
# Tcache Bin Attack
<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),我们独家的[**NFTs**](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>
## 基本信息
有关tcache bin是什么的更多信息请查看此页面
{% content-ref url="bins-and-memory-allocations.md" %}
[bins-and-memory-allocations.md](bins-and-memory-allocations.md)
{% endcontent-ref %}
首先请注意Tcache是在glibc版本2.26中引入的。
[**guyinatuxido页面**](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)提出的**Tcache**攻击与快速bin攻击非常相似目标是覆盖在释放的块中的bin内下一个块的指针到任意地址以便稍后**分配该特定地址并潜在地覆盖指针**。
然而,如今,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入一个对齐的地址(或者执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
<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),我们独家的[**NFTs**](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>

View file

@ -0,0 +1,85 @@
# 未排序 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),我们的独家[**NFTs**](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 %}
未排序列表能够将地址写入到块的 `bk` 地址中的 `unsorted_chunks (av)`。因此,如果攻击者能够**修改未排序 Bin 中块内的 bk 指针的地址**,他就能够**将该地址写入到任意地址**,这有助于泄漏 libc 地址或绕过某些防御。
因此,基本上,这种攻击允许**用一个大数值覆盖一些任意地址**(一个可能是堆地址或 libc 地址的地址),比如一些可能会泄漏的堆地址或一些限制,比如全局变量 **`global_max_fast`**,以允许创建更大尺寸的快速 Bin 块(从未排序 Bin 攻击转变为快速 Bin 攻击)。
{% hint style="success" %}
查看 [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#principle) 中提供的示例,并使用 0x4000 和 0x5000 代替 0x400 和 0x500 作为块大小(以避免 tcaches可以看到**现在**触发错误 **`malloc(): unsorted double linked list corrupted`**。
因此,这种未排序 Bin 攻击现在(除其他检查外)还需要能够修复双重链接列表,以便绕过 `victim->bck->fd == victim` 或不是 `victim->fd == av (arena)`。这意味着我们想要写入的地址必须在其 `fd` 位置具有伪造块的地址,并且伪造块的 `fd` 指向 arena。
{% endhint %}
{% hint style="danger" %}
请注意,此攻击会破坏未排序 Bin因此也会破坏小块和大块。因此我们现在只能**使用快速 Bin 中的分配**(更复杂的程序可能会进行其他分配并崩溃),要触发此攻击,我们必须**分配相同大小的块,否则程序将崩溃**。
请注意,使 **`global_max_fast`** 可能会在这种情况下有所帮助,相信快速 Bin 将能够处理直到利用完成的所有其他分配。
{% endhint %}
来自 [**guyinatuxedo**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/unsorted\_explanation/index.html) 的代码很好地解释了这一点,尽管如果您修改 malloc 分配的内存大小足够大,以避免 tcache您会发现先前提到的错误出现阻止了这种技术**`malloc(): unsorted double linked list corrupted`**
## 参考资料和其他示例
* [**https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap**](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/unsorted\_bin\_attack/#hitcon-training-lab14-magic-heap)
* 目标是用大于 4869 的值覆盖一个全局变量,以便获取标志,且未启用 PIE。
* 可以生成任意大小的块,并且有所需大小的堆溢出。
* 攻击开始创建 3 个块chunk0 用于利用溢出chunk1 用于溢出chunk2 以防止顶部块合并前两个块。
* 然后,释放 chunk1并将 chunk0 溢出到 chunk1 的 `bk` 指针,使得 `bk = magic - 0x10`
* 然后,分配与 chunk1 相同大小的 chunk3这将触发未排序 Bin 攻击,并修改全局变量的值,从而可能获取标志。
* [**https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html**](https://guyinatuxedo.github.io/31-unsortedbin\_attack/0ctf16\_zerostorage/index.html)
* 合并函数存在漏洞,因为如果传递的两个索引相同,它将对其进行重新分配,然后释放它,但返回一个可以使用的已释放区域的指针。
* 因此,**创建 2 个块****chunk0** 将与自身合并chunk1 用于防止与顶部块合并。然后,两次调用合并函数与 chunk0这将导致使用后释放。
* 然后,调用 **`view`** 函数,索引为 2使用后释放块的索引这将**泄漏一个 libc 地址**。
* 由于二进制文件只允许 malloc 大于 **`global_max_fast`** 的大小,因此不使用 fastbin将使用未排序 Bin 攻击来覆盖全局变量 `global_max_fast`
* 然后,可以使用索引 2使用后释放指针调用编辑函数并将 `bk` 指针覆盖为指向 `p64(global_max_fast-0x10)`。然后创建一个新块将使用先前受损的释放地址0x20将**触发未排序 Bin 攻击**,覆盖 `global_max_fast` 为一个非常大的值,现在可以在快速 Bin 中创建块。
* 现在执行**快速 Bin 攻击**
* 首先发现可以在 **`__free_hook`** 位置使用大小为 200 的快速 **块**
* <pre class="language-c"><code class="lang-c">gef➤ p &#x26;__free_hook
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 &#x3C;__free_hook>
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6076f &#x3C;list_all_lock+15>: 0x0000000000000000 0x0000000000000000
0x7ff1e9e6077f &#x3C;_IO_stdfile_2_lock+15>: 0x0000000000000000 0x0000000000000000
</code></pre>
* 如果我们设法在此位置获得大小为 0x200 的快速块,就可以覆盖将执行的函数指针
* 为此,创建大小为 `0xfc` 的新块,并两次调用合并函数,这样我们就可以获得一个大小为 `0xfc*2 = 0x1f8` 的已释放块的指针在快速 Bin 中。
* 然后,在此块中调用编辑函数以修改此快速 Bin 的 **`fd`** 地址,使其指向先前的 **`__free_hook`** 函数。
* 然后,创建一个大小为`0x1f8`的块,以从快速分配区域中检索先前无用的块,然后创建另一个大小为`0x1f8`的块,以在**`__free_hook`**中获取一个快速分配区域块,该块被覆盖为**`system`**函数的地址。
* 最后,释放一个包含字符串`/bin/sh\x00`的块,调用删除函数,触发指向带有`/bin/sh\x00`作为参数的`system`的**`__free_hook`**函数。
<details>
<summary><strong>从零开始学习AWS黑客技术成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTEHackTricks AWS Red Team Expert</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),我们的独家[**NFTs**](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>