mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
50 lines
2.8 KiB
Markdown
50 lines
2.8 KiB
Markdown
# 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}}
|