128code128 (Programmation) - 404CTF 2022

128code128 (Programmation) - 404CTF 2022

Fichiers du challenge Principe:
Créer un programme qui déchiffrera un PNG contenant un code à barres (code128) écrit à l'envers et renverra la valeur déchiffrée (100x de suite) pour obtenir le flag

Le challenge

Le challenge nous demande de résoudre des énigmes à la volée (fichiers dispo ici) en nous connectant au serveur du challenge

Enigmes

Une connection manuelle nous permet de voir que l'énigme est un base64, et qu'il y a une limite de temps

Comme une nouvelle connexion renvoit un autre base64, cela signifie qu'il faudra programmer un résolveur automatique et autonome, pour rester dans les temps.

PNG

En décodant le abse64, on reconnait la signature d'un PNG (PNG et IHDR bloc)
L'image est apparemment un genre de code à barres
On va donc le convertir en binaire avec l'hypothèse blanc = 0

Décoder

Je pensais que le code à barres serait un simple ASCII, mais non: je n'ai pas un multiple de 8 bits!
En sauvegardant plusieurs PNG récupérés, j'observe que le nombre de bits varie, mais qu'il y en a toujours un multiple de 11

Analyse

Ayant plusieurs PNG, j'analyse alors les codes de 11 bits récupérés: 62 patterns différents pile poil! soit 26 (minuscules) + 26 (majuscules) + 10 (chiffres)
Le titre du challenge me semblait suspicieux, et je me suis dit: est-ce qu'un code existe avec ce nom? oui !

Code 128

Dans wikipedia, on voir que le code 128 est basé sur un code à barres de 11 bits, ça sent le bingo!
J'essaie alors de voir si un lecteur standard existe directement pour lire ça: zbarimg semblait pas mal

En pratique, il n'a pas marché, bien qu'il dise le prendre en charge. Apparemment, il devait manquer le "magic number" (un header en barres) qui permet de repérer le code128

L'astuce de la flemme

Petite astuce pour ne pas passer longtemps à recopier la table: utiliser la console du navigateur
On fait alors un querySelectorAll sur la table pour récupérer les codes ASCII et les codes binaires correspondants

Résolution

Mon script terminé, je le lance et paf, échec: un code binaire n'est pas dans la table!

Pourtant, les 0 et les 1 ne semblent pas inversés: le code inverse n'est pas non plus dans la table

En réfléchissant un peu plus, j'ai remarqué que le code binaire était dans la table si on le lit de droite à gauche, donc, j'inverse mon sens de lecture et bingo!
On teste cela sur tous les PNG que j'ai pu récolter: ça semble marcher

Lancement

On lance le script avec, cette fois, les entrées/sorties du challenge et ça marche presque
L'erreur (code vide) venait d'un espace en trop: un trim et ça repart!
On récupère le flag après un certain nombre de challenges:
404CTF{W0w_c0d3_128_4_pLUs_4uCuN_s3cr3t_p0uR_t01}

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil