Райтап на задачу «ЗаБАГованная башня»

lol

Автор:

lol

6 ноября 2026

5

06.11.2026
ЗаБАГованная башня
Категория:

Rev

Задача «ЗаБАГованная башня»

LastTeamLead

Автор:

LastTeamLead

Первая кровь:
broken_reality
Сложность:
medium
Дата публикации:
15.11.2025
Решений:
105
Рейтинг:
5/5
Ссылка:
Решать

А ну-ка, тут аж заБАГованная башня, так ещё и реверс) Это очень интересно. Для начала скачиваем приложенный файл и смотрим, что за он вообще:

Решение задачи «ЗаБАГованная башня»: иллюстрация 1

Радуемся, что он не стрипнутый, значит, потенциально мы можем закинуть его в гидру и, не ломая себе глаза, посмотреть на все функции, но надо ли нам это…? Есть вариант сначала потрогать эту прогу руками, поэтому накидываем ей права через команду chmod +x и запускаем:

Решение задачи «ЗаБАГованная башня»: иллюстрация 2

Ага, ханойская башня, значит, что-то знакомое. Мы знаем, что здесь 3 стержня и 4 диска. Суть задачи — переместить все диски в правильном порядке со стержня 0 на стержень 2. Давайте теперь прогуглим, может, на просторах интернета завалялось готовое решение для нашей головоломки:

Решение задачи «ЗаБАГованная башня»: иллюстрация 3

Прекрасно, значит, можно просто потыкать немножко по клавиатуре и забрать флажок) Ладно, это всё-таки гордая категория reverse, и в честь уважения к реверсу мы откроем гидру и посмотрим на другие варианты получения флажка:

Решение задачи «ЗаБАГованная башня»: иллюстрация 4
Решение задачи «ЗаБАГованная башня»: иллюстрация 5
Решение задачи «ЗаБАГованная башня»: иллюстрация 6

Тут представлена выжимка самых важных функций из декомпилятора. Теперь пройдёмся по пунктам, почему здесь тяжело что-либо пропатчить. Например, если мы пропатчим функцию isGameComplete, то фактически мы выиграем, но флаг нам не видать. Это происходит из-за того, что флаг не хранится в готовом виде, он собирается напрямую по ходу игры по такой формуле: flag = base64_decode(encoded) XOR key(sequence_of_moves). Нам нужно сделать 15 оптимально верных ходов, которые я приводил в пример выше. Именно в таком случае у нас собирается правильный ключ. Но тут есть и обратная сторона медали.

Если мы преследуем цель именно пропатчить эту прогу, то у нас есть вариант записать тот самый ключ в его хранилище, чтобы нам не приходилось играть в эту башенку, а сразу забрать готовый флажок (опять же, нам нужно знать самый оптимальный вариант решения ханойской башни). Тот самый ключ, который так нам необходим, собирается весьма незамысловатым образом: после каждого хода записываются ровно 3 символа: «1», «from», «to». Условно для первого хода 0 1 → получается 101 → e. Это представлено здесь:

Решение задачи «ЗаБАГованная башня»: иллюстрация 7

Теперь мы можем получить итоговый ключ, он будет выглядеть так: «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)
Решение задачи «ЗаБАГованная башня»: иллюстрация 8

Теперь запускаем и передаём нужные значения через printf, дабы не вводить это руками, слишком мы уж запарились, чтобы заниматься такими делами:

Решение задачи «ЗаБАГованная башня»: иллюстрация 9

Теперь ходов 0, а флажок у нас))) Наслаждаемся!

Если вы нашли опечатку или ошибку, пожалуйста, выделите фрагмент текста и нажмите Ctrl+Enter

Также по теме:

Райтап на задачу «Зона риска»

/Разборы задач

Райтап на задачу «Зона риска»

Разбираем генератор ключа и обращаем шифрование в исполняемом файле, чтобы восстановить флаг.
Прочитать

7

Райтап на задачу «Bogosort»

/Разборы задач

Райтап на задачу «Bogosort»

Восстанавливаем флаг из значений синуса и анаграммы, не дожидаясь случайной сортировки.
Прочитать

5