Défi Énigme du CST - RE Défi-2

Ce défi s’appuie sur le précédent, MyFirstRE. Nous tenons donc pour acquis que vous avez fait le premier défi. Ainsi les étapes initiales expliquant comment importer le fichier binaire dans GHIDRA et trouver la fonction main ne sont pas répétées. Notre analyse commence par la fonction main.

1  La fonction main

Comme d’habitude, nous commençerons par un survol rapide de la fonction main pour avoir une idée de la direction générale que cette fonction prend. Lors du premier survol, nous remarquons que la fonction appelle printf, fgets, sscanf, strlen, strcmp et puts. La présence de ces fonctions permet de diriger notre analyse et de ne pas perdre de temps !

La première chose que l’application fait, comme vous pouvez le voir dans la figure 1, est de demander à l’utilisateur d’entrer un mot de passe. Le mot de passe est sauvegardé dans une structure de mémoire et la saisie est gérée par la fonction fgets.

Figure 1: La fonction main

 

Lorsque viendra le temps de revoir la version française de ce fichier binaire, vous aurez peut-être quelques ajustements à faire sur les chaînes de caractères trouvées dans le dossier : GHIDRA semble éprouver de la difficulté à lire certains caractères français. Cliquez sur Window->Defined Strings pour ouvrir la fenêtre de chaîne de caractère (celle-ci ouvre de la méme façon que votre fenêtre de fonction) les onglets peuvent être utilisés pour naviguer dans un mouvement de va-et-vient entre les chaînes et les fonctions. À 0x00012327 vous voyez « t entrer l... », double cliquez sur cette entrée et la fenêtre Listing va naviguer jusqu'à la chaîne de caractère.

 

Figure 2: Re-définir les octets dans GHIDRA

 

En regardant les données entourant l'adresse 0x0012327 vous devriez voir l'erreur qui se produit lorsque le « î » apparaît. C'est pourquoi la sortie initiale de la chaîne de caractère de main renvoie aux données DAT_0012318 au lieu de « s_xxxxxx » pour représenter la chaîne de caractère. Pour corriger cette erreur ;

  1. Sélectionnez la première lettre dans la chaînes de caractère et appuyez sur « Ctrl+s ».
  2. Une fenêtre va apparaître et vous demander si vous voulez « Save File » ou « Define string», choisissez « Define string » et appuyez sur « OK ».
  3. Ceci crée un conflit de données puisque les octets amassés font partie de la chaîne de caractère jusqu'à ce qu'un caractère nul soit trouvé. Le résultat dépasse la fin de la chaîne 0x00012327. Toutefois, ceci est exactement ce que l'on cherche; alors dans la fenêtre « Data Conflict » window select « Yes ».

Nous voyons maintenant la chaîne de caractère complète (accompagné d'un _ ou le « î » devrait être) et aussi « s_xxxxxx » qui réfère au main (Voir la figure 2).

1.1  Vérifier si un mot de passe à été entré

Par la suite, la fonction sscanf est utilisée pour copier le premier mot que l'utilisateur a écrit vers une autre structure de mémoire. La valeur de retour de la fonction est utilisée pour s'assurer qu'une seule option est possible. Si l'utilisateur n'a pas entrée de mot de passe, un saut est fait vers une partie de l'application qui gère ce cas. La figure 3 montre le processus tout juste décrit.

Figure 3: Un mot de passe validé n'est pas nul

 

1.2  Vérifier le mot de passe

La prochaine étape demande un peu plus d’attention. Premièrement, nous expliquons le processus de validation du mot de passe et après allons plus en profondeur.

Tenant pour acquis que l’utilisateur a entré un mot de passe, l’application vérifie sa longueur et envoie le mot de passe ainsi que sa longueur et son pointeur vers une structure en mémoire à computeMD5ForUserPassword, une fonction que nous identifions comme une fonction hachage MD5 (la découverte de celle-ci va être expliquée plus tard). La structure de mémoire contient le hachage après le retour de fonction. Ceci est démontré par le rectangle rouge dans la figure 4. La structure de mémoire appelle strcmp ainsi qu’une autre chaı̂ne statique (figure 4, rectangle violet), sont utilisées pour valider le mot de passe. Si le résultat de la comparaison confirme que les chaı̂nes sont identiques, un message de félicitations s’affiche sur le terminal (figure 4, rectangle jaune).

Figure 4: Modification et vérification du mot de passe

Le fait que la chaı̂ne statique utilisée lors de la comparaison ressemble à un hachage MD5 ne peut pas être utilisé pour confirmer l’utilisation de MD5. Sauter à cette conclusion n’est pas nécessairement mauvais mais nous allons plutôt vous montrer comment y venir sans utiliser un casseur de valeur de hachage.

1.3  Confirmer l’utilisation de MD5

Si l’on se base sur le fait que la chaı̂ne de caractère utilisée lors de la comparaison ressemble à un hachage MD5, quelqu’un pourrait être porté à croire que c’est vraiment un hachage MD5. Dans ce cas-ci, c’est exacte. C’est pourquoi, en cassant le vrai hachage MD5, vous trouvez le mot de passe PurpleMonkey qui est en effet le bon mot de passe. En revanche, dans plusieurs cas réels, l’identification d’une fonction hachage MD5 n’est pas directement soutenue par la présence de hachage statique dans le code.

Si nous portons notre attention maintenant sur la fonction nommée computeMD5ForUserPassword, nous voyons facilement comment elle peut être identifiée comme un MD5. La figure 5 montre le début de cette fonction. Commençons par renommée l’une des fonctions appelées depuis computeMD5ForUserPassword à md5 init.

Figure 5: Fonction computeMD5ForUserPassword

 

Rendez-vous sur cette fonction, vous voyez alors le code suivant (figure 6).

Figure 6: Identifier les constantes de MD5

 

La chose à savoir à propos de cette région de code est encadré en rouge. La plupart des codes cryptographiques utilisent des constantes. Le résultat de la rétro-ingénierie peut prendre avantage de ces constantes pour aider à identifier les algorithmes utilisés. Dans le cas présent, une recherche web pour ces 4 constantes donne assez vite l’identification de l’algorithme MD5 (voir la figure 7).

Figure 7: https://en.wikipedia.org/wiki/MD5

Maintenant, nous pouvons utiliser sans crainte notre casseur de hachage préféré pour déterminer le mot de passe et dévoiler le message secret! Nous espérons que vous avez aimé le défi!

 

Vous aimez résoudre des énigmes ? Faites-en une carrière