dare2crackme By DooMeeR par Kharneth | |||
---|---|---|---|
Outils utilisés | Public | Cible | |
- PeID - OllyDbg - Compilateur - Papier, Crayon, Cerveau 5.0 | Débutant / avancé en Cracking ayant de bonnes connaissances en programmation | dare2crackme.exe | |
I - PeID | |||
Un rapide scan avec PeID nous indique Borland Delphi 6.0 - 7.0, mais nous avions reconnu de toute façon l'icône caractéristique des programmes Delphi. Puisque le programme n'est pas compressé, nous allons l'attaquer de suite avec OllyDBG! | |||
II - OllyDBG | |||
Le problème avec Delphi et sa VCL (Visual Component Library / Bibliothèque de composants visuels), c'est que les apis classiques (MessageBox, GetWindowText...) ne fonctionnent pas! En effet, les MsgBox sont créées de toute pièce et les chaînes des champs texte sont récupérées par CallWindowProc(...WM_GETTEXT...). Le tout noyé dans d'innombrables Call! Mais heureusement pour nous, le compilateur Delphi est très bavard et laisse trainer plein de chaines intéressantes!! :) ![]() Après sélection de la ligne, on appuie sur la touche Entrée pour se retrouver dans le listing. ![]() On sélectionne l'adresse juste au dessus de la chaine puis on appuie sur Entrée pour se retrouver au début de la procédure de gestion de l'évènement Button1.onClick(). ![]()
On remarque la chaîne affichée dans la MsgBox lorsque l'on click sur le bouton "Crackme's goal". La procédure appelée ensuite correspond à la fonction ShowMessage() qui va construire une MsgBox puis afficher la chaîne passée en paramêtre. On oublie pas de définir un Label (Click-droit --> Label) lorsque l'on a identifié une fonction pour voir plus facilement les différents appels à cette fonction. ![]()
J'ai indiqué le nom des fonctions pour bien comprendre à quoi elles correspondent, malheureusement, Olly ne sait pas le faire! :( Oui je sais, il y a Dede mais c'est pour montrer que finalement Olly suffit! :p ![]()
Elle multiplie chaque caractère entre eux (dans une variable 32 bits), divise le résultat par 1000 puis renvoit le reste. Et ce reste doit être égal à 432. Un petit brute force rapidement codé permet de trouver d'innombrables pass valides en se limitant à 4 caratères. Par exemple XMEN fonctionne! :) ![]()
On voit l'importance des Labels car on peut ainsi identifier rapidement les différentes fonctions utilisées ailleurs dans le programme. On voit donc qu'on nous refait un coup de (Checksum(pass) Modulo 1000) == 432. Par contre, ensuite, ça se complique. On voit 2 appels à l'api VirtualProtect pour modifier les droits d'accès à une zone du code. En général pour écrire dedans en cas de code crypté par exemple. L'adresse en question est 00457078 (visible en haut de la capture). Le premier autorise l'écriture et le deuxième rétablit les droits d'origine. ![]()
Rien de bien compliqué, Click-droit sur l'adresse 00456D64 puis "Follow in dump --> Constant", puis après sélection du premier caractère (Y), Click-droit puis "Breakpoint --> Hardware, on access --> Byte". Il suffit maintenant de relancer le programme avec Ctrl+F2 puis d'appuyer sur F9 tant que l'octet en 008B25A4 n'est pas 'Y'. ![]()
On remarque que l'adresse dont les octets vont être modifiés est 00456D64. C'est à dire, celle que l'on a vu précédemment qui contenait l'adresse de "You cracked me!". Et effectivement, au chargement du programme, cette adresse contient 4 nop (90909090).
Le modulo Checksum de z4D5 n'étant pas correct, on va utiliser un brute force pour ajouter 1 ou plusieurs caractères à la fin jusqu'à avoir un modulo juste. ![]()
| |||
III - Brute Force | |||
Voici un exemple de Brute Force codé sous Dev-C++, qui renvoit les résultats dans un fichier texte.
| |||
Kharneth | |||
He went into the room where his sister lived, and...then he | |||
![]() |