PNG: une histoire de filtres 4/4 (Stéganographie) - 404CTF 2022

PNG: une histoire de filtres 4/4 (Stéganographie) - 404CTF 2022

Fichiers du challenge Principe:
Analyser les valeurs de filtre des lignes de pixel du IDAT d'un PNG pour y trouver un flag encodé en base 4

Le challenge

Dernier challenge de la série "trouvez le message caché dans le PNG" (dispo ici)

pngsplit, encore

On a l'habitude: on commence par scinder le fichier PNG en chunks (et on vérifie qu'il est bien formé via pngcheck)
Les seuls chunks semblant utiles sont les IDAT on va donc en sortir les données (c'est à dire retirer leurs headers/footers), les fusionner et les décompresser… et ca ne donne rien de fou (juste un "data")

Comprendre le IDAT

On s'intéresse alors plus en détail au contenu du IDAT
D'après la spec PNG, on est capable de comprendre le IHDR et surtout, la taille de l'image

On a aussi la taille dans les propriétés du fichier via Nautilus, mais c'est moins drôle

On peut également lire les autres chunks, mais ils ne servent pas à grand chose (c'est toujours instructif de savoir lire un PNG quand même)

Données extraites

Si on s'intéresse de nouveau aux données extraites des IDAT et à la spec, on s'aperçoit que celle-ci mentionne du "filtering" en début de chaque ligne de pixels
On vérifie par le calcul que le nombre de "pixels" que l'on a dans notre IDAT est égal à [width(=800) * 4(RGBA) + 1 (filter)] * height(=600)
On extrait les valeurs des filtres, car vu le titre du challenge, elles doivent servir à quelque chose
On obtient une suite de chiffres, de 0 à 4 puisqu'il n'y a que 5 types de filtres existants

On constate, à l'oeil, que les chiffres du début sont "bordéliques" et n'ont aucun "4" alors que les chiffres de la fin sont mieux ordonnés, et ont des "4".
Il se peut que le flag soit donc au début, encodé en base 4 (0,1,2,3)

En cherchant notre image PNG sur le net, on trouve des correspondances et en appliquant le même procédé à ces images, on voit que les filtres sont bien plus "ordonnés"

C'est donc un bon indice que les premiers filtres servent sans doute à chiffrer le flag!

Flag

On décode alors les premiers chiffres comme une base 4 qu'on transforme en base 16 et qu'on cait correspondre à la table ASCII: réussite!
404CTF{7h3r3_15_n07h1n9_b4d_4b0u7_sc4nn3rz}
Ce fut motivant de flagger celui-ci car cela m'a pris finalement très peu de temps (peut-etre car je connais bien le format PNG déjà?) et cela m'a ré-ouvert l'accès au Top 10!

Initialement, le "filtering" des lignes de pixel PNG a été créé pour permettre d'assembler les pixels de la façon la plus efficace pour la compression. Ici, cela a été détourné pour stocker un message. Assez malin et élégant, je trouve

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil