# House of Einherjar {{#include ../../banners/hacktricks-training.md}} ## Basic Information ### Code - Перевірте приклад з [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) ### Goal - Мета полягає в тому, щоб виділити пам'ять за майже будь-якою конкретною адресою. ### Requirements - Створити фейковий чанк, коли ми хочемо виділити чанк: - Встановити вказівники, щоб вони вказували на себе, щоб обійти перевірки - Переповнення на один байт з нульовим байтом з одного чанка до наступного, щоб змінити прапорець `PREV_INUSE`. - Вказати в `prev_size` зловживаного чанка off-by-null різницю між ним і фейковим чанком - Розмір фейкового чанка також повинен бути встановлений таким же, щоб обійти перевірки - Для побудови цих чанків вам знадобиться витік купи. ### Attack - `A` фейковий чанк створюється всередині чанка, контрольованого атакуючим, вказуючи `fd` і `bk` на оригінальний чанк, щоб обійти захист - Виділяються 2 інші чанки (`B` і `C`) - Зловживаючи off by one в `B`, очищається біт `prev in use`, а дані `prev_size` перезаписуються різницею між місцем, де виділяється чанк `C`, і фейковим чанком `A`, створеним раніше - Цей `prev_size` і розмір у фейковому чанку `A` повинні бути однаковими, щоб обійти перевірки. - Потім заповнюється tcache - Потім `C` звільняється, щоб об'єднатися з фейковим чанком `A` - Потім створюється новий чанк `D`, який почнеться у фейковому чанку `A` і покриє чанк `B` - Будинок Ейнхер'я закінчується тут - Це можна продовжити з атакою швидкого біну або отруєнням Tcache: - Звільнити `B`, щоб додати його до швидкого біну / Tcache - `fd` `B` перезаписується, змушуючи його вказувати на цільову адресу, зловживаючи чанком `D` (оскільки він містить `B` всередині) - Потім виконуються 2 malloc, і другий з них буде **виділяти цільову адресу** ## References and other examples - [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) - Після звільнення вказівники не обнуляються, тому все ще можливо отримати доступ до їх даних. Тому чанк поміщається в неупорядкований бін і витікає вказівники, які він містить (libc leak), а потім нова купа поміщається в неупорядкований бін і витікає адресу купи з вказівника, який вона отримує. - [**baby-talk. DiceCTF 2024**](https://7rocky.github.io/en/ctf/other/dicectf/baby-talk/) - Помилка переповнення нульового байта в `strtok`. - Використовуйте House of Einherjar, щоб отримати ситуацію з перекриваючими чанками і закінчити з отруєнням Tcache, щоб отримати примітив довільного запису. {{#include ../../banners/hacktricks-training.md}}