50 lines
4.7 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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