Page de mes tutoriels
Tutoriel Reversing #1 :

Utilisation de OllyDbg

Introduction

OllyDbg est un programme très utilisé dans le domaine du cracking. C'est ce qu'on appelle une débuggeur/désassembleur. Les débuggeurs sont à l'origine conçus pour permettre aux programmeurs de suivre le déroulement de leur programme lors de l'exécution, et ainsi permettre de localiser les instructions qui sont « buggées » (qui n'ont pas le comportement voulu). Pour pouvoir débugger un programme, il est souvent utile de pouvoir au préalable le désassembler, c'est-à-dire de le transformer du code binaire exécutable (.exe sous windows) compréhensible par la machine, en code assembleur compréhensible par l'humain (enfin, sous réserve de connaître le langage assembleur ;)). Une fois que l'on a obtenu ce code assembleur on peut alors étudier l'état du programme en mémoire en faisant une pause (le terme technique est breakpoint, ou point d'arrêt).

System requirements

Pour pouvoir suivre ce tutoriel dans de bonnes conditions, il est nécessaire de faire les opérations par soi-même. Pour cela, il vous faudra :

OllyDbg 1.10, disponible dans la section downloads : odbg110

Le crackme #1 by moi même (Nebelmann :p) : crackme1

Un cerveau v3.6.2 en assez bon état de fonctionnement

Un Windows, n'importe lequel fera l'affaire

Analyse de OllyDbg

La première chose à faire, c'est de tester à quoi ressemble ce crackme, si vous ne l'avez pas encore fait faites-le. Crackme tout simple, il demande le mot de passe, s'il est bon il le dit sinon il le dit aussi. Si le programme n'exprime pas son mécontentement, vous avez eu un gros coup de chance en trouvant le bon mot de passe du premier coup... ;)

Ceci étant fait, lancez OllyDbg et ouvrez votre crackme (jusque là, c'est assez banal). Et, non, ne le refermez pas tout de suite, ce qui s'affiche est tout à fait normal, il n'y a pas de quoi avoir peur. Normalement vous devriez avoir quelque chose comme ceci :

Bon évidemment l'image est réduite, on ne voit pas très bien, mais on peut quand même regarder attentivement cette fenêtre. Elle est divisée en quatre cadres, le plus intéressant est certainement celui en haut à gauche (à mon goût). On peut y voir quatre colonnes :

Address, c'est l'adresse de l'instruction en mémoire

Hex dump, correspond à l'instruction en hexadécimal (compréhensible par la machine).

Disassembly, correspond à la traduction de l'Hex dump en langage assembleur

(compréhensible plus tard par vous)

Comment, un commentaire sur l'instruction.

OllyDbg en met par défaut pour dire quelle fonction est

utilisée, mais vous pouvez également en mettre vous-même.

La colonne qui va nous permettre de comprendre ce que fait notre programme est Disassembly, avec un peu d'habitude et de pratique vous trouverez assez facilement à quoi correspondent les différentes instructions de cette colonne.

Analyse du programme

La première chose que l'on peut voir, c'est qu'une instructions en assembleur est déjà surlignée (PUSH EBP). Ne tentez pas la comprendre mais remarquez que l'adresse apparaît sur fond noir, c'est tout simplement la première instruction que le programme va exécuter. Cet endroit particulier s'appelle le point d'entrée (ou entrypoint). Ici, la partie qui va réellement nous intéresser commence à l'adresse 00401290. Descendez donc un peu le long du listing ASM jusqu'à cette adresse, et vous verrez alors quelques infos intéressantes.

On peut voir les messages apparaîssant lors de l'exécution du programme, comme « Entre le mot de passe » ou bien encore « Bravo, ... ». OllyDbg propose une fonctionnalité très intéressante pour trouver ce genre de message. Elle s'avère utile dans les programmes plus gros, évitant ainsi de parcourir tout le code à la recherche d'un « Erreur : mot de passe faux ;) ». Pour cela, faites un clic droit sur le listing, puis « Search for » -> « All referenced text strings » (correspond aux String Data References sous W32Dasm). Toutes les chaînes de caractères trouvées apparaîssent alors dans une nouvelle fenêtre :

J'ai mis un point rouge à côté des messages qui semblent être intéressants à première vue. On peut voir en effet qu'ils apparaissent au moment de saisir le mot de passe, puis pour dire si oui ou non le mot de passe que l'on a saisi est correct. On peut donc supposer que ce mot de passe va être vérifié dans cette même zone du programme. On peut aussi voir « Dk75ZTR6-Q », qui semble pour le moins bizarre, mais nous allons voir par la suite ce que c'est...

Puisque ce qu'on veut, c'est trouver le bon mot de passe, on va aller là où le prog nous dit « Bravo, tu ». Pour cela, il suffit de double-cliquer sur ce message dans la fenêtre « Text string » et on se retrouve automagiquement au bon endroit.

On va alors analyser le code ASM pour voir quand et comment il arrive jusqu'à ce message. OllyDbg, dans ce crakme, nous renseigne généreusement sur les fonctions utilisées dans ce programme, à savoir :

printf pour afficher un message

scanf pour récupérer du texte au clavier (en l'occurence le mot de passe que l'on rentre)

strcmp pour comparer deux chaînes de caractères

Voici une autre capture d'écran, où j'ai commenté le code pour vous faire comprendre ce que fait le programme :

Il est important de noter que le résultat de la fonction scanf est placé dans le registre EAX, c'est donc lui qu'il faut regarder pour savoir si les deux mots de passe sont identiques, auquel cas EAX vaudra 0. Le saut conditionnel JNZ se base ensuite sur le résultat de TEST EAX, EAX. Si le TEST renvoie zéro, le pass est bon, tout marche bien. Sinon, on saute à l'adresse 0040130A et on affiche un message d'erreur.

Que fait donc notre programme? Il demande un mot de passe, il le compare à la chaîne « Dk75ZTR6-Q », puis il affiche un message selon que le pass est bon ou pas. Le bon mot de passe est alors, comme vous l'avez deviné : « Dk75ZTR6-Q »!!

Fonctionnalités utiles

Vous aurez parfois besoin de commenter le listing, pour comprendre par la suite ce que fait le code ou pour ne pas le réanalyser cinquante fois. Pour mettre un commentaire, placez vous sur l'instruction à commenter appuyez sur ';', tapez votre texte puis faites OK.

On peut également définir des bookmarks, ou marques-pages, permettant de naviguer facilement à travers le listing. Pour définir un bookmark il suffit de faire un clic droit au niveau de l'instruction voulue, puis « Bookmark » -> « Insert bookmark ». Couplez les avec un commentaire, et ça sera encore mieux ;).

Si le programme est divisé en plusieurs fonctions ou en plusieurs parties accédées à un moment ou à un autre par un JMP ou un CALL, il peut être intéressant de définir un label. Dans l'exemple de ce crackme, on aurait pu mettre un label à l'adresse 0040130A grâce à la touche ':', par exemple « Bad cracker ». Dans ce cas l'instruction à l'adresse 004012FA n'aurait plus été

JNZ SHORT crackme#1.0040130A

mais

JNZ SHORT <crackme#1.Bad cracker>

Remarque : Tous les breakpoints et les bookmarks sont accessibles via le menu "View" -> "Bookmarks" ou "View" -> "Breakpoints".

Extroduction

Voilà, ce tutoriel touche à sa fin... Si vous n'avez pas tout compris, n'hésitez pas à le relire encore quelques fois. En cas de désespoir total ou de tentative de meurtre sur la personne de votre ordinateur, n'hésitez pas à me mailer pour éclaircir vos pensées... Je pense que j'ajouterais des choses à ce tutoriel par la suite, donc n'hésitez pas à revenir :)

A bientôt pour la suite. Votre serviteur, Nebelmann

Copyright (C)- xtx Team (2021)

XHTML valide 1.1 CSS Valide !