Ça fait longtemps que je voulais me remettre au reverse-engineering. J'ai trouvé un petit site sympathique pour reprendre les bases en douceur avec IDA et le RE sur Windows.

On va directement passer aux exercices (module 3).
Les exos sont disponible ici.

Ex1: Password

Etape 1: Trouver le main

Pour trouver le main, c'est assez simple on cherche une fonction précédée par des appels a argc, argv, envp.

Comme içi:

NB: Ici c'est bien la fonction `sub_401090` qui est suspectée d'être le main

Ensuite on la renomme main pour qu'IDA puisse compléter son analyse

Etape 2: Explorer le main

Maintenant on va pouvoir essayer de comprendre ce que fait ce code.
En réalité c'est assez simple.

Il est composé de 3 blocs:
- Le premier demande le mot de passe et le compare à une valeur en dur.
- Le second affiche le message "Correct!".
- Le troisième affiche le message "Wrong password".

Vous l'avez peut être remarqué mais le password est hardcodé dans le programme et IDA nous affiche ça valeur ("cr4ckm3").

Il ne reste plus qu'a vérifier cette hypothèse.

On lance le programme soit dans un cmd, soit directement dans IDA (en ajoutant un breakpoint a la fin afin d'avoir le temps de lire le message)

Et voila pour ce premier exercice.

NB: On aurait aussi très bien pu débuter notre analyse par listé les strings contenues dans le binaire et remonté à l'endroit de leur utilisation via les cross-references (puisque le password est en dur dans le programme).

Ex2: GoodLuck

Commencons par ouvrir l'executable dans IDA.

Etape 1: Analyse des strings

Pour changer commençons par analyser les strings présentent dans le programme.

Pas de mot de passe mais quelques indices sur le fonctionnement du programme.

Allons voir où ces strings sont utilisées dans le programme. Pour ça on va utiliser les cross references (XREF).

Etape 2: Trouver le main

Comme vous l'avez surement compris la fonction dans laquelle nous arrivons est le main. On s'en rend facilement compte quand on cherche à savoir où elle est utilisée via les XREF.

Etape 3: Identifier les fonctions

Après une petite analyse de la fonction main, on identifie assez facilement des fonctions printf: Elles sont toujours précédées par un push d'un pointeur sur une string.

Une autre fonction facilement identifiable est la fonction appelée en sortie du main. Cette fonction a juste pour but de nettoyer les registres avant de rendre la main.

On peut donc renommer ces fonctions pour y voir un peu plus clair.

Etape 4: Comprendre le code de vérification du password

Le code qui nous intéresse se trouve dans ces 3 blocs

Pour résumer et dans l'ordre,

# Vérifie que le programme 
# est bien exécuté avec un arguement
cmp     [ebp+argc], 2	
# L'argument passé en paramètre est converti en entier
# Et stocké dans eax 
call    ds:atoi		
# Charge l'adresse effective de l'addresse effective de 
# eax puis stocke sa valeur*5 dans eax 
lea     eax, [eax+eax*4]

# Compare que le résultat de l'opération précédente vaut 
# 181A en héxadécimal
cmp     eax, 181Ah		
					   

Donc on peut transformer ce problème en une simple équation:

eax = eax + eax *4 = eax*5
eax*5 =? 181Ah

Donc pour trouver la réponse il suffit de:

eax*5 = 181Ah
eax = 181Ah / 5 
eax = 4D2h # (soit 1234 en entier)

On va donc exécuter le programme avec en paramètre la valeur '1234'.
Si tout ce passe bien on devrait voir le message "very correct!" s'afficher.

Conclusion

Voila qui termine ce premier épisode sur le reprise de RE. Les exercices ne sont pas trop difficiles pour un débutant et c'est une bonne chose. Ça m'a permis de me dérouiller un peu ! Hâte d'attaquer la suite ;)

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