Разбор задач из CTF по реверсу: The Doors of Dorun | OTUS

Разбор задач из CTF по реверсу: The Doors of Dorun

Revers_deep_23.3-5020-c011ce.png

Продолжаем разбор некоторых задач по реверс-инжинирингу, проводимых в рамках CTF-соревнований. Предыдущие задачи можно посмотреть здесь и здесь. В этот раз для выполнения задания надо было подобрать пароль к вратам, за которыми держали в плену нашего второго пилота.

Условие

*A.U.R.O.R.A.: Lieutenant, your co-pilot was abducted by aliens and put into prison. They are out hunting now and it’s your chance to set him free! He is held behind the Doors, the jambs invisible to the eye, and matched so perfectly with the metal bulkhead that when closed the Doors could not be seen.

The inscription on the archivolt read:

"The Doors of Dorun, Lord of Omega. Speak, friend, and enter. I, Norvy, made them. Calabrimbor of Alpha Centauri drew these signs".

But be careful and hurry up. They can be back any moment.*

Решение

В первую очередь, мы запускаем CrackMe, и на экране появляется следующее окно:

09a3bdd736434248a50d173fef8ac646_1-20219-189d48.png

Попробуем ввести любое слово и нажать «Try», но пароль не подходит, и мы видим такое сообщение:

d46a0c24cbd04c5780a48325b238540d_1-20219-cbde44.png

Сам по себе CrackMe представляет собой 64-битный исполняемый файл PE-формата. Откроем его в IdaPro и попробуем найти строчку «the door is still closed!»:

1f8cc51f0758498f9a437601b013b39d_1-20219-d1a9b4.png

На эту строчку существует только одна перекрестная ссылка:

48e5baa42b8b43479a55e3bd99113c50_1-20219-0ffa03.png

Вот функция, в которой IdaPro нашла обращения к этой строчке:

01dd8f508b8b4e8bac8dd2a9f51cfa5d_1-20219-55f96d.png

Здесь мы также видим зашифрованный флаг (легко убедится, что функция sub_140001160 занимается дешифровкой) и функцию, определяющую правильность пароля: «sub_1400012C0». При помощи GetDlgItemTextW в эту функцию передаётся строка, введённая в поле для ввода пароля. Проанализируем эту функцию:

15d065dae0e44147a3ceb2ff2696adf6_1-20219-851689.png

Здесь прослеживается цикл и два массива из пяти элементов. Также происходит проверка длины введённого пароля:

1973f109d30a4cb086f7dcf4e53d5a3d_1-20219-232275.png

Проанализировав эту функцию, мы видим, что пароль из четырёх символов в кодировке UTF-16 (кодировка для WideChar в Windows) состоит из двух чисел c размером DWORD. Далее, мы видим, что остатки от деления этих чисел на числа ((1 << (1 << i)) + 1) сравниваются с захардкоженными значениями.

Можно заметить, что ((1 << (1 << i)) + 1) = 2^(2^i) + 1, и что это числа Ферма: 3, 5, 17, 257, 65537. Алгоритм проверки пароля далее можно свести к двум системам сравнений:

X1 % 3 = 0
X1 % 5 = 0
X1 % 17 = 1
X1 % 257 = 241
X1 % 65537 = 995
X2 % 3 = 1
X2 % 5 = 4
X2 % 17 = 6
X2 % 257 = 104
X2 % 65537 = 413

Восстановить исходные числа нам поможет Китайская теорема об остатках. В интернете можно найти решатели таких сравнений:

2a3e911d41a04670908823b5ca32a248_1-20219-1cba20.png

505b4ad825eb4ad4a07edded5785d8b5_1-20219-d9fce5.png

Итак, мы получили два числа, которые теперь необходимо преобразовать в строку UTF16. Для этого можно использовать Python (при этом не забываем про обратный порядок байт):

ef04bdb9fce84f848c05cd7f0c1fa764_1-20219-1943ad.png

Теперь осталось проверить полученный результат. Введём эту строку в окно для ввода пароля.

3d81e3fceec44748a2201e0c979142ba_1-20219-d2e3b0.png

904a9d4bc967431ba1973c46c16252bb_1-20219-979d30.png

Вот и всё! Мы открыли врата.

Ответ: ctfzone{ch1n4_t0wn}

За подготовку материала выражается благодарность CTF-сообществу и специалистам из компании BI.ZONE.

Не пропустите новые полезные статьи!

Спасибо за подписку!

Мы отправили вам письмо для подтверждения вашего email.
С уважением, OTUS!

Автор
0 комментариев
Для комментирования необходимо авторизоваться
Популярное
Сегодня тут пусто