mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 04:33:28 +00:00
Translated ['binary-exploitation/heap/house-of-einherjar.md', 'binary-ex
This commit is contained in:
parent
76255f4ab8
commit
fc45026c1c
5 changed files with 112 additions and 80 deletions
|
@ -740,7 +740,7 @@
|
|||
* [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)
|
||||
* [House of Lore | Small bin Attack](binary-exploitation/heap/house-of-lore.md)
|
||||
* [House of Einherjar](binary-exploitation/heap/house-of-einherjar.md)
|
||||
* [House of Force](binary-exploitation/heap/house-of-force.md)
|
||||
* [House of Orange](binary-exploitation/heap/house-of-orange.md)
|
||||
|
|
|
@ -8,7 +8,7 @@
|
|||
|
||||
* 如果您想在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来分享您的黑客技巧。
|
||||
|
||||
|
@ -19,6 +19,7 @@
|
|||
### 代码
|
||||
|
||||
* 查看示例:[https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
* 或者查看:[https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation](https://guyinatuxedo.github.io/42-house\_of\_einherjar/house\_einherjar\_exp/index.html#house-of-einherjar-explanation)(您可能需要填充tcache)
|
||||
|
||||
### 目标
|
||||
|
||||
|
@ -26,36 +27,30 @@
|
|||
|
||||
### 要求
|
||||
|
||||
* 通过下一个块的头部的一个偏移量来修改前一个块的使用情况
|
||||
* 能够修改`prev_size`数据,这是当前块的一部分(位于末尾)
|
||||
* 堆泄漏
|
||||
* 当我们想要分配一个块时,创建一个假块:
|
||||
* 设置指针指向自身以绕过完整性检查
|
||||
* 从一个块到另一个块的偏移一个字节,修改前一个块的使用情况
|
||||
* 在被滥用的偏移一个字节的块的`prev_size`中指示自身与假块之间的差异
|
||||
* 假块的大小也必须设置为相同的大小以绕过完整性检查
|
||||
* 要构造这些块,您将需要一个堆泄漏。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 在受攻击者控制的块内创建一个`A`假块,将`fd`和`bk`指向原始块以绕过保护
|
||||
* 创建另外2个块(`B`和`C`)
|
||||
* 利用`B`中的一个偏移量,清除`prev in use`位并用`C`块分配的位置与之前生成的假`A`块之间的差异覆盖`prev_size`数据
|
||||
* 这个`prev_size`和假块`A`的大小必须相同以绕过检查
|
||||
* 然后填充Tcache
|
||||
* 然后释放`C`,使其与假块`A`合并
|
||||
* 然后创建一个新块`D`,它将从假`A`块开始并覆盖`B`块
|
||||
* 然后释放`B`,并将其`fd`覆盖为目标地址,使其指向目标地址,利用包含它的`D`块
|
||||
* 然后进行2次malloc,因为第二次malloc将包含目标地址
|
||||
* 攻击者在一个受攻击者控制的块内创建一个假块,用`fd`和`bk`指向原始块以绕过保护
|
||||
* 分配2个其他块(`B`和`C`)
|
||||
* 在`B`中滥用偏移一个字节,清除`prev in use`位,并用`C`块分配的位置与之前生成的假`A`块之间的差异覆盖`prev_size`数据
|
||||
* 这个`prev_size`和假块`A`中的大小必须相同以绕过检查。
|
||||
* 然后,填充tcache
|
||||
* 然后,释放`C`,使其与假块`A`合并
|
||||
* 然后,创建一个新块`D`,它将从假`A`块开始,覆盖`B`块
|
||||
* Einherjar之屋到此结束
|
||||
* 这可以继续进行快速bin攻击:
|
||||
* 释放`B`以将其添加到快速bin
|
||||
* 覆盖`B`的`fd`,使其指向目标地址,滥用包含`B`的`D`块(因为它包含`B`) 
|
||||
* 然后,执行2次malloc,第二次将**分配目标地址**
|
||||
|
||||
## 参考资料
|
||||
## 参考资料和其他示例
|
||||
|
||||
* [https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.35/house\_of\_einherjar.c)
|
||||
|
||||
<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>
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_einherjar/#2016-seccon-tinypad)
|
||||
* 释放指针后它们不会被置空,因此仍然可以访问它们的数据。因此,在未排序的bin中放置一个块,并泄漏它包含的指针(libc泄漏),然后在未排序的bin中放置一个新堆,并从它获得的指针中泄漏一个堆地址。
|
||||
|
|
|
@ -1,4 +1,4 @@
|
|||
# House of Lore
|
||||
# House of Lore | Small bin Attack
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -6,9 +6,9 @@
|
|||
|
||||
支持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,33 +18,43 @@
|
|||
|
||||
### 代码
|
||||
|
||||
* 查看来自[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)的代码
|
||||
* 这个不起作用
|
||||
* 查看来自[https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)的内容
|
||||
* 或者:[https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c](https://github.com/shellphish/how2heap/blob/master/glibc\_2.39/house\_of\_lore.c)
|
||||
* 即使尝试绕过一些检查也不起作用,会出现错误:`malloc(): unaligned tcache chunk detected`
|
||||
* 这个示例仍在起作用**:[**https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html**](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html) 
|
||||
|
||||
### 目标
|
||||
|
||||
* 在小型bin中插入一个虚假的小块,以便可以分配它。
|
||||
* 在小型bin中插入一个**伪造的小块,然后可以分配它**。\
|
||||
请注意,添加的小块是攻击者创建的伪造的小块,而不是在任意位置创建的伪造的小块。
|
||||
|
||||
### 要求
|
||||
|
||||
* 创建虚假块
|
||||
* 知道受害者块和虚假块的地址
|
||||
* 能够修改`bk`和`fd`指针
|
||||
* 创建2个伪造的块,并将它们与合法块链接:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小块中的指针)
|
||||
* `legit.bk` -> `fake0`
|
||||
|
||||
然后您将能够分配`fake0`。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 分配一个受害者小块
|
||||
* 攻击者生成一对虚假小块,并使第一个虚假块的`fd`指向一个真实块,`bk`指向第二个虚假块。同时使第二个虚假块的`bk`指向第一个虚假块。
|
||||
* 然后,分配一个新的大块以防止第一个块在释放时合并到顶部块中
|
||||
* 然后释放初始指针,并分配一个更大尺寸的第二个指针,以便释放的初始小块被放置在小型bin中。
|
||||
* 修改真实小块,使其`bk`指针指向虚假块。
|
||||
* 然后,当分配这个大小的2个块时,它们首先获取有效块,然后获取由攻击者控制的无效块。
|
||||
* 分配一个小块(`legit`),然后分配另一个块以防止与顶部块合并。然后释放`legit`(将其移动到未排序列表),然后分配一个较大的块,**将`legit`移动到小型bin中**。
|
||||
* 攻击者生成一对伪造的小块,并进行必要的链接以绕过完整性检查:
|
||||
* `fake0.bk` -> `fake1`
|
||||
* `fake1.fd` -> `fake0`
|
||||
* `fake0.fd` -> `legit`(您需要通过其他漏洞修改释放的小块中的指针)
|
||||
* `legit.bk` -> `fake0`
|
||||
* 分配一个小块以获取`legit`,将**`fake0`**置于小型bin的顶部列表
|
||||
* 再分配一个小块,获取`fake0`作为一个块,从而有可能读取/写入其中的指针。
|
||||
|
||||
## 参考资料
|
||||
|
||||
* [https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/](https://ctf-wiki.mahaloz.re/pwn/linux/glibc-heap/house\_of\_lore/)
|
||||
* [https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore](https://heap-exploitation.dhavalkapil.com/attacks/house\_of\_lore)
|
||||
* [https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html](https://guyinatuxedo.github.io/40-house\_of\_lore/house\_lore\_exp/index.html)
|
||||
|
||||
<details>
|
||||
|
||||
|
@ -52,9 +62,9 @@
|
|||
|
||||
支持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来分享您的黑客技巧。
|
||||
|
||||
|
|
|
@ -69,16 +69,51 @@ return 0;
|
|||
|
||||
### 目标
|
||||
|
||||
* 能够将任意地址添加到 tcache / fast bin 中,以便在调用 malloc 时将其用于一个块中
|
||||
* 能够将一个地址添加到 tcache / fast bin 中,以便稍后可以分配它
|
||||
|
||||
### 要求
|
||||
|
||||
* 此攻击需要攻击者能够创建几个虚假的 fast chunks,并正确指示其大小值,并覆盖一个将要被释放的具有相同大小的 fast chunk,以便攻击者的块实际上是进入 fast bin 中的块。
|
||||
* 此攻击需要攻击者能够创建几个虚假的 fast chunks,并正确指示其大小值,然后能够释放第一个虚假块,使其进入 bin。
|
||||
|
||||
### 攻击
|
||||
|
||||
* 创建一个绕过安全检查的虚假块(您将需要 2 个虚假块)
|
||||
* 在指针被释放之前,用虚假块覆盖它,以便它进入 bin 中
|
||||
* 创建绕过安全检查的虚假块:基本上需要 2 个虚假块,在正确的位置指示正确的大小
|
||||
* 以某种方式释放第一个虚假块,使其进入 fast 或 tcache bin,然后将其分配以覆盖该地址
|
||||
|
||||
**来自** [**guyinatuxedo**](https://guyinatuxedo.github.io/39-house\_of\_spirit/house\_spirit\_exp/index.html) **的代码非常适合理解这种攻击。** 尽管代码中的此图表总结得非常好:
|
||||
```c
|
||||
/*
|
||||
this will be the structure of our two fake chunks:
|
||||
assuming that you compiled it for x64
|
||||
|
||||
+-------+---------------------+------+
|
||||
| 0x00: | Chunk # 0 prev size | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x08: | Chunk # 0 size | 0x60 |
|
||||
+-------+---------------------+------+
|
||||
| 0x10: | Chunk # 0 content | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x60: | Chunk # 1 prev size | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
| 0x68: | Chunk # 1 size | 0x40 |
|
||||
+-------+---------------------+------+
|
||||
| 0x70: | Chunk # 1 content | 0x00 |
|
||||
+-------+---------------------+------+
|
||||
|
||||
for what we are doing the prev size values don't matter too much
|
||||
the important thing is the size values of the heap headers for our fake chunks
|
||||
*/
|
||||
```
|
||||
{% hint style="info" %}
|
||||
请注意,需要创建第二个块以绕过一些健全性检查。
|
||||
{% endhint %}
|
||||
|
||||
## 示例
|
||||
|
||||
* CTF [https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html](https://guyinatuxedo.github.io/39-house\_of\_spirit/hacklu14\_oreo/index.html)
|
||||
* **Libc信息泄漏**:通过溢出,可以更改指针以指向GOT地址,从而通过CTF的读取操作泄漏libc地址
|
||||
* **House of Spirit**:滥用计数器,计算“步枪”的数量,可以生成第一个虚假块的虚假大小,然后滥用“消息”,可以伪造块的第二个大小,最后通过溢出,可以更改将要被释放的指针,使我们的第一个虚假块被释放。然后,我们可以分配它,并且其中将包含“消息”存储的地址。然后,可以使其指向GOT表中的`scanf`入口,以便我们可以用system的地址覆盖它。\
|
||||
下次调用`scanf`时,我们可以发送输入`"/bin/sh"`并获得一个shell。
|
||||
|
||||
## 参考
|
||||
|
||||
|
@ -86,14 +121,14 @@ return 0;
|
|||
|
||||
<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 Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||
|
||||
支持 HackTricks 的其他方式:
|
||||
支持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>
|
||||
|
|
|
@ -9,7 +9,7 @@
|
|||
* 如果您想看到您的**公司在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)**。**
|
||||
* **加入** 💬 [**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>
|
||||
|
@ -24,37 +24,29 @@
|
|||
|
||||
首先,请注意Tcache是在glibc版本2.26中引入的。
|
||||
|
||||
[guyinatuxido页面](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)提出的**Tcache**攻击与快速bin攻击非常相似,其目标是覆盖已释放块中bin内下一个块的指针到任意地址,以便稍后**分配该特定地址并潜在地覆盖指针**。
|
||||
[guyinatuxido页面](https://guyinatuxedo.github.io/29-tcache/tcache\_explanation/index.html)提出的**Tcache**攻击与快速bin攻击非常相似,目标是覆盖已释放块内的bin中下一个块的指针,使其指向任意地址,以便**分配该特定地址并潜在地覆盖指针**。
|
||||
|
||||
然而,现在,如果运行上述代码,将会收到错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
|
||||
然而,现在,如果运行上述代码,将会出现错误:**`malloc(): unaligned tcache chunk detected`**。因此,需要在新指针中写入对齐的地址(或者执行足够多次二进制文件,以便写入的地址实际上是对齐的)。
|
||||
|
||||
### Tcache索引攻击
|
||||
|
||||
通常可以在堆的开头找到一个包含tcache中**每个索引中块的数量**和**每个tcache索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如malloc hook),然后分配一个与索引大小相同的块并覆盖此情况下的malloc hook内容。
|
||||
通常可以在堆的开头找到一个包含tcache中**每个索引的块数量**和**每个tcache索引的头块地址**的块。如果由于某种原因可以修改此信息,则可以**使某个索引的头块指向所需地址**(如malloc hook),然后分配一个与该索引大小相同的块并覆盖此情况下的malloc hook内容。
|
||||
|
||||
## 示例
|
||||
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html](https://guyinatuxedo.github.io/29-tcache/dcquals19\_babyheap/index.html)
|
||||
* **Libc信息泄漏**:可以填充tcaches,将一个块添加到未排序列表中,清空tcache,然后**从未排序bin中重新分配块**,仅覆盖前8B,保留块的第二个地址到libc的地址,以便读取它。
|
||||
* **Tcache攻击**:二进制文件存在1B堆溢出漏洞。这将被滥用来更改已分配块的**大小标头**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的tcache中。然后,我们将分配一个具有伪造大小的块,并且先前的块将**返回,知道此块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
||||
我们将滥用此功能来**覆盖下一个块的FD指针**,使其指向**`malloc_hook`**,然后可以分配2个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以滥用以编写**一个gadget**。
|
||||
* **Libc信息泄漏**:可以填充tcaches,将一个块添加到未排序列表中,清空tcache,然后**从未排序bin中重新分配该块**,仅覆盖前8B,保留块中的第二个地址以便我们可以读取libc的地址。
|
||||
* **Tcache攻击**:二进制文件存在1B堆溢出漏洞。这将被利用来更改已分配块的**大小标头**,使其更大。然后,释放此块,将其添加到具有虚假大小的块的tcache中。然后,我们将分配一个具有伪造大小的块,之前的块将被**返回,知道此块实际上更小**,这为**覆盖内存中的下一个块**提供了机会。\
|
||||
我们将利用此漏洞**将下一个块的FD指针覆盖**为指向**`malloc_hook`**,然后就可以分配2个指针:首先是我们刚修改的合法指针,然后第二次分配将返回一个在**`malloc_hook`**中的块,可以利用它来写入**一个gadget**。
|
||||
* CTF [https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html](https://guyinatuxedo.github.io/29-tcache/plaid19\_cpp/index.html)
|
||||
* **Libc信息泄漏**:存在使用后释放和双重释放。在此解决方案中,作者通过读取放置在小bin中的块的地址泄漏了libc的地址(类似于从未排序bin中泄漏,但是从小bin中泄漏)。
|
||||
* **Tcache攻击**:通过**双重释放**执行Tcache。同一块被释放两次,因此在Tcache内,该块将指向自身。然后,它被分配,其FD指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将位于free hook中。然后,这也被分配,并且可以将`system`的地址写入其中,因此当包含`"/bin/sh"`的malloc被释放时,我们将获得一个shell。
|
||||
* **Tcache攻击**:通过**双重释放**执行Tcache。同一块被释放两次,因此在Tcache中,该块将指向自身。然后,它被分配,其FD指针被修改为指向**free hook**,然后再次分配,因此列表中的下一个块将位于free hook中。然后,这也被分配,可以将`system`的地址写入其中,因此当包含`"/bin/sh"`的malloc被释放时,我们就可以获得shell。
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps0/index.html)
|
||||
* **Tcache索引攻击**:可以分配和释放一个大小的块,当存储在tcache信息中时,将生成一个具有值0x100的**位置**(因为该字节指示该索引中存储了多少块)。然后,滥用此值,可以将此地址释放,因为看起来它是大小为0x100的块。这将在tcache中的大小为0x100的块的索引中添加该地址。\
|
||||
然后,分配一个大小为0x100的块,可以覆盖其他tcache索引的初始块地址。例如,在其中放置malloc hook地址,并分配一个该索引大小的块,将授予一个在calloc hook中的块,从而允许编写一个gadget以获得一个shell。
|
||||
|
||||
<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>
|
||||
* 这里的主要漏洞是可以通过指定其偏移量来`free`堆中的任何地址
|
||||
* **Tcache索引攻击**:可以分配和释放一个大小的块,当存储在tcache块中(包含tcache bin信息的块)时,将生成一个值为0x100的地址。这是因为tcache在不同字节中存储每个bin中的块数量,因此一个特定索引中的一个块会生成值0x100。
|
||||
* 然后,此值看起来像是一个大小为0x100的块。通过`free`此地址,将**将该地址添加到tcache中大小为0x100的块的索引**中。
|
||||
* 然后,**分配**一个大小为**0x100**的块,之前的地址将作为一个块返回,允许覆盖其他tcache索引。\
|
||||
例如,将malloc hook的地址放入其中一个索引中,并分配该索引大小的块,将授予在calloc hook中获得一个块的机会,从而可以编写一个gadget以获取shell。
|
||||
* CTF [https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html](https://guyinatuxedo.github.io/44-more\_tcache/csaw19\_popping\_caps1/index.html)
|
||||
* 与之前相同的漏洞,但有一个额外的限制
|
||||
* **Tcache索引攻击**:类似于前一个攻击,但使用更少的步骤,通过**释放包含tcache信息的块**,使其地址添加到其大小的tcache索引中,因此可以分配该大小并将tcache块信息作为一个块,从而可以将free hook添加为一个索引的地址,分配它,并在其上编写一个gadget。
|
||||
|
|
Loading…
Reference in a new issue