La Barre Fixe

404CTF{x86_64-iGnor3s-5TuFF}

Catégorie: Stegano Difficulté: easy Flag: -

Challenge

file-archive
610B
circle-info

Description


C'est le grand moment, tous les yeux sont rivés sur vous. Vous vous apprêtez à commencer votre prestation sur l'épreuve de la barre fixe. Mais quelques instants avant de vous élancer, vous remarquez un détail intriguant. Certaines choses sont là... alors qu'elles ne devraient pas l'être... Un message peut être ?

Solution

On commence par chercher ce que l'on a entre les mains, donc soit avec un coup de commande file, soit via un site en ligne comme Metadata2goarrow-up-right.

Il s'agit d'un exécutable x86 en 64bits. On va donc le décompiler pour savoir ce qu'il fait, ici, j'utilise IDA. Direction la fonction _start qui est le point d'entrée du programme.

On voit plein d'instructions db. Elles signifient que le logiciel n'a pas su les comprendre, car elles ne sont pas censées être là.

On trouve toujours les mêmes valeurs hexadécimales : 65, 2E et 3E. Il s'agit de préfixes pour indiquer les segments à utiliser.

Pas besoin de comprendre ce que ça veut dire, IDA nous dit qu'elles n'ont rien à faire ici donc c'est surement une bonne piste à explorer vu l'énoncé du challenge.

Recompilation

Pour aller un peu plus loin, on peut s'amuser en Python à décompiler le binaire pour lister chaque instruction, puis à les recompiler. On pourra ainsi voir les différences puisque les instructions inutiles vont partir d'elles-mêmes.

On a confirmation que le début de chaque instruction est étrange, et en plus de nos trois valeurs, on voit également 40 qui disparaît.

Ça nous fait un total de 4 valeurs "fantômes", et le plus bizarre, c'est qu'elles semblent toutes respecter un certain ordre.

  • 2E apparaît toujours avant 3E

  • 65 apparaît toujours avant 2E

  • 40 apparaît toujours avant 65

Ce qui donne l'ordre : 40 65 2E 3E

Éclair de génie

On a 4 valeurs qui apparaissent ou non, dans un ordre précis. Et si elles représentaient les bits du message caché que l'on cherche ?

Le flag commence par 404, ce qui donne en binaire : 0011 0100 0011 0000 0011 0100

Si l'on prend les instructions une à une et que l'on regarde si nos valeurs y sont :

Ça ressemble à notre flag en binaire. La première instruction correspond aux 4 bits bas du caractère "4", puis la seconde instruction aux 4 bits hauts.

Pour chaque instruction, on va donc écrire un bloc de 4 bits en fonction de si les valeurs fantômes sont présentes. Ensuite, il faudra simplement assembler 2 blocs par 2 blocs pour reformer nos octets (en veillant à ce que le 1ᵉʳ bloc corresponde bien aux bits de poids faibles).

Script de résolution

Mis à jour