CyberDen

Green Team
11.11.2021
11
41
BIT
190
Приветствую любителей CTF!

На форуме решения данной задачи не увидел, поэтому выкладываю свое! Вначале нас встречает файл с расширением .pyc. PYC - представляет собой скомпилированный выходной файл, созданный из исходного кода, написанного на языке программирования Python.

2024-03-08_011045.jpg


Первое, что я решил сделать это перенести файл на машину Kali и там попытаться его запустить. Сразу получаем ошибку:

2024-03-08_011556.jpg


Ошибка "плохой магический номер" появляется в том случае, если файл .pyc, скомпилированный для одной версии Python, пытается выполняться в другой версии. Проблему можно решить путём удаления файла .pyc и повторной его компиляции в актуальной версии интерпретатора Python. Но это не наш случай, так как исходников у нас нет! :)

Название файла, дает нам явную подсказку, что нам нужен Python 3.8:

2024-03-08_012024.jpg


Сначала была идея сделать downgrade до версии 3.8. Но, к счастью, оказалось, что на моей хостовой ОС Windows была установлена версия 3.8.8, и мне удалось запустить этот CrackMe :)

2024-03-08_012218.jpg


Отлично! С этим можно работать! Теперь нам нужно декомпилировать файл. Для этого я воспользовался модулем uncompyle6. Установить его можно с помощью следующей команды:

pip install uncompyle6

Далее декомпилируем файл:

2024-03-08_012708.jpg


Получаем довольно простой исходник:

2024-03-08_012819.jpg


Вначале кода нас встречают две переменные randb и enc. В них содержатся байтовые последовательности. Далее наши байтовые последовательности "переворачиваются" с помощью [::-1]. Далее мы вводим флаг с клавиатуры, и он кодируется (.encode). Далее сверяется длина нашего флага и байтовой последовательности в enc. Если длина не совпадает, то мы сразу получаем "WRONG FLAG". Если все ОК, то переходим в цикл, в котором в каждой итерации выполняется исключающее ИЛИ (XOR, ^) между элементами байтовых последовательностей randb и enc. Если результат этой логической операции не равен элементу в flag, то f обращается в 0, и мы выходим из цикла, получая "WRONG FLAG". Это как раз то что нам нужно! Модифицируем исходник, оставив только то, что нам нужно для получения флага:

2024-03-08_014520.jpg


С помощью print выводим результаты логической операции. И чтобы не бегать в ASCII-табличку, используем функцию chr().

Запускаем и получаем флаг:

2024-03-08_015145.jpg


Всем спасибо за внимание!
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!