Лаборатория TUCTF 2016 - Magic Image

Progressor
, 16 мая 2016

Дан файл encrypted.png и скрипт encrypt.py . Очевидно, картинка зашифрована этим скриптом.

Смотрим шифрующий скрипт на питоне:

#!/usr/bin/env python

def xor(s1, s2):
    res = [chr(0)]*12
    for i in range(len(res)):
        q = ord(s1[i])
        d = ord(s2[i])
        k = q ^ d
        res[i] = chr(k)
    res = ''.join(res)
    return res

def add_pad(msg):
    l = 12 - len(msg)%12
    msg += chr(l)*l
    return msg

with open('flag.png') as f:
    data = f.read()

data = add_pad(data)

with open('key') as f:
    key = f.read()

enc_data = ''
for i in range(0, len(data), 12):
    enc = xor(data[i:i+12], key)
    enc_data += enc

with open('encrypted.png', 'wb') as f:
    f.write(enc_data)

Скрипт очень простой, шифрование еще проще. Шифрование - это последовательный ксор с двенадцатибайтным ключом. Ключ нам неизвестен, но мы знаем формат png файла, поэтому просто берем любой png файл (его первые 12 байт) и ксорим с нашим шифртекстом. Далее скрипт на руби, который решает задание:

#get first 12 bytes of any valid PNG file
s=File.new("logo.png","rb").read
opentext = s[0...12]

#read encrypted file
s = File.new("encrypted.png","rb").read

#create new file for decrypted image
f = File.new("decrypted.png","wb")

#get key: ciphertext=opentext^key  => key=opentext^ciphertext
key=""
for i in 0...12
	k = opentext[i]^s[i]
	key+=k.chr
end

#xor every 12 bytes of encrypted.png with key
out = " "*s.size
c=0
for j in 0...s.size/12
	for i in 0...12
		k = key[i]^s[j*12+i]
		out[c]=k.chr
		c+=1
	end
end

#write to file
f.puts out
f.close