# House of Einherjar {{#include ../../banners/hacktricks-training.md}} ## Grundinformationen ### Code - Überprüfen Sie das Beispiel von [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) - Oder das von [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) (Sie müssen möglicherweise den tcache füllen) ### Ziel - Das Ziel ist es, Speicher an fast jeder spezifischen Adresse zuzuweisen. ### Anforderungen - Erstellen Sie einen gefälschten Chunk, wenn wir einen Chunk zuweisen möchten: - Setzen Sie Zeiger, um auf sich selbst zu zeigen, um Sanity-Checks zu umgehen - Ein-Byte-Überlauf mit einem Null-Byte von einem Chunk zum nächsten, um das `PREV_INUSE`-Flag zu ändern. - Geben Sie im `prev_size` des durch Null missbrauchten Chunks den Unterschied zwischen sich selbst und dem gefälschten Chunk an - Die Größe des gefälschten Chunks muss ebenfalls auf die gleiche Größe gesetzt werden, um Sanity-Checks zu umgehen - Zum Konstruieren dieser Chunks benötigen Sie einen Heap-Leak. ### Angriff - Ein gefälschter Chunk `A` wird innerhalb eines vom Angreifer kontrollierten Chunks erstellt, der mit `fd` und `bk` auf den ursprünglichen Chunk zeigt, um Schutzmaßnahmen zu umgehen - 2 weitere Chunks (`B` und `C`) werden zugewiesen - Durch den Missbrauch des Off-by-One im `B` wird das `prev in use`-Bit gelöscht und die `prev_size`-Daten werden mit dem Unterschied zwischen dem Ort, an dem der Chunk `C` zugewiesen wird, und dem zuvor generierten gefälschten Chunk `A` überschrieben - Diese `prev_size` und die Größe im gefälschten Chunk `A` müssen gleich sein, um Überprüfungen zu umgehen. - Dann wird der tcache gefüllt - Dann wird `C` freigegeben, damit es sich mit dem gefälschten Chunk `A` konsolidiert - Dann wird ein neuer Chunk `D` erstellt, der im gefälschten Chunk `A` beginnt und den Chunk `B` abdeckt - Das Haus von Einherjar endet hier - Dies kann mit einem Fast-Bin-Angriff oder Tcache-Vergiftung fortgesetzt werden: - `B` freigeben, um es zum Fast-Bin / Tcache hinzuzufügen - `B`'s `fd` wird überschrieben, sodass es auf die Zieladresse zeigt, indem der Chunk `D` missbraucht wird (da er `B` enthält) - Dann werden 2 Mallocs durchgeführt, und der zweite wird **die Zieladresse zuweisen** ## Referenzen und andere Beispiele - [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) - Nach dem Freigeben von Zeigern werden diese nicht auf Null gesetzt, sodass es weiterhin möglich ist, auf ihre Daten zuzugreifen. Daher wird ein Chunk in den unsortierten Bin platziert und die Zeiger, die er enthält, geleakt (libc leak) und dann wird ein neuer Heap im unsortierten Bin platziert und eine Heap-Adresse von dem Zeiger geleakt, den er erhält. - [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/) - Null-Byte-Überlauf-Fehler in `strtok`. - Verwenden Sie House of Einherjar, um eine Überlappung von Chunks zu erreichen und mit Tcache-Vergiftung zu enden, um eine willkürliche Schreibprimitive zu erhalten. {{#include ../../banners/hacktricks-training.md}}