Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
— |
forbiddenbits_2013_crunch [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 1: | Ligne 1: | ||
+ | ===== Captain Crunch (250) ====== | ||
+ | <code>Help the captain to find the flag! | ||
+ | http://forbiddenbits.net/tasks/spawn.png</code> | ||
+ | |||
+ | ==== Overview ==== | ||
+ | On se retrouve avec une image PNG toute noir. | ||
+ | |||
+ | ==== Solution ==== | ||
+ | En regardant de plus près, il existe des pixels de (0, 0, 0) et de (1, 1, 1) (RGB). | ||
+ | En convertissant les (0, 0, 0) en Blanc et les (1, 1, 1) en Noir, on se retrouve avec un QRCode. | ||
+ | |||
+ | <code python>from PIL import Image | ||
+ | |||
+ | image = Image.open('spawn.png') | ||
+ | pixels = image.load() | ||
+ | |||
+ | for x in range(0, 300): | ||
+ | for y in range(0, 300): | ||
+ | if pixels[x, y] != (1, 1, 1): | ||
+ | pixels[x, y] = (0, 0, 0) # black | ||
+ | elif pixels[x, y] != (0, 0, 0): | ||
+ | pixels[x, y] = (255, 255, 255) # white | ||
+ | |||
+ | image.save('qrcode.png')</code> | ||
+ | |||
+ | La lecture du QRCode nous donne un lien vers un fichier hébergé sur leur serveur, une suite ? | ||
+ | |||
+ | <code>http://forbiddenbits.net/060645cc5ebdf80e84ebc91547641b49</code> | ||
+ | |||
+ | Il s'agit d'une suite de symbole hexadécimal, vaut mieux les passer en donnée brute afin de mieux voir le problème. | ||
+ | |||
+ | <code python>f = open('060645cc5ebdf80e84ebc91547641b49 ', 'r') | ||
+ | contents = f.read() | ||
+ | f.close() | ||
+ | |||
+ | raw = ''.join([chr(int(contents[i:i+2],16)) for i in range(0, len(contents), 2)]) | ||
+ | |||
+ | f = open('raw.bin', 'wb') | ||
+ | f.write(raw) | ||
+ | f.close()</code> | ||
+ | |||
+ | Le fichier est bien entendu illisible, au possible. | ||
+ | Quelques chaîne de caractères sont quand même lisible: | ||
+ | <code>fbbits</code> | ||
+ | J'ai immédiatement pensé à un simple XOR, et j'avais raison même si pour un raison inconnu, ma première tentative de déchiffrement s'est soldé par un échec. | ||
+ | |||
+ | <code python>f = open('raw.bin', 'rb') | ||
+ | contents = f.read() | ||
+ | f.close() | ||
+ | |||
+ | decoded = '' | ||
+ | |||
+ | for i in range(len(contents)): | ||
+ | decoded += chr(ord(contents[i]) ^ ord('fbbits'[i % len('fbbits')])) | ||
+ | |||
+ | f = open('unxor.bin', 'wb') | ||
+ | f.write(decoded) | ||
+ | f.close()</code> | ||
+ | |||
+ | Le fichier decoded.bin est une image JPEG avec le flag marqué en clair. | ||
+ | |||
+ | ==== Flag ==== | ||
+ | <code>f4a48257817d4a77da31c0c708c836a7</code> |