ANTICHAT

ANTICHAT (https://forum.antichat.xyz/index.php)
-   Задания/Квесты/CTF/Конкурсы (https://forum.antichat.xyz/forumdisplay.php?f=112)
-   -   Файлы PYC [Writeup] (https://forum.antichat.xyz/showthread.php?t=1643136)

CyberDen 08.03.2024 03:02

Приветствую любителей CTF!

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

pip install uncompyle6

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

https://forum.antichat.xyz/attachmen...10685/2024.png

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

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

https://forum.antichat.xyz/attachmen...10685/2024.png

Всем спасибо за внимание!

yetiraki 08.03.2024 12:05

Нууу, например вот =)))

Конечно мой более простой

CyberDen 08.03.2024 12:08

Цитата:


yetiraki сказал(а):

Нууу, например вот =)))

Конечно мой более простой


Увидел уже после написания! Много CTF-решений не бывает =)


Время: 20:23