UfoCTF 2013 | CryptoMAX [Write Up]

Dans cette épreuve, nous avons une image chiffrée, et le script python qui s’en est occupé :

import Image

img = Image.open( "img.png" )
width, height = img.size
pix = img.load()
result = ""

def magic( pix ):
	k = 1.158371
	res = (pix[0]&0x1f)*k+(pix[1]&0x3f)*k+(pix[2]&0x7f)*k
	return int( res )

for w in range(width):
	for h in range(height):
		result += chr( magic( pix[w,h] ) )

open("img.encode","wb").write( result )

Ce que fait ce programme est très simple : pour chaque pixel, on prend leur composantes, auxquelles on masque des bits, puis on les multiplie par une constante k, et on fait la somme. Pour chaque pixel de l’image, nous avons donc un octet dans le fichier chiffré.

Voici un script python qui s’occupe de reverse ce fichier afin de recréer l’image originale (en noir et blanc, l’algorithme étant théoriquement impossible à reverse complètement) :

import Image

width = 300
height = 300

im = Image.new('RGB', (width, height))
pix = im.load()
buff = open('img.encode', 'rb').read()

k = 1.158371
c = 0

for w in range(width):
	for h in range(height):
		i = (int(((ord(buff[c]) / k) + 0) / 3) & 0x40) and 255 or 0
		pix[w, h] = (i,) * 3
		c += 1

im.save('qrcode.png')

On obtient donc l’image déchiffrée, qui n’est rien d’autre qu’un QR Code.

img

Une fois décodé grâce à des outils online tels zxing, nous obtenons la chaîne de caractères suivante :

9rypBzr_GB_7sBP6S

À partir de là commence la grosse partie « guessing » de l’épreuve. (oui, il en fallait une!)
On remarque assez facilement un ROT13, qui donnerait quelque chose du style :

9elcOme_TO_7fOC6F

On peut déjà deviner le flag : quelque chose ressemblant à « WelcOme_TO_UfOCTF ».
Nous avons quasiment tout essayé : avec des chiffres, en changeant la casse, sans underscores…
Nous avons même trouvé une logique dans les chiffres ; en prenant a = 0, b = 1 … et ce jusqu’à z = 25, et que l’on transformait 9 , 7 et 6 de cette manière, on obtenait un nouveau ciphertext :

JrypBzr_GB_HsBPGS

…ce qui donne bien, après ROT13 :

WelcOme_TO_UfOCTF

Il fallait à partir de là deviner la casse utilisée (après multiple dérangements sur l’IRC du CTF…)
Le flag était… Welcome_to_UfoCTF !

Enjoy.

Laisser un commentaire