Nos amis les portes (Reverse) - 404CTF 2022

Nos amis les portes (Reverse) - 404CTF 2022

Fichiers du challenge Principe:
Simuler un circuit logique dans logisim, le corriger, et brute-forcer son entrée avec xdotools et un compteur loggé dans un fichier

Le challenge

Le challenge nous donne un circuit électronique (dispo ici) dont on doit trouver l'entrée (qui est le flag)

Logisim

En ouvrant le fichier, on voit directement qu'il s'agit d'un schéma "Logisim", donc, on va installer le paquet associé (un simulateur de circuits logiques)
On ouvre le fichier du circuit dans Logisim
On explore ensuite les différents circuits (chaque "Système" à gauche est un circuit)
L'un d'eux m'a fait marrer (et m'a poussé à me dire que le challenge "reverse" serait complexe)
Deux fichiers set1 et set2 sont également fournis: on les charge dans les puces mémoire du circuit

Je suis passé à une version "dark" de Logisim car sinon, les options ("Contents", à gauche) ne s'affichent pas bien: elles sont en blanc sur fond blanc

On va tenter de charger le set2 dans la puce du bas (et le set1 dans celle du haut), car cela semble aller de soi, mais on gardera à l'esprit que, peut-etre, c'est l'inverse
Une fois le tout chargé, on lance la simulation… et ça ne produit aucun résultat

Des erreurs

En regardant de plus près, on voit un fil bleu et un fil rouge. On ouvre le circuit avant le fil rouge

Là, on voit des "E", probablement pour "ERROR" et on observe des "trous" au-dessus des portes logiques

A ce moment-là, j'ai compris que le circuit avait des erreurs qu'il nous faut corriger d'abord

On va au plus simple, et on connecte les portes du haut à celles du bas, deux à deux (au vu de leur configuration et de leur nombre, ça semble cohérent)
On ouvre les autres circuits un à un, à la recherche d'autres erreurs du genre
Une fois qu'on a tout corrigé, au plus cohérent, le circuit vire au vert
Si on le lance, il se passe mainteant des choses: on a un message "ERROR" affiché

Keyboard

En allant voir la documentation en ligne, on découvre que cet élément est une entrée clavier…
…comme l'indique cette page web
J'essaie alors, caractère par caractère, de voir ce qui se passe en brute-forçant la première valeur. On s'aperçoit que "ERROR" apparait toujours, mais "plus tard"

Compteur et brute-force

Je décide donc d'ajouter un nouvel élément au diagramme, un compteur, qui me servira à déterminer combien de lettres j'ai juste

Le but est alors d'essayer toutes les valeurs possible de la 1ere lettre, et quand ce compteur sera "un cran plus haut que d'habitude", cela signifiera que la lettre est correcte.

Brute-forcer à la main sera long, mais le concept marche: la valeur de mon compteur me permettrait, si je peux la lire dans un script, de savoir si ma i-eme lettre est juste

xdotools

N'ayant pas trouvé comment scripter dans Logisim, je décide de me faire un script xdotools qui simulera les entrées clavier

Cela rend la machine inutilisable pendant le temps du brute-force, mais tant pis. En revanche, le plus dur sera maintenant de "lire" le compteur de lettres, pour que le script sache s'il a juste ou pas.

Je lance mon xdotools, et je reste devant l'écran: dès que le compteur passe un cran de plus, je note sur un papier la bonne lettre

Log

Mais cette méthode est chiante: elle m'oblige à rester planter devant l'ordi. Donc, en cherchant, je vois qu'on peut logger la valeur des compteurs dans un fichier
Je possède maintenant une sortie que j'intègre au script, pour qu'il détermine lui-même s'il a bien trouvé la bonne lettre

Dans le doute, je laisse tourner le script pour toutes les lettres: sait-on jamais, peut-être qu'une autre lettre me génèrera un faux positif? Au final, non une seule lettre s'avère juste à chaque fois

Comme je suis allé repasser mon linge pendant que la machine cherchait les lettres, j'ai mis un message audio (vous devinerez le jeu dont il est tiré) en cas de succès, ou d'échec

Mais le brute-force s'est arrêté en plein milieu, et mon flag n'est pas complet

Encore des erreurs

En fouillant les circuits au moment de l'arrêt, je trouve des fils rouges dans l'un d'eux
Je corrige, en rajoutant des "ronds" (NOT) aux endroits à trous, ce qui bouche les trous

La brute continue

On reprend le brute force (après avoir re-rechecké qu'il n'y a plus de trous dans les fils) et un autre caractère est trouvé
On laisse tourner (certains caractères se "devinent", vu qu'on est en l33t speak)

Une fin imprévue

Arrivé vers la fin, j'obtient un flag presque complet
Mais ce flag "presque complet" me dit "Félicitations" quand même! Impossible de savoir quel est réellement le flag…
Je me retrouve avec plusieurs possibilités, et je n'ai pas de moyen de savoir laquelle est juste
J'y vais alors réellement au pif, voyant qu'en gros 1 lettre sur deux est minuscule et l'autre majuscule, et… ça passe!
404CTF{K33p_c4lM_4nD_r3VeRsE}

Par la suite, il a été annoncé que le challenge avait une erreur de données. D'où le fait qu'une "v2" existe dans le zip des fichiers du challenge . Mais je n'ai pas testé si cette deuxième version corrige bien le soucis de flag incomplet (je suppose que oui).

Fichiers du challenge

↩ Retour à la liste des challenges

⇇ Retour à l'accueil