50 lines
2.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.

# House of Einherjar
{{#include ../../banners/hacktricks-training.md}}
## 基本信息
### 代码
- 查看示例 [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` 中指示它与假块之间的差异
- 假块的大小也必须设置为相同的大小以绕过完整性检查
- 构造这些块时,你需要一个堆泄漏。
### 攻击
- 在攻击者控制的块内创建一个 `A` 假块,`fd``bk` 指向原始块以绕过保护
- 分配另外两个块(`B``C`
- 利用 `B` 中的越界,清除 `prev in use` 位,并用 `C` 块分配位置与之前生成的假 `A` 块之间的差异覆盖 `prev_size` 数据
- 这个 `prev_size` 和假块 `A` 中的大小必须相同以绕过检查。
- 然后,填充 tcache
- 然后,释放 `C` 以便与假块 `A` 合并
- 然后,创建一个新的块 `D`,它将从假 `A` 块开始并覆盖 `B`
- Einherjar 之家在这里结束
- 这可以通过快速 bin 攻击或 Tcache 中毒继续:
- 释放 `B` 以将其添加到快速 bin / Tcache
- `B``fd` 被覆盖,使其指向目标地址,利用 `D` 块(因为它包含 `B`
- 然后,进行两次 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)
- 释放指针后它们并未被置为 null因此仍然可以访问它们的数据。因此一个块被放置在未排序的 bin 中并泄漏它包含的指针libc leak然后在未排序的 bin 中放置一个新的堆并泄漏从它获取的指针的堆地址。
- [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/)
- `strtok` 中的空字节溢出漏洞。
- 使用 Einherjar 之家获取重叠块的情况,并通过 Tcache 中毒结束以获得任意写入原语。
{{#include ../../banners/hacktricks-training.md}}