Crackme : Level Easy, Les bases du cracking.

Au commencement il y avait les développeurs .. Leur puissance et leur intelligence était sans limite. Mais suite à l’arrivée de l’argent dans cette univers, les développeurs, jusque la peuple bien pensant et uni, se divisa. Désireux de gagner de l’argent les plus méchant d’entre eux se mirent a vendre leurs logiciels, se servant pour cela de codes de séries … C’est à cette époque que naissent les crackers.


Voila qui pourrait résumer la naissance du cracking, bon après c’est très très imaginatif.
Ainsi donc je me lance dans l’écriture d’un article concernant le cracking. Le cracking fait appel à des notions de reverse engineering, traduisons simplement : ingénierie inversé. Le but sera de comprendre le fonctionnement du programme, comme le pensait le développeur à l’origine de celui ci.

Pour cela, plusieurs outils :

  • Un désassembleur
  • Un cerveau ( et oui … )
Pour le désassembleur chacun son choix, personnellement j’aime bien IDA, on ne va pas cracher sur ses jolies graphiques ..
C’est le moment de soulever un petit détail qui a son importance, comme vous pouvez le voir ici nous voyons du code, mais du code Assembleur !
Il est impossible d’avoir un code C,C++ et de retrouver mot pour mot ce qu’a écrit le développeur, mais avec l’assembleur on peut comprendre la logique. Si vous n’êtes pas familier avec l’assembleur il serait préférable de vous mettre à niveau sur ce terrain la. Je dis préférable, c’est en fait primordial.
Pour cette première fois dans le mode du cracking nous allons faire pas à pas le désassemblage.
Imaginons que nous avons ce code :
int main()
{
    char password[100];
    char mot_de_passe []="LeSuperMegaMotDePasseComplique";
    printf("Hello world!nWelcome to this first crackme !n");
    printf("Entrez le mot de passe : ");
    scanf("%s",password);</pre>
if(strcmp(password,mot_de_passe)==0)
{
printf("Bravo le flag est : Crackme1Solved!n");
}
else
{
printf("Bad Passwordn");
}

return 0;
}

Code très basique, pas sécurisé,  où l’on demande un mot de passe à l’utilisateur. Si c’est le bon alors on lui donne le flag, si non il repart bredouille.

Rien d’extraordinaire en soit. Imaginons maintenant que nous n’avons ni le mot de passe, ni les sources.
Il est donc temps d’ouvrir ce fichier avec IDA !

Bon comme on peux voir notre if/else ( ligne 9/13) est représenté par le jnz en dans la partie haute de l’image. En traduction on pourrais dire, si la condition est respecté alors prend le chemin de gauche, si non prend celui de droite.
Tout repose donc sur ce JNZ. Bon ici je n’ai pas offusqué mon code, donc vous pouvez voir directement le flag. Mais si je l’avais fait, vous ne le verriez pas et vous serriez de continuer à lire !

Faisons le point : Pour respecter la condition il faut avoir le bon mot de passe ..
C’est donc cette condition qui va nous bloquer… Et bien soit ! Changeons la !
Si on modifie le JNZ en JZ  la condition se retrouve inversé, et donc si on rentre un mot de passe différent de celui attendue alors la condition sera modifié !

Pour faire cela on va se servir d’un éditeur hexadécimal. Car c’est le seul moyen de modifier un code compilé. Je vais utiliser wxHexditor sur linux, mais choisissez celui que vous voulez, hexplorer sur windows est aussit très bien.

Ici on repère le JNZ ( 75 ), il faut au préalable avoir repéré les autres valeurs hexadécimales qui l’entourent sur IDA pour ne pas se tromper, il y a plusieurs 75 dans un programme.

On le remplace par la valeur opposée au JNZ, c’est a dire JZ soit en hexa : 74.

Il ne reste plus qu’a sauvegarder et relancer notre programme.
Et voila ! En rentrant un mot de passe, qui était faux dans la version basique du programme on arrive a obtenir le flag avec cette version modifiée !
Alors bien sur le cracking ne s’arrête pas la, il ne suffit pas de changer une seule valeur hexa pour arriver a ses fins, la plus grande partie du travail est dans la compréhension du programme, ou Reverse Engineering.
C’est donc tout pour cette première introduction à l’univers du cracking.
N’hésitez pas à partager/commenter !

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *