HTML Diff
0 added 0 removed
Original 2026-01-01
Modified 2026-03-10
1 <p>Теги: реверс-инжиниринг, обратная разработка кода, reverse engineering, ctf</p>
1 <p>Теги: реверс-инжиниринг, обратная разработка кода, reverse engineering, ctf</p>
2 <p>Продолжаем разбор некоторых задач по реверс-инжинирингу, проводимых в рамках CTF-соревнований. Предыдущие задачи можно посмотреть<a>здесь</a>и<a>здесь</a>. В этот раз для выполнения задания надо было подобрать пароль к вратам, за которыми держали в плену нашего второго пилота.</p>
2 <p>Продолжаем разбор некоторых задач по реверс-инжинирингу, проводимых в рамках CTF-соревнований. Предыдущие задачи можно посмотреть<a>здесь</a>и<a>здесь</a>. В этот раз для выполнения задания надо было подобрать пароль к вратам, за которыми держали в плену нашего второго пилота.</p>
3 <h2>Условие</h2>
3 <h2>Условие</h2>
4 <p><em>*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.</em></p>
4 <p><em>*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.</em></p>
5 <p>The inscription on the archivolt read:</p>
5 <p>The inscription on the archivolt read:</p>
6 <p>"The Doors of Dorun, Lord of Omega. Speak, friend, and enter. I, Norvy, made them. Calabrimbor of Alpha Centauri drew these signs".</p>
6 <p>"The Doors of Dorun, Lord of Omega. Speak, friend, and enter. I, Norvy, made them. Calabrimbor of Alpha Centauri drew these signs".</p>
7 <p>But be careful and hurry up. They can be back any moment.*</p>
7 <p>But be careful and hurry up. They can be back any moment.*</p>
8 <h2>Решение</h2>
8 <h2>Решение</h2>
9 <p>В первую очередь, мы запускаем CrackMe, и на экране появляется следующее окно:</p>
9 <p>В первую очередь, мы запускаем CrackMe, и на экране появляется следующее окно:</p>
10 <p>Попробуем ввести любое слово и нажать "Try", но пароль не подходит, и мы видим такое сообщение:</p>
10 <p>Попробуем ввести любое слово и нажать "Try", но пароль не подходит, и мы видим такое сообщение:</p>
11 <p>Сам по себе CrackMe представляет собой 64-битный исполняемый файл PE-формата. Откроем его в IdaPro и попробуем найти строчку "the door is still closed!":</p>
11 <p>Сам по себе CrackMe представляет собой 64-битный исполняемый файл PE-формата. Откроем его в IdaPro и попробуем найти строчку "the door is still closed!":</p>
12 <p>На эту строчку существует только одна перекрестная ссылка:</p>
12 <p>На эту строчку существует только одна перекрестная ссылка:</p>
13 <p>Вот функция, в которой IdaPro нашла обращения к этой строчке:</p>
13 <p>Вот функция, в которой IdaPro нашла обращения к этой строчке:</p>
14 <p>Здесь мы также видим зашифрованный флаг (легко убедится, что функция sub_140001160 занимается дешифровкой) и функцию, определяющую правильность пароля: "sub_1400012C0". При помощи GetDlgItemTextW в эту функцию передаётся строка, введённая в поле для ввода пароля. Проанализируем эту функцию:</p>
14 <p>Здесь мы также видим зашифрованный флаг (легко убедится, что функция sub_140001160 занимается дешифровкой) и функцию, определяющую правильность пароля: "sub_1400012C0". При помощи GetDlgItemTextW в эту функцию передаётся строка, введённая в поле для ввода пароля. Проанализируем эту функцию:</p>
15 <p>Здесь прослеживается цикл и два массива из пяти элементов. Также происходит проверка длины введённого пароля:</p>
15 <p>Здесь прослеживается цикл и два массива из пяти элементов. Также происходит проверка длины введённого пароля:</p>
16 <p>Проанализировав эту функцию, мы видим, что пароль из четырёх символов в кодировке UTF-16 (кодировка для WideChar в Windows) состоит из двух чисел c размером DWORD. Далее, мы видим, что остатки от деления этих чисел на числа<em>((1 &lt;&lt; (1 &lt;&lt; i)) + 1)</em>сравниваются с захардкоженными значениями.</p>
16 <p>Проанализировав эту функцию, мы видим, что пароль из четырёх символов в кодировке UTF-16 (кодировка для WideChar в Windows) состоит из двух чисел c размером DWORD. Далее, мы видим, что остатки от деления этих чисел на числа<em>((1 &lt;&lt; (1 &lt;&lt; i)) + 1)</em>сравниваются с захардкоженными значениями.</p>
17 <p>Можно заметить, что<em>((1 &lt;&lt; (1 &lt;&lt; i)) + 1) = 2^(2^i) + 1</em>, и что это числа Ферма: 3, 5, 17, 257, 65537. Алгоритм проверки пароля далее можно свести к двум системам сравнений:</p>
17 <p>Можно заметить, что<em>((1 &lt;&lt; (1 &lt;&lt; i)) + 1) = 2^(2^i) + 1</em>, и что это числа Ферма: 3, 5, 17, 257, 65537. Алгоритм проверки пароля далее можно свести к двум системам сравнений:</p>
18 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<p>Восстановить исходные числа нам поможет Китайская теорема об остатках. В интернете можно найти решатели таких сравнений:</p>
18 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<p>Восстановить исходные числа нам поможет Китайская теорема об остатках. В интернете можно найти решатели таких сравнений:</p>
19 <p>Итак, мы получили два числа, которые теперь необходимо преобразовать в строку UTF16. Для этого можно использовать Python (при этом не забываем про обратный порядок байт):</p>
19 <p>Итак, мы получили два числа, которые теперь необходимо преобразовать в строку UTF16. Для этого можно использовать Python (при этом не забываем про обратный порядок байт):</p>
20 <p>Теперь осталось проверить полученный результат. Введём эту строку в окно для ввода пароля.</p>
20 <p>Теперь осталось проверить полученный результат. Введём эту строку в окно для ввода пароля.</p>
21 <p>Вот и всё! Мы открыли врата.</p>
21 <p>Вот и всё! Мы открыли врата.</p>
22 <p>Ответ:<em>ctfzone{ch1n4_t0wn}</em></p>
22 <p>Ответ:<em>ctfzone{ch1n4_t0wn}</em></p>
23 <p><em>За подготовку материала выражается благодарность CTF-сообществу и специалистам из компании<a>BI.ZONE</a>.</em></p>
23 <p><em>За подготовку материала выражается благодарность CTF-сообществу и специалистам из компании<a>BI.ZONE</a>.</em></p>
24  
24