mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 12:43:23 +00:00
Translated ['binary-exploitation/arbitrary-write-2-exec/aw2exec-__malloc
This commit is contained in:
parent
d10c460f0c
commit
83cd4ccd6c
6 changed files with 261 additions and 33 deletions
|
@ -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)
|
||||
|
||||
|
|
|
@ -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>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<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)!
|
||||
* 如果您想看到您的**公司在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 &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_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>htARTE(HackTricks AWS红队专家)</strong></a><strong>!</strong></summary>
|
||||
<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)!
|
||||
* 如果您想看到您的**公司在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来分享您的黑客技巧。
|
||||
|
||||
|
|
|
@ -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 攻击。
|
||||
* 注意 
|
||||
|
||||
{% 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>
|
||||
|
|
64
binary-exploitation/heap/large-bin-attack.md
Normal file
64
binary-exploitation/heap/large-bin-attack.md
Normal file
|
@ -0,0 +1,64 @@
|
|||
# 大型 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)找到关于这种攻击的另一个很好的解释。
|
43
binary-exploitation/heap/tcache-bin-attack.md
Normal file
43
binary-exploitation/heap/tcache-bin-attack.md
Normal file
|
@ -0,0 +1,43 @@
|
|||
# Tcache Bin Attack
|
||||
|
||||
<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),我们独家的[**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>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),我们独家的[**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>
|
85
binary-exploitation/heap/unsorted-bin-attack.md
Normal file
85
binary-exploitation/heap/unsorted-bin-attack.md
Normal file
|
@ -0,0 +1,85 @@
|
|||
# 未排序 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),我们的独家[**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 &__free_hook
|
||||
$1 = (void (**)(void *, const void *)) 0x7ff1e9e607a8 <__free_hook>
|
||||
gef➤ x/60gx 0x7ff1e9e607a8 - 0x59
|
||||
<strong>0x7ff1e9e6074f: 0x0000000000000000 0x0000000000000200
|
||||
</strong>0x7ff1e9e6075f: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6076f <list_all_lock+15>: 0x0000000000000000 0x0000000000000000
|
||||
0x7ff1e9e6077f <_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>htARTE(HackTricks 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>
|
Loading…
Reference in a new issue