Приветствую любителей CTF!
На форуме решения данной задачи не увидел, поэтому выкладываю свое! Вначале нас встречает файл с расширением .pyc. PYC - представляет собой скомпилированный выходной файл, созданный из исходного кода, написанного на языке программирования Python.
Первое, что я решил сделать это перенести файл на машину Kali и там попытаться его запустить. Сразу получаем ошибку:
Ошибка "плохой магический номер" появляется в том случае, если файл .pyc, скомпилированный для одной версии Python, пытается выполняться в другой версии. Проблему можно решить путём удаления файла .pyc и повторной его компиляции в актуальной версии интерпретатора Python. Но это не наш случай, так как исходников у нас нет!
Название файла, дает нам явную подсказку, что нам нужен Python 3.8:
Сначала была идея сделать downgrade до версии 3.8. Но, к счастью, оказалось, что на моей хостовой ОС Windows была установлена версия 3.8.8, и мне удалось запустить этот CrackMe
Отлично! С этим можно работать! Теперь нам нужно декомпилировать файл. Для этого я воспользовался модулем uncompyle6. Установить его можно с помощью следующей команды:
pip install uncompyle6
Далее декомпилируем файл:
Получаем довольно простой исходник:
Вначале кода нас встречают две переменные randb и enc. В них содержатся байтовые последовательности. Далее наши байтовые последовательности "переворачиваются" с помощью [::-1]. Далее мы вводим флаг с клавиатуры, и он кодируется (.encode). Далее сверяется длина нашего флага и байтовой последовательности в enc. Если длина не совпадает, то мы сразу получаем "WRONG FLAG". Если все ОК, то переходим в цикл, в котором в каждой итерации выполняется исключающее ИЛИ (XOR, ^) между элементами байтовых последовательностей randb и enc. Если результат этой логической операции не равен элементу в flag, то f обращается в 0, и мы выходим из цикла, получая "WRONG FLAG". Это как раз то что нам нужно! Модифицируем исходник, оставив только то, что нам нужно для получения флага:
С помощью print выводим результаты логической операции. И чтобы не бегать в ASCII-табличку, используем функцию chr().
Запускаем и получаем флаг:
Всем спасибо за внимание!
На форуме решения данной задачи не увидел, поэтому выкладываю свое! Вначале нас встречает файл с расширением .pyc. PYC - представляет собой скомпилированный выходной файл, созданный из исходного кода, написанного на языке программирования Python.
Первое, что я решил сделать это перенести файл на машину Kali и там попытаться его запустить. Сразу получаем ошибку:
Ошибка "плохой магический номер" появляется в том случае, если файл .pyc, скомпилированный для одной версии Python, пытается выполняться в другой версии. Проблему можно решить путём удаления файла .pyc и повторной его компиляции в актуальной версии интерпретатора Python. Но это не наш случай, так как исходников у нас нет!
Название файла, дает нам явную подсказку, что нам нужен Python 3.8:
Сначала была идея сделать downgrade до версии 3.8. Но, к счастью, оказалось, что на моей хостовой ОС Windows была установлена версия 3.8.8, и мне удалось запустить этот CrackMe
Отлично! С этим можно работать! Теперь нам нужно декомпилировать файл. Для этого я воспользовался модулем uncompyle6. Установить его можно с помощью следующей команды:
pip install uncompyle6
Далее декомпилируем файл:
Получаем довольно простой исходник:
Вначале кода нас встречают две переменные randb и enc. В них содержатся байтовые последовательности. Далее наши байтовые последовательности "переворачиваются" с помощью [::-1]. Далее мы вводим флаг с клавиатуры, и он кодируется (.encode). Далее сверяется длина нашего флага и байтовой последовательности в enc. Если длина не совпадает, то мы сразу получаем "WRONG FLAG". Если все ОК, то переходим в цикл, в котором в каждой итерации выполняется исключающее ИЛИ (XOR, ^) между элементами байтовых последовательностей randb и enc. Если результат этой логической операции не равен элементу в flag, то f обращается в 0, и мы выходим из цикла, получая "WRONG FLAG". Это как раз то что нам нужно! Модифицируем исходник, оставив только то, что нам нужно для получения флага:
С помощью print выводим результаты логической операции. И чтобы не бегать в ASCII-табличку, используем функцию chr().
Запускаем и получаем флаг:
Всем спасибо за внимание!