Catégories
Hack The Box Reverse Write-ups

Hack The Box – Find The Easy Pass

Aujourd’hui on se retrouve pour le write-up d’un challenge de Reverse Engineering proposé par Hack The Box : Find The Easy Pass.

Première approche

Une fois l’archive décompressée, on se retrouve avec un exécutable nommé “EasyPass.exe”. On se doute alors avoir affaire à un exécutable Windows, mais essayons d’en savoir plus.

$ file EasyPass.exe
EasyPass.exe: PE32 executable (GUI) Intel 80386, for MS Windows

Nous avons donc devant nous un PE (Portable Executable) 32 bits (x86) avec une interface graphique (GUI) pour la famille des processeurs 80386 (ou i386) pour Microsoft Windows.

Lançons cet exécutable pour avoir une première idée de son fonctionnement.

On a donc bien ici une interface graphique où un champ dans lequel nous devons rentrer le bon mot de passe apparait. Si on entre un mauvais mot de passe (comme “hackthebox”), une fenêtre s’ouvre avec marqué “Wrong Password!”.

Reverse

Pour ce reverse, je vais utiliser Cutter, la version GUI de radare2, ainsi que Immunity Debugger.

Après ouverture de l’exécutable dans Cutter, on peut par exemple rechercher la chaîne “Wrong password!” pour voir après quelles instructions celle-ci sera affichée à l’écran.

On trouve que cette chaîne est stockée en 0x00454200.
Voyons où le code fait référence à cette adresse.

On voit ici que la chaine “Wrong password!” est affichée à l’écran (via la fonction fcn.00427a30) si je saut conditionnel (JNE 0x454144) est pris. Sinon, la chaîne située à l’adresse 0x4541dc est affichée, surement quelque chose comme “Congratulations!”. Allons voir celle-ci de plus près.

C’est bien ce que l’on avait prédit.

Penchons-nous maintenant sur la fonction fcn.00404628 qui donne lieu au test. On peut conjecturer que c’est cette fonction qui va se charger de comparer le flag entré avec le bon flag.

Je vais préférer ici une analyse dynamique de cette fonction.
J’ouvre donc Immunity Debugger, pose un breakpoint en 0x00454131 (où la fonction qui nous intéresse est appelée) et lance l’exécution du programme avec comme mot de passe “motdepasse”.

On voit donc ici dans l’état des registres 2 chaines de caractères en clair : “motdepasse” qui est le flag que nous avons entré, et “fortran!” qui va être comparé au flag entré et qui est donc le mot de passe.
On vérifie le mot de passe trouvé :

C’est bien le mot de passe, challenge terminé !