Attaquons la phase 3!

On remarque dans l'asm de la fonction qu'elle attend un digit, suivit d'un caractère, suivit d'un autre digit.

Si l'on s'attarde sur la comparaison qui à lieu 4 lignes plus bas ( 0x08048BBF) et qu'on lit le manuel de la fonction scanf (en version 32 bits) on découvre que pour cette fonction aussi il y a une vérification du nombre d'inputs, puisque le retour de scanf est le nombre d'input lu (en partant de zéro).

https://asm.developpez.com/cours/gas/

Lorsque l'on débug le programme on se rend compte que la vérification est faite dans une switch case à 8 possibilités.

Une chose intéressante à noter est cette comparaison:

Son rôle est de vérifier que la première input est bien un choix possible du switch case, donc que ce soit une valeur numérique comprise entre 0 et 7.

Ensuite on passe sur une structure de test assez simple, d'abord  vérification de la lettre et ensuite vérification du second digit.  

Le choix de la structure de test qui sera utilisée dépend de la valeur de la première input. Par exemple si l'input est 1 b 214 alors le premier testcase du switch est utilisé, si c'est 3 k 251 alors c'est le 3eme testcase du switch qui est utilisé.

Il existe donc plusieurs réponses à ce challenge. Comme vous pouvez vous en douter, 1 b 214 et 3 k 251 sont 2 possibilités sur les 7.

Revenons sur la structure à l'intérieure du switch case:

Pour simplifier je vais illustrer le test de contrôle avec le cas où l'input est 1 b 214

Une fois le premier test effectué (et donc le testcase du switch case déterminé), le programme compare notre second argument avec une valeur contenue dans le registre bl (partie basse du registre ebx).

Il faut faire attention, R2 aime bien renommer certaines variables mais n'est pas toujours capable de retrouver ses billes... Donc toujours garder l'entête de la fonction sous la main

Si on fait un peut attention, ce registre est rempli juste avant le premier test.

Donc maintenant on sait que la comparaison est faite avec la valeur 0x62 et que c'est une lettre donc: notre seconde input doit être un b.

La suite et fin est assez simple puisque le programme se contente de comparer notre second digit avec une valeur en hexadécimale: ici un 0xd6 soit 214.

Et voila la 3éme partie de cette bombe logique désamorcée.

Social et Media

Comme toujours je suis disponible sur Twitter et cie, si vous avez des questions, des remarques, des suggestions etc. N’hésitez pas !

Twitter: @GhostAgs

Discord: hackraw