ОБСУЖДЕНИЕ Writeup 

Файлы PYC [Writeup]

AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Приветствую любителей 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


Всем спасибо за внимание!
 
  • Нравится
Реакции: Dzen, yetiraki, vov4ick и ещё 3
6