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