30 lines
2.2 KiB
Markdown
30 lines
2.2 KiB
Markdown
# Warriors
|
||
|
||
Добро пожаловать на Арену Хроноса. Здесь воины рождаются из байтов памяти. Только Повелитель Времени может манипулировать временной линией без последствий. Сможете ли вы победить Хранителя Целостности и захватить Флаг?
|
||
|
||
## Решение
|
||
|
||
1. Открываем бинарь в **IDA/Ghidra** и разбираем команды меню: `spawn`, `sacrifice`, `scout`, `rewind`, `rename`, `invoke_core`.
|
||
2. Понимаем модель памяти: `Warrior` хранится в куче, а слоты в таблице держат указатели на эти чанки.
|
||
3. Находим уязвимую связку `sacrifice` + `rewind(1)`: после отката в таблице остаётся указатель на уже освобождённый чанк (UAF).
|
||
4. Через `scout(slot, -8, 8)` снимаем `encrypted_next` у освобождённого чанка и получаем `heap_cookie`, нужный для корректного `next`.
|
||
5. Используем `rename(slot, -16, blob)`, чтобы писать перед `name` и подделать заголовок чанка:
|
||
- `checksum = crc32(name)` (4 байта),
|
||
- `pad` (4 байта),
|
||
- `encrypted_next = target ^ cookie` (8 байт),
|
||
- `name` (64 байта).
|
||
6. В качестве `target` выбираем `g_bridge` и отравляем free-list через UAF-объект.
|
||
7. Делаем два `spawn`: первый снимает обычный элемент из списка, второй даёт контролируемую аллокацию в целевой адрес.
|
||
8. Перезаписываем `dispatch` в `g_bridge` адресом `summon_oracle` (например, `b"A"*24 + p64(summon_oracle)`).
|
||
9. Вызываем `invoke_core()` и получаем выполнение `summon_oracle`, после чего появился shell.
|
||
10. В shell читаем флаг:
|
||
|
||
```bash
|
||
cat /app/flag.txt || cat deploy/flag.txt || cat flag.txt
|
||
```
|
||
|
||
Полный PoC: [exploit.py](exploit.py)
|
||
|
||
```bash
|
||
python3 exploit.py
|
||
``` |