» » UFOCTF 2017: декомпилируем Python в задании King Arthur (PPC600)

 

UFOCTF 2017: декомпилируем Python в задании King Arthur (PPC600)

Автор: admin от 3-04-2017, 21:00, посмотрело: 149

UFOCTF 2017: декомпилируем Python в задании King Arthur (PPC600)
Приветствую тебя хабраюзер! Недавно, закончилась ежегодная олимпиада по информационной безопасности UFO CTF 2017. В этой статье будет райтап одного задания из раздела PPC, под названием «King Arthur», за который можно было получить максимальное количество очков — 600.

Начнём


В описании к заданию было следующее:
Мы получили какое-то странное вложение в e-mail от фаната рыцарей. Помогите разобраться, что имел в виду автор.

И был доступен для скачивания файл:


Сразу привлекает внимание строка import serpent. По запросу «python serpent sword» в гугл можно наткнуться на git-репозиторий, который судя по описанию — как раз то что нам нужно.

Изучив код serpent.py находим там описание принципа «превращения» кода в меч:

Given the hex digit 65:
65 % 32 = 1
floor( 65 / 32 ) = 2
so the alphabet symbol for 65 is the symbol at index 1: 'PT'.
65 is also the 3rd occurrence of a 32-modulus of 1 (with 1
being the first occurrence and 33 being the second of course.)
so the code for this hex symbol is PT2

Но самое интересное расположено ниже:

elif scriptType is _SERPENT:

    pyc = _serpent_sword_alphabet_to_hex(_lex_hex(sys.argv[0]))
    pycout = ".".join(sys.argv[0].split(".")[0:-1])+".pyc"

    with open(pycout, "wb") as f:
        for val in pyc:
        f.write(chr(val))

Этот код, считывает преобразованный файл, и переводит его обратно в .pyc. Переименуем файл sword.py в sword.ss.py и попробуем его обратить:

gh0st3rs@gh0st3rs-pc:KingArthur$ python sword.ss.py 
RuntimeError: Bad magic number in .pyc file

Немного изменив код, таким образом чтобы файл sword.ss.pyc не удалялся обнаруживаем, что у полученного файла поврежден заголовок.

После долгих поисков, находим примерное описание заголовка .pyc файла. Но все попытки изменить его на верный не увенчались успехом.

Там же в статье, есть пример компиляции не всего файла, а отдельного участка кода. Вероятно таким же образом получится минуя заголовок, восстановить оставшуюся часть кода. Накидаем для этих целей небольшой скрипт:


После запуска получаем вывод:

gh0st3rs@gh0st3rs-pc:KingArthur$ ./unserpent.py sword.ss.py
Offset found: 7
	argcount: 0
	code: 6401006400006c00005a00006402008400005a01006501008300000164000053
	consts count: 3
		<type 'NoneType'>: None
		<type 'int'>: -1
		<type 'code'>: <code object task at 0x7f7e85aa9eb0, file "D:DownloadsUFOCTFTASKSserpentsourcesSerpent-masterSerpent-mastertest.py", line 4>
	filename: D:DownloadsUFOCTFTASKSserpentsourcesSerpent-masterSerpent-mastertest.py
	firstlineno: 1
	flags: 0
	name: <module>
	nlocals: 0
	stacksize: 2
	varnames count: 2
		'serpent'
		'task'

Как можно заметить, тут есть ещё 1 объект code, он то нам и нужен. Добавим ещё пару строк, для его декомпиляции:

import uncompyle6
...
uncompyle6.main.uncompyle(2.7, code.co_consts[2], sys.stdout)

Снова запускаем и получаем готовый скрипт:

# uncompyle6 version 2.9.10
# Python bytecode 2.7
# Decompiled from: Python 2.7.6 (default, Oct 26 2016, 20:30:19) 
# [GCC 4.8.4]
# Embedded file name: D:DownloadsUFOCTFTASKSserpentsourcesSerpent-masterSerpent-mastertest.py
line = raw_input('Enter line: n')
if line[:14:2] != 'XMg9v66':
    print 'Fail!'
elif line[14::2] != 'yBfBg9va':
    print 'Fail!'
elif line[-15:-30:-2] != 'Y1PXqggB':
    print 'Fail!'
elif line[-1:-14:-2] != '3W74khw':
    print 'Fail!'
else:
    print 'Success!'

Осталось дело за малым, по полученному коду восстанавливаем флаг:
ufoctf{XBMggg9qvX6P61yYBwfhBkg497vWa3}

Задание пройдено! +600 к рейтингу!

Источник: Хабрахабр

Категория: Информационная безопасность

Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Добавление комментария

Имя:*
E-Mail:
Комментарий:
Полужирный Наклонный текст Подчеркнутый текст Зачеркнутый текст | Выравнивание по левому краю По центру Выравнивание по правому краю | Вставка смайликов Выбор цвета | Скрытый текст Вставка цитаты Преобразовать выбранный текст из транслитерации в кириллицу Вставка спойлера
Введите два слова, показанных на изображении: *