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

2.2 KiB
Raw Permalink Blame History

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 читаем флаг:
cat /app/flag.txt || cat deploy/flag.txt || cat flag.txt

Полный PoC: exploit.py

python3 exploit.py