hacktricks/binary-exploitation/libc-heap/house-of-einherjar.md

75 lines
4.8 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.

# Einherjar之屋
{% hint style="success" %}
学习并练习AWS黑客<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家ARTE**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习GCP黑客<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家GRTE**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**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>
{% endhint %}
## 基本信息
### 代码
* 查看示例:[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
### 目标
* 目标是在几乎任意特定地址上分配内存。
### 要求
* 当我们想要分配一个块时,创建一个伪造的块:
* 设置指针指向自身以绕过完整性检查
* 通过一个块到下一个块的一个字节溢出,使用空字节修改`PREV_INUSE`标志。
* 在被滥用的块的`prev_size`中指示自身与伪造块之间的差异
* 伪造块的大小也必须设置为相同大小以绕过完整性检查
* 为构造这些块,您将需要一个堆泄漏。
### 攻击
* 攻击者在一个受攻击者控制的块内创建一个伪造块,用`fd`和`bk`指向原始块以绕过保护
* 分配2个其他块`B`和`C`
* 在`B`中滥用`prev in use`,清除`prev_size`数据,并用`C`块分配的位置与之前生成的伪造`A`块之间的差异进行覆盖
* 这个`prev_size`和伪造块`A`中的大小必须相同以绕过检查。
* 然后填充tcache
* 然后,释放`C`,使其与伪造块`A`合并
* 然后,创建一个新块`D`,它将从伪造`A`块开始,覆盖`B`块
* Einherjar之屋到此结束
* 这可以继续进行快速bin攻击或Tcache污染
* 释放`B`以将其添加到快速bin / Tcache
* 覆盖`B`的`fd`,使其指向目标地址,滥用包含`B`的`D`块(因为它包含`B`&#x20;
* 然后进行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)
* **CTF** [**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中放置一个新堆并从它获得的指针泄漏一个堆地址。
* [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
* `strtok`中的空字节溢出漏洞。
* 使用Einherjar之屋获得重叠块情况并最终通过Tcache污染获得任意写入原语。
{% hint style="success" %}
学习并练习AWS黑客<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks培训AWS红队专家ARTE**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
学习并练习GCP黑客<img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks培训GCP红队专家GRTE**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
<details>
<summary>支持HackTricks</summary>
* 查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
* **加入** 💬 [**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>
{% endhint %}