mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
50 lines
4.7 KiB
Markdown
50 lines
4.7 KiB
Markdown
# 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}}
|