Ce billet n'avait été publié qu'en anglais. Nous l'avons traduit en 2026 pour que les archives se lisent dans les deux langues. Lire l'original →


iHack 2013, volet forensique #3 & 4 - Vos yeux saignent et vous devez séparer quelque chose.


Celui-là a été sacrément le fun à réaliser. L'idée m'est venue pendant que j'analysais un binaire malveillant exécuté sous Linux qu'il fallait désassembler. Par accident, je l'ai ouvert sur Windows avec 7zip et il contenait plus d'un fichier! Comment un fichier peut-il être exécuté et contenir plusieurs fichiers? Il fallait que j'explore ça...

J'en ai parlé à un collègue joueur de CTF et il m'a dit qu'il demanderait à la ressource parfaite pour ça. Il m'est revenu avec des exemples de combinaisons de fichiers comme ZIP + ZIP, EXE + RAR ou EXE + ZIP. Tout dépend de la façon dont le fichier fonctionne : est-ce qu'il dépend de ses limites dans l'en-tête et le pied de page? Est-ce qu'il a de l'espace perdu? Bon, c'est intéressant, il faut expérimenter avec ça pour reproduire le comportement, et ça a marché.

Quelques mois plus tard, je devais monter des défis pour l'iHack 2013 et je voulais que les gens découvrent ça eux aussi et apprennent là-dessus. J'ai alors repensé à cette expérience, mais il fallait aussi que je trouve comment inverser tout le processus. Après avoir ragequitté mes tests avec un fichier ZIP exécutable autoextractible protégé par mot de passe/chiffré et un fichier RAR, parce que je n'arrivais pas à bâtir un fichier ZIP qui soit chiffré ET autoextractible (on m'a déjà dit que c'était à cause de la compatibilité MS-DOS..... on s'en fout-tu en 2013!?), je suis passé à autre chose et j'ai finalement opté pour un ZIP protégé par mot de passe et un fichier RAR, et ça a fonctionné à merveille avec un processus de carving assez simple, mentionné ici, basé sur l'identification des en-têtes pour vous indiquer où « couper » le fichier.

Il me fallait du contenu, ce n'est pas un gros défi. Puis j'ai eu un flash à propos d'un défi forensique que j'avais tenté aux qualifications de PHDays 2012 et de son writeup (voir ici, en allemand), qui pouvait se résoudre de 2 façons :


Ce défi-là nous présentait un carré brun nommé square.GIF. Ça avait l'air d'un carré pas mal usé... Bon, je suis parti dans la mauvaise direction sur ce défi et j'ai tout compris quand je suis tombé sur un writeup.

Il fallait absolument que j'inclue quelque chose de semblable... mais pas exactement pareil, parce que si quelqu'un trouvait ce writeup, ce serait trop facile. On ne peut pas cacher grand-chose en ligne sans que ça se trouve avec hexedit... et pas de descripteurs directs que je pourrais remplir et cacher facilement. Le deuxième facteur du défi devait être dans le fichier lui-même. Pourquoi ne pas le corrompre volontairement?

Voici les étapes :