В этом задании нам было предоставлено два файла: зашифрованный флаг (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!}