# House of Einherjar {{#include ../../banners/hacktricks-training.md}} ## Podstawowe informacje ### Kod - Sprawdź przykład z [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) - Lub ten z [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) (możesz potrzebować wypełnić tcache) ### Cel - Celem jest przydzielenie pamięci w prawie dowolnym konkretnym adresie. ### Wymagania - Utwórz fałszywy kawałek, gdy chcemy przydzielić kawałek: - Ustaw wskaźniki, aby wskazywały na siebie, aby obejść kontrole poprawności - Przepełnienie o jeden bajt z bajtem null z jednego kawałka do następnego, aby zmodyfikować flagę `PREV_INUSE`. - Wskaź w `prev_size` fałszywego kawałka wykorzystanego w sposób off-by-null powinien wskazywać różnicę między nim a fałszywym kawałkiem - Rozmiar fałszywego kawałka również musi być ustawiony na ten sam rozmiar, aby obejść kontrole poprawności - Do konstruowania tych kawałków będziesz potrzebować wycieku z sterty. ### Atak - `A` fałszywy kawałek jest tworzony wewnątrz kawałka kontrolowanego przez atakującego, wskazując `fd` i `bk` na oryginalny kawałek, aby obejść zabezpieczenia - Przydzielane są 2 inne kawałki (`B` i `C`) - Wykorzystując błąd off by one w kawałku `B`, bit `prev in use` jest czyszczony, a dane `prev_size` są nadpisywane różnicą między miejscem, w którym przydzielany jest kawałek `C`, a fałszywym kawałkiem `A` utworzonym wcześniej - Ten `prev_size` i rozmiar w fałszywym kawałku `A` muszą być takie same, aby obejść kontrole. - Następnie, tcache jest wypełniane - Następnie, `C` jest zwalniane, aby skonsolidować się z fałszywym kawałkiem `A` - Następnie tworzony jest nowy kawałek `D`, który zacznie się w fałszywym kawałku `A` i pokryje kawałek `B` - Dom Einherjar kończy się tutaj - Można to kontynuować atakiem na szybki bin lub zatruciem Tcache: - Zwalniamy `B`, aby dodać go do szybkiego bin / Tcache - `fd` kawałka `B` jest nadpisywany, co sprawia, że wskazuje na docelowy adres, wykorzystując kawałek `D` (ponieważ zawiera `B` wewnątrz) - Następnie wykonuje się 2 malloci, a drugi z nich będzie **przydzielał adres docelowy** ## Odniesienia i inne przykłady - [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) - Po zwolnieniu wskaźników nie są one ustawiane na null, więc nadal możliwe jest uzyskanie dostępu do ich danych. Dlatego kawałek jest umieszczany w nieposortowanym binie i wyciekają wskaźniki, które zawiera (wyciek libc), a następnie nowa sterta jest umieszczana w nieposortowanym binie i wyciekany jest adres sterty z uzyskanego wskaźnika. - [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/) - Błąd przepełnienia bajtu null w `strtok`. - Użyj House of Einherjar, aby uzyskać sytuację z nakładającymi się kawałkami i zakończyć zatruciem Tcache, aby uzyskać prymitywne zapisywanie dowolnych danych. {{#include ../../banners/hacktricks-training.md}}