Simple Crypto

В этом задании нам было предоставлено два файла: зашифрованный флаг (flag.enc) и скрипт на python (simple.py), используемый для шифрования (код которого представлен ниже).

flag.enc [443 КБ]

#!/usr/bin/python

import random
from secret import FLAG 

KEY = 'musZTXmxV58UdwiKt8Tp'

def xor_str(x, y):
    if len(x) > len(y):
        return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x[:len(y)], y)])
    else:
        return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x, y[:len(x)])])

flag, key = FLAG.encode('hex'), KEY.encode('hex')
enc = xor_str(key * (len(flag) // len(key) + 1), flag).encode('hex')

ef = open('flag.enc', 'w')
ef.write(enc.decode('hex'))
ef.close()

Как видно из кода, здесь используется простой XOR, про который известно, что x ⊕ y == y ⊕ x. Т.о. все, что необходимо для расшифровки — это еще раз «проксорить» флаг с ключом KEY.
Немного отредактируем исходный код:

#!/usr/bin/python

KEY = 'musZTXmxV58UdwiKt8Tp'
FLAG_f = open("flag.enc", "rb")
flag = FLAG_f.read();
FLAG_f.close()

def xor_str(x, y):
    if len(x) > len(y):
        return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x[:len(y)], y)])
    else:
        return ''.join([chr(ord(z) ^ ord(p)) for (z, p) in zip(x, y[:len(x)])])

key = KEY.encode('hex')
dec = xor_str(key * (len(flag) // len(key) + 1), flag)

ef = open('flag_res.dec', 'wb')
ef.write(dec.decode('hex'))
ef.close()

Запускаем, открываем в текстовом редакторе полученный файл flag_res.dec. В самом начале видим ‰PNG — понимаем, что перед нами картинка. Меняем расширение файла (flag_res.png) и открываем.
Расшифрованный флаг
Флаг — ASIS{juSt_S!mpl3_Cryp7o_f0r_perFect_guy5_l1ke_You!}


Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *