Du 10 au 25 Octobre, j’ai participé à un CTF étudiant organisé dans le cadre de l'European Cyber Week. J’ai pu me qualifier pour participer à la finale à Rennes pour représenter l’Université de Paris.

Aujourd’hui je vous fais un petit write-up sur le challenge The Prestige parce que Alexrex en voulait un j’ai bien aimé le challenge (^.~)

Pour mes amis anglophones, je fais le write-up en français car c’était un CTF principalement pour français <(_ _)>

Contexte

In this challenge, you will have to find the prestige of this magic trick. A magician locked the flag in a safe with an image. Your only way to open it is to provide an image that would have the same md5 checksum but not the same sha1. Good luck!

Dans le cadre de notre challenge on nous donne donc une image : PhazeToGround, on doit ensuite générer une seconde image, qui a le même MD5 que cette fameuse image PhazeToGround et qui a un SHA1 différent.

C’est ce qu’on appelle une collision MD5 !

Un site web est aussi disponible pour vérifier que notre seconde image est bien une collision de la première. (et nous donner le flag par ailleurs)

Résolution

Pour faire ce challenge, je dirais que le gros du travail est de la recherche. (⌐■_■)

Tout d’abord, on jette un premier coup d’oeil sur l’image :

Premier regard sur l’image è.é

On voit très bien que ce n’est pas une image standard et que quelque chose se cache dedans è.é

Pour md5, avec nos moyens actuels, la second pre-image resistance est assurée, c’est à dire que : Pour tout message x, il est en pratique impossible de trouver un message x' tel que h(x) == h(x') et que x =/= x'.

Rangez donc vos scripts de brute force et allons chercher une astuce pour obtenir ce que l’on veut ( ˙▿˙ )/( ˙▿˙ )/

Je fais alors des recherches sur les collisions MD5 d’images PNG et je tombe sur ce merveilleux github d'Ange Albertini à propos des collisions : corkami

La partie sur les collisions d’images PNG suscite mon intêret et je vais donc voir le script png.py qui génére des collisions en prenant comme entrée deux pngs.

Je regarde alors ce petit bout de script et le lance une première fois sur deux pngs qui trainaient sur mon ordi, et je me rends alors compte que les images résultantes sont très similaires à l’image qu’on nous donne dans le challenge.

Je me dis alors que l’image qu’on nous a donnée est le résultat de ce même script et qu’il faut donc retrouver son âme-soeur manquante (°◡°♡)

Je lance donc un vbindiff sur les deux images résultantes du script pour voir les bytes qui sont différents.

Un p’tit vbindiff !

On voit donc bien que deux bytes sont différents dans les deux fichiers : les bytes 49 & 89.

Dans la première image ces deux bytes sont respectivement égaux à 00 & F2, et dans la deuxième à 01 & F1.

Dans notre image, ces deux bytes sont égaux à 00 & D2.

On va donc incrémenter le premier byte et décrementer le deuxième.

Voici la différence entre l’image modifiée et celle d’origine :

Un p’tit vbindiff !

On vérifie le résultat avec notre petit md5sum et c’est gagné !

Gagné !

╰(▔∀▔)╯