Каждый год команды SANS и Counter Hack Challenges проводят мое любимое соревнование по захвату флага (CTF) — SANS Holiday Hack Challenge. 2020 SANS Holiday Hack Challenge с участием KringleCon 3: French Hens! проходил в недавно отреставрированном замке Санты на Северном полюсе с 10 декабря 2020 года по 11 января 2021 года. Это пошаговое руководство по завершающему этапу мероприятия.

В комнате неподготовленности спикеров я встретил Тэнгла Угольника, который познакомил меня с игрой в снежки. Он указал, что игра довольно проста в простом режиме, но практически невозможна в невозможном режиме. Итак, он бросил мне вызов в невозможном режиме!

Я начал с того, что сыграл раунд игры в простом режиме. Это была игра в стиле линкора, в которой я должен был уничтожить все снежные форты моего противника, прежде чем они уничтожили мою. В простом режиме казалось, что компьютер целился случайным образом, иногда даже дважды целился в одно и то же место в одной и той же игре.

Я заглянул в исходный код игры и сразу обнаружил, что каждый из уровней сложности, которые вы можете выбрать при запуске игры, вызывает функцию JavaScript, либо запрещающую вам изменять имя, либо разрешающую это.

Затем я загрузил игру в невозможном режиме. Конечно же, это не позволило бы мне установить имя. Я даже пытался перезаписать его, манипулируя кодом. Похоже, они проводят проверки на стороне сервера, чтобы обеспечить это. В невозможном режиме мне тоже не отображалось мое имя.

Я посмотрел исходный код невозможного режима и нашел комментарии, указывающие, какие семена были опробованы. Загрузка этого несколько раз показала, что каждый раз, когда игра загружается в невозможном режиме, игра пробует 624 семени и выбрасывает каждое из них, а затем, кажется, использует 625-е семя. Кроме того, казалось, что использование 625-го семени означало, что это семя стало именем игрока. Я определил это, взглянув на другие уровни сложности и увидев, что имена следуют за 32-битной строкой, содержащей только числа.

В этот момент я переключил передачу и начал смотреть конференцию Тома Листона по алгоритмам Mersenne Twister. Я узнал, что Python использует алгоритм скручивания Мерсенна для реализации своего генератора псевдослучайных чисел, и что, учитывая достаточное количество недавних начальных значений (точнее, 624), вы можете предсказать со 100% точностью все будущие начальные значения. Том даже предоставил мне сценарий, чтобы я начал.

Моя цель состояла в том, чтобы изменить сценарий, предоставленный Томом Листоном, чтобы предсказать значение имени игрока, используя 624 начальных значения для предсказания 625-го начального значения. Затем я решал эту головоломку в простом режиме, чтобы найти решение, и реализовывал решение в невозможном режиме, чтобы выиграть игру.

Во-первых, я изменил скрипт Тома, чтобы он извлекал начальные значения из CSV-файла, а не генерировал их. Я загрузил игру и скопировал начальные значения в файл csv. Я сохранил начальные значения в списке, называемом начальными значениями.

Затем я создал экземпляр класса mt19937, который предоставил Том, под названием myprng. Я не вносил никаких изменений в этот класс. Создав класс, я использовал значения выброшенных семян, хранящиеся в объекте seed, прогнал их через функцию untemper и сохранил в списке значений объекта myprng.

Наконец, я позвонил myprng.extract_number(), чтобы получить следующий ожидаемый номер. Если все сработало, когда я запустил этот код, следующее напечатанное число должно соответствовать имени игрока в игре, в которую я играл.

Я запустил код, и следующее число, которое я получил, было 2687236162. Я убедился, что это сработало, загрузив игру в простом режиме и убедившись, что моя доска выглядит так же. Это подтвердило, что я создал процесс, который мог точно предсказать, на какой доске я играю. Я использовал это, чтобы решить игру в простом режиме, который показан ниже, где не выбран только последний квадрат (6,3).

Я ввел это решение в игру в невозможном режиме и выиграл игру!

Хотите узнать больше о конкурсе SANS Holiday Hack Challenge 2020? Ознакомьтесь с другими моими пошаговыми руководствами, доступными здесь.