/Разборы задач
6 ноября 2026
Райтап на задачу «Зона риска»
Разбираем генератор ключа и обращаем шифрование в исполняемом файле, чтобы восстановить флаг.7
5

Rev
Задача «ЗаБАГованная башня»
А ну-ка, тут аж заБАГованная башня, так ещё и реверс) Это очень интересно. Для начала скачиваем приложенный файл и смотрим, что за он вообще:
Радуемся, что он не стрипнутый, значит, потенциально мы можем закинуть его в гидру и, не ломая себе глаза, посмотреть на все функции, но надо ли нам это…? Есть вариант сначала потрогать эту прогу руками, поэтому накидываем ей права через команду chmod +x и запускаем:
Ага, ханойская башня, значит, что-то знакомое. Мы знаем, что здесь 3 стержня и 4 диска. Суть задачи — переместить все диски в правильном порядке со стержня 0 на стержень 2. Давайте теперь прогуглим, может, на просторах интернета завалялось готовое решение для нашей головоломки:
Прекрасно, значит, можно просто потыкать немножко по клавиатуре и забрать флажок) Ладно, это всё-таки гордая категория reverse, и в честь уважения к реверсу мы откроем гидру и посмотрим на другие варианты получения флажка:
Тут представлена выжимка самых важных функций из декомпилятора. Теперь пройдёмся по пунктам, почему здесь тяжело что-либо пропатчить. Например, если мы пропатчим функцию isGameComplete, то фактически мы выиграем, но флаг нам не видать. Это происходит из-за того, что флаг не хранится в готовом виде, он собирается напрямую по ходу игры по такой формуле: flag = base64_decode(encoded) XOR key(sequence_of_moves). Нам нужно сделать 15 оптимально верных ходов, которые я приводил в пример выше. Именно в таком случае у нас собирается правильный ключ. Но тут есть и обратная сторона медали.
Если мы преследуем цель именно пропатчить эту прогу, то у нас есть вариант записать тот самый ключ в его хранилище, чтобы нам не приходилось играть в эту башенку, а сразу забрать готовый флажок (опять же, нам нужно знать самый оптимальный вариант решения ханойской башни). Тот самый ключ, который так нам необходим, собирается весьма незамысловатым образом: после каждого хода записываются ровно 3 символа: «1», «from», «to». Условно для первого хода 0 1 → получается 101 → e. Это представлено здесь:
Теперь мы можем получить итоговый ключ, он будет выглядеть так: «efpexyefpnxpefp». Ну и, имея данный ключ, мы можем окончательно пропатчить эту башенку. Важно не забывать, что банально поиграть в эту игру и получить флаг не получится, т. к. там нужно вводить имя Bug, но и это также можно пропатчить):
import sys
import os
import shutil
src = sys.argv[1]
dst = os.path.expanduser("~/hanoi_patched")
shutil.copy2(src, dst)
with open(dst, "r+b") as f:
f.seek(0x2070)
f.write(b"efpexyefpnxpefp\x00")
f.seek(0x15a6)
f.write(bytes.fromhex("488d05c30a0000c3"))
os.chmod(dst, 0o755)
print("OK:", dst)Теперь запускаем и передаём нужные значения через printf, дабы не вводить это руками, слишком мы уж запарились, чтобы заниматься такими делами:
Теперь ходов 0, а флажок у нас))) Наслаждаемся!