Files
2026-03-02 21:44:22 +03:00
..
2026-03-02 21:44:22 +03:00
2026-03-02 21:44:22 +03:00

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