# 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}}