Files
Geroi-Kodeksa/Warriors-Pwn/README.md
2026-03-02 21:44:22 +03:00

30 lines
2.2 KiB
Markdown
Raw Permalink 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.
# 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
```