Vous êtes sur la page 1sur 8

Cours n16

Cours n16 Brute-Forcer un crackme

Objectif :
1 Trouver le bon serial en utilisant une mthode par Brute-Force uniquement en modifiant le crackme.

Niveau :
Moyen - Elev

Ce qu'il vous faut :


- OllyDbg et les quelques connaissances son propos que j'ai donnes dans le cours prcdent. - Le crackme (30 Ko)

Introduction
L'attaque par brute force est une technique employe gnralement lorsque le serial ne peut pas se trouver la main (ou de tte, a dpend avec quoi vous rflchissez d'habitude), le brute force va donc tester toutes les solutions possibles jusqu' trouver la bonne. C'est efficace mais cela peut aussi tre trs long, en effet si le mot de passe cherch est assez long (environ plus de 8 lettres) il va falloir des jours, des mois voire des annes pour le trouver. Heureusement pour nous, l'auteur de ce crackme n'a pas t trop mchant et a mis un serial d'une longueur correct. Ce crackme est tir d'un site de challenges, le but du jeu : le programme doit nous donner le mot de passe du dfi. Mais pour qu'il nous le donne il faut rentrer le bon serial. Donc thoriquement si on trouve uniquement le mot de passe sans le serial c'est bon. Mais nous allons voir qu'ici il faut obligatoirement l'un pour avoir l'autre. Ne sachant pas vraiment programmer en assembleur, on ne va pas crer un programme pour brute-forcer le crackme mais utiliser le crackme afin qu'il se brute-force lui-mme. Bon alors je vous prviens ce que je vais faire ne sera sans doute pas beau voir (surtout pour les pros de la programmation en assembleur ;-) ) mais ce qui compte c'est qu'on arrive trouver la solution. C'est dire qu'il y a srement plus rapide, plus simple peut-tre, mais vous aurez l'occasion d'y rflchir aprs avoir lu ce tutorial. Petit rappel : Qu'est-ce qu'une API ? "API" est l'acronyme de "Application Programming Interface". C'est une interface de programmation d'applications, contenant un ensemble de fonctions courantes de bas niveau, bien documentes, permettant de programmer des applications de Haut Niveau . On obtient ainsi des bibliothques de routines, stockes par exemple dans des DLL ou des NLM (dfinition du site tout-savoir.net). Dernire petite chose avant de commencer : pour ce cours comme pour le prcdent nous allons utiliser OllyDbg car WinDasm est vieux et a fait ringard de cracker avec ;-). Plus srieusement OllyDbg est beaucoup plus efficace que WinDasm et de plus ce dernier n'volue plus. Donc mettez WinDasm la poubelle et prenez donc OllyDbg avec vous lors de vos prochaines soires de cracking ! :-)

1 Prise de connaissance du crackme


On excute le crackme pour voir de quoi il retourne. On voit qu'il faut taper un "keyword". Comme on est poli on tape "bonjour" : "Error !" soit-disant car le mdp (mot de passe) ne fait pas le bon nombre de caractres. En ttonnant on trouve qu'il doit faire 5 caractres, on retrouvera ce rsultat dans OllyDbg par la suite. En tapant un mot de 5 lettres on a le droit un autre message d'erreur toujours en anglais nous disant cette fois que nous

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16

aurons plus de chance la prochaine fois (a impressionne cette matrise de la langue anglaise quand mme avec la traduction instantane que je viens de faire l :-p ). En validant ce message le crackme se ferme. Rien de plus nervant pour cracker ce genre de crackme car en l'analysant on a besoin souvent de revalider le serial pour "refaire un tour". De plus lorsque l'on fait des modifications dans le programme, en le rinitialisant dans OllyDbg celles ci disparaissent. Donc c'est la premire chose que nous allons faire : empcher le crackme de se fermer. Pour cela on ne va pas trop se prendre la tte. En ouvrant OllyDbg la premire ligne sur laquelle on tombe c'est l'EntryPoint (en 401000) on pourrait donc le faire revenir ici aprs l'affichage du message d'erreur. Cela aurait pour effet de recrer une nouvelle fentre du crackme mais ce serait dj nettement moins gnant. Mais tentons d'affiner un peu ce saut. En descendant un petit peu on aperoit les APIs (dans la partie 'Comment' droite des instructions en assembleur et notes en rouge normalement) LoadIconA, SendMessageA et SendDlgItemMessageA qui correspondent l'affichage du crackme, on va donc se mettre un peu aprs. L'instruction suivant la 3me de ces API est un JMP qui mne en 401141. On essaiera donc cette destination. Maintenant que celle-ci a t choisie il va falloir dterminer le lieu de dpart. En regardant vite fait encore un peu en dessous on trouve 3 messagebox :
004010F5 . 68 44304000 PUSH CrackIt.00403044 ; |Text = "The Solution perhaps is 'AzulGranaEsMiColor'" --> Oh mais serait-il la solution que l'on cherche ? ... Que vous tes naf ! ;-) Cela serait beaucoup trop facile sinon. On va voir que "AzulGranaEsMiColor" sera dcrypt en fonction du serial, c'est pour cela qu'il faut trouver le bon serial. 00401112 . 68 ED304000 PUSH CrackIt.004030ED ; |Text = "The Keyword is not n characters long"

nombre de caractres. serial.

--> Si le serial ne fait pas le bon

0040112A . 68 B8304000 PUSH CrackIt.004030B8 ; |Text = "Best luck the next time :D"

--> Le Bad Boy : si ce n'est pas le bon

Pour le moment c'est uniquement du dernier qu'on a besoin car c'est aprs celui-ci que le crackme se ferme et en effet une API EndDialog se trouve juste aprs. C'est donc ici qu'il va falloir sauter.
00401137 6A 00 PUSH 0 00401139 FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040113C . E8 AF000000 CALL <JMP.&user32.EndDialog> ; \EndDialog

On va donc tout simplement remplacer ce morceau par un JMP 00401141. Il va donc rester des instructions qui ne servent rien car le JMP va juste remplacer les 2 bytes (octets) du PUSH 0, mais de toute faon il ne passera plus par ici donc on peut laisser, ce n'est pas gnant. Pour modifier la ligne on double clique sur l'instruction (pour info si vous double-cliquez sur la partie commentaire vous pourrez en mettre un commentaire, surprenant non ?, trs pratique pour se reprer parfois et sur le code en hexa cela pose un BP. Je rappelle galement que BP n'est pas une Baguette de Pain mais un BreakPoint). Remarquez qu'on aurait trs bien pu nopper toute l'API car la ligne 401141 se trouve juste aprs, mais alors dans ce cas vive la finesse ! Aprs modifications on a donc :
00401137 /EB 08 JMP SHORT 00401141 00401139 |FF75 08 PUSH DWORD PTR SS:[EBP+8] 0040113C . |E8 AF000000 CALL <JMP.&user32.EndDialog> ; \EndDialog

Une fois cela fait on va enregistrer le fichier, pas forcment car c'est utile, quoique si le programme est rinitialiser on perdra la modification faite, mais surtout pour savoir comment faire pour ceux qui dcouvrent encore un peu OllyDbg. On fait donc clic droit puis 'Copy to executable' -> 'All modifications', on clique sur Copy All. L une petite fentre s'ouvre on fait clic droit dedans et 'Save File' et on enregistre sous un autre nom de prfrence pour avoir une sauvegarde. Maintenant on va pouvoir s'attaquer aux choses srieuses.

2 Analyse du crackme
On s'intresse dsormais de plus prs aux 3 msgbox qu'on vient de rencontrer :
004010E7 . 3D 9A020000 CMP EAX,29A 004010EC . 75 16 JNZ 00401104 --> Si

EAX=29A alors continue sinon on saute au dessus de cette msgbox

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16
004010EE 004010F0 004010F5 004010FA 004010FD . . . . . 6A 30 PUSH 30 ; /Style = MB_OK|MB_ICONEXCLAMATION|MB_APPLMODAL 68 11304000 PUSH 00403011 ; |Title = "Congratulations!" 68 44304000 PUSH 00403044 ; |Text = "The Solution perhaps is 'AzulGranaEsMiColor'" FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner E8 00010000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA

--> Good boy :)

00401102 . EB 33 JMP 00401137 --> revient en 401141 au "dbut" du programme 00401104 > 3D 4D010000 CMP EAX,14D 00401109 . 75 18 JNZ 00401123 --> si EAX=14D alors continue sinon on saute au 0040110B . 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL 0040110D . 68 D3304000 PUSH 004030D3 ; |Title = "Uhhhhhhhhhhhhhh!!!!!!!!!!" 00401112 . 68 ED304000 PUSH 004030ED ; |Text = "The Keyword is not n characters long" 00401117 . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner 0040111A . E8 E3000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA 0040111F . EB 20 JMP 00401141--> 00401121 . EB 14 JMP 00401137 00401123 00401125 0040112A 0040112F 00401132

dessus de cette msgbox

--> mauvaise longueur du serial

revient en 401141 au "dbut" du programme

> 6A 10 PUSH 10 ; /Style = MB_OK|MB_ICONHAND|MB_APPLMODAL . 68 7A304000 PUSH 0040307A ; |Title = "Uhhhhhhhhhhhhhh!!!!!!!!!!" . 68 B8304000 PUSH 004030B8 ; |Text = "Best luck the next time :D" . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hOwner . E8 CB000000 CALL <JMP.&user32.MessageBoxA> ; \MessageBoxA

--> Bad Boy :(

00401137 > EB 08 JMP 00401141

C'est donc avec la valeur de EAX que le crackme dtermine si le serial est bon ou pas. A partir de a il est facile de lui faire afficher le bon message, mais le problme comme je l'ai dit c'est qu'il ne nous donnera pas le bon mdp car ce dernier sera calcul en fonction du mauvais serial que nous aurons rentr. Vous n'avez qu' essayer vous verrez bien qu'on obtient un mdp qui n'a pas de sens. Juste au dessus du passage que je viens de dtailler il y a une API intressante :
004010CE . 6A 08 PUSH 8 ; /Count = 8 004010D0 . 68 08304000 PUSH 00403008 ; |Buffer = 00403008 004010D5 . 68 EA030000 PUSH 3EA ; |ControlID = 3EA (1002.) 004010DA . FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |hWnd 004010DD . E8 14010000 CALL <JMP.&user32.GetDlgItemTextA> ; \GetDlgItemTextA 004010E2 . E8 60000000 CALL 00401147

L'API GetDlgItemTextA permet de rcuprer ce qui a t tap dans une boite de dialogue et ici par consquent cela doit tre notre serial. Et, entre cette API et la premire comparaison de EAX, il y a un CALL. Je ne vous cacherai pas que le serial est bien entendu vrifi dans ce CALL. Pour se rendre l'adresse du CALL il y a deux faons : le bus ou le mtro ! ... Je disais donc il y a deux faons : soit on regarde l'adresse de destination, ici 401147, et on y va la main (bon vous avez de la chance car ici ce n'est pas loin) ou alors on est malin et on appuie sur Entre aprs avoir slectionn la ligne du CALL. Au dbut du CALL il y a :
0040114B |. 68 08304000 PUSH 00403008 ; /String = "" 00401150 |. E8 CB000000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA 00401155 |. 83F8 05 CMP EAX,5 00401158 |. 74 13 JE 0040116D

L'API lstrlenA permet de mesurer la taille d'une chane de caractres, ici il s'agit du serial. Pour vous le prouver posez donc un BP (avec F2 ou en double-cliquant sur le numro de la ligne) sur la ligne du PUSH en 40114B. Lancez le programme avec F9, on tape un serial bidon "1234" de 4 caractres par exemple (enfin si mes calculs sont bons :-) ). Il breake normalement sur le push et vous voyez apparatre.
0040114B |. 68 08304000 PUSH 00403008 ; /String = "1234" 00401150 |. E8 CB000000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA

Bon vous me croyez maintenant ? ;-) On notera au passage que notre serial est stock en 403008, vous

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16

pouvez le voir dans la fentre du bas cette adresse, cela aura son importance pour la suite. Pendant qu'on est en dbogage on va continuer avec. Les raccourcis sont les mmes que pour le debuggueur de WinDasm c'est dire : F7 Step into et F8 Step Over. On avance avec F8 (pour viter de rentrer dans le CALL de l'API) jusqu'au CMP EAX, 5. L on voit bien que EAX (en haut droite dans la fentre des registres) est gal 4 soit le nombre de caractres de notre serial. Et donc 4 tant diffrent de 5 (enfin jusqu' prsent c'est le cas il me semble) le JE ne saute pas et on va continuer tranquillement, aprs avoir mis EAX 14D, vers un RETN en 40116C qui a pour but de nous faire sortir du CALL. Ainsi comme EAX = 14D nous allons avoir droit au message comme quoi il n'y a pas le bon nombre de caractres. En revanche si le serial fait 5 caractres on va en 40116D. Bon alors maintenant on va passer la vitesse suprieure.
0040116D |> PUSHAD 00401170 |. 00401172 |. 00401177 |. 00401179 |. 0040116E |. XOR EAX,EAX

--> sauvegarde tous les registres en les mettant sur la pile --> mise 0 de EAX XOR EBX,EBX --> idem pour EBX MOV ESI,00403008 ; ASCII "12345" --> met notre faux serial dans ESI MOV AL,BYTE PTR DS:[ESI] --> 1ere lettre du faux serial dans AL MOV ECX,1 --> initialisation du compteur

0040117E |> /MOV BL,BYTE PTR DS:[ESI+1] 00401181 |. |CDQ 00401182 00401184 00401185 00401186 00401189

--> 1ere lettre du faux serial dans BL --> convertit le mot sign de EAX en un quadruple mot dans <EDX:EAX> |. |MUL EBX --> multiplie EAX par EBX, le rsultat va dans EAX |. |INC ESI --> ESI+1 : lettre suivante |. |INC ECX --> ECX+1 : compteur |. |CMP ECX,5 --> compare le compteur 5 |.^ \JB SHORT 0040117E--> saute quand le compteur est infrieur ou gal 5 --> remet le serial bidon dans ESI --> mise 0 de ECX

0040118B |. MOV ESI,00403008 ; ASCII "12345" 00401190 |. XOR ECX,ECX

--> 1ere lettre du faux serial dans BL --> EAX = EAX + EBX 00401196 |. |CDQ --> convertit le mot sign de EAX en un quadruple mot dans <EDX:EAX> 00401197 |. |MUL EBX --> EAX = EAX * EBX 00401199 |. |INC ESI --> lettre suivante 0040119A |. |INC ECX --> compteur + 1 0040119B |. |CMP ECX,5 --> compare le compteur 5 0040119E |.^ \JB SHORT 00401192 --> saute quand le compteur est infrieur ou gal 5
00401192 |> /MOV BL,BYTE PTR DS:[ESI] 00401194 |. |ADD EAX,EBX 004011A0 |. CMP EAX,ED3C9A41 004011A5 |. POPAD 004011A6 |. JNZ

--> compare EAX et ED3C9A41 --> restaure les registres sauvs par le PUSHAD SHORT 004011B2 --> saute si EAX n'est pas gal ED3C9A41 met EAX 29A pour avoir le droit au good boy. --> sort du CALL

004011A8 |. CALL 004011B3 004011AD |. MOV EAX,29A --> 004011B2 \> RETN

A partir du serial donn, deux routines (la jaune et orange) calculent un nombre qui sera plac dans EAX si ce nombre est gal ED3C9A41 alors le serial est bon. Si c'est le cas on ira en 4011B3 grce au CALL. Je ne vais pas expliquer en dtail ce qu'il y fait car c'est inutile, mais ce CALL va transformer le faux mdp qu'on peut voir dans les strings en un bon mdp grce au serial valide. On voit effectivement :
004011B4 |. BF 44304000 MOV EDI,crackme.00403044 ; ASCII "The Solution perhaps is 'AzulGranaEsMiColor'" 004011B9 |. BE 08304000 MOV ESI,crackme.00403008 ; ASCII "12345"

Et la suite de a des oprations entre EDI et ESI (plus ou moins directement) qui ont pour effet de modifier le contenu de EDI (avec des XOR) et donc par consquent le mdp. Bon mais cette partie est indispensable donc on y touchera pas. On va revenir s'intresser la comparaison de EAX et ED3C9A41. Comment partir des deux routines pourrait-on trouver le bon serial. Si on veut faire a de tte c'est impossible. Il va donc falloir tester toutes les possibilits jusqu' trouver la bonne. Si on considre que le serial est compos de chiffres on a 100.000 possibilits, or le crackme nous indique d'entrer un "keyword" donc il se pourrait bien que ce soit un mot. Ce qui

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16

fait, si je compte bien, environ 12 millions de keyword diffrents possibles pour des lettres uniquement en majuscules OU en minuscules et 380 millions pour un mlange des deux. Inutile donc de vous dire que les tester la main n'est pas la bonne solution. Ou alors commencez maintenant vous gagnerez du temps ! Si on continue dans les calculs d'un niveau d'utilit inversement proportionnel aux nombres trouvs, connaissant le serial je peux vous dire que vous avez pour 15-20 ans non-stop avant de le trouver. ;-) Bon trve de plaisanterie et passons aux choses srieuses.

3 Programmation du Brute-Force
Tout d'abord il faut rflchir sur comment on va s'y prendre pour lui faire tester toutes les possibilits sans en oublier une. Vous savez compter au moins jusqu' 10 ? Trs bien dans ce cas vous tes l'homme (ou la femme) de la situation. On va faire comme si le programme comptait mais ici a sera avec des lettres. On lui rentrera le keyword de valeur la plus basse (correspondant 00000 si on travaillait avec des chiffres) et ensuite on va incrmenter le 1er rang de 1 chaque fois, une fois la valeur de celle-ci arrive [la valeur la plus haute + 1] on remet la valeur de celle-ci zro (enfin la valeur la plus basse) et on incrmente le 2me rang...etc... Si vous ne m'avez pas compris c'est soit car j'explique mal ou soit parce que vous m'avez menti et que vous ne savez pas compter. Voici un exemple parlant : on commence avec aaaaa, puis on a aaaab -> aaaac -> ... -> aaaaz -> aaaba -> ...etc... On va donc obtenir des boucles de tests dans des boucles pour tester si chaque rang ne dpasse pas la valeur autorise. Bon maintenant qu'on sait ce qu'on va faire peu prs (il n'y a plus qu' mettre en forme tout cela) il va falloir en premier lieu regarder o on va pouvoir mettre a. Car a c'est facile donc vite fait. :-) En descendant un peu dans le code on se rend compte qu'il y a une norme quantit de bytes libres. On va donc se placer ici. Allez hop on va s'installer en 40122A. Mais vous vous doutez bien que le programme ne va pas se dire "tiens y a de nouvelles instructions dans le fond l bas je vais voir ce que c'est", non il va falloir lui dire de venir voir ici. Pour cela on va retourner voir juste avant le dbut de la vrification avec les 2 routines :
0040114B |. 68 08304000 PUSH crackme.00403008 ; /String = "12345" 00401150 |. E8 CB000000 CALL <JMP.&kernel32.lstrlenA> ; \lstrlenA 00401155 |. 83F8 05 CMP EAX,5 00401158 |. 74 13 JE SHORT crackme.0040116D 0040115A |. 83C0 30 ADD EAX,30 0040115D |. 52 PUSH EDX 0040115E |. BA ED304000 MOV EDX,crackme.004030ED ; ASCII "The Keyword is not n characters long" 00401163 |. 8842 13 MOV BYTE PTR DS:[EDX+13],AL 00401166 |. B8 4D010000 MOV EAX,14D 0040116B |. 5A POP EDX 0040116C |. C3 RETN 0040116D |> 60 PUSHAD

La vrification de la taille du serial ne nous sert pas tellement vu que l'on sait maintenant que le serial fait 5 caractres. Mais bon par souci de bien faire on va essayer de faire un truc qui sera un minimum propre tout de mme. On va donc emmener le JE 0040116D en 40122A. Le problme c'est qu'il s'agissait d'un saut court et l il serait remplac en saut long prenant donc 4 bytes de plus ce qui craserait les instructions situes au dessous. Tant pis on aura le message d'erreur avec un "n" au lieu du nombre de lettres, ce qui n'est pas dramatique. Pour garder ce l'apparition de message il va falloir garder le MOV EAX,14D (car c'est avec cette valeur que le message est affich) et le RETN uniquement. Donc soit on noppe ce qu'il y a d'inutile entre les 2 ou alors on rcrit la suite du JE ces deux instructions. J'opte pour la seconde solution mais les deux marchent. Voil ce que a nous donne :
00401155 |. CMP EAX,5 00401158 |. JE crackme.0040122A 0040115E |. MOV EAX,14D 00401163 |. RETN 00401164 |. NOP 00401165 |. NOP 00401166 |. MOV EAX,14D 0040116B |. POP EDX 0040116C |. RETN 0040116D |> PUSHAD

Les lignes en jaune ne seront jamais effectues car la suite de nos instructions le programme sort du CALL.

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16

Et si EAX=5 on saute et on reviendra en 40116D sur le PUSHAD pour la vrification du serial. On retient donc cette adresse, ne vous en faites pas je le fais pour vous sur ce coup l. ;-)

Passons aux choses srieuses ! On va mettre en forme plus prcisment notre algorithme. Voil comment on va s'y prendre : - Incrmenter r1 (le 1er rang) - Comparer r1 la plus haute valeur possible + 1 (par exemple si on fait les lettres de A Z, on va comparer r1 au caractre suivant le Z) - Si diffrent alors on sort - Sinon incrmenter r2 - Rinitialiser r1 - Comparer r2 la plus haute valeur possible + 1 - Si diffrent alors on sort - Sinon incrmenter r3 - Rinitialiser r2 - ...etc... jusqu' r5 Il faut maintenant trouver l'adresse de chaque rang. Ce n'est pas dur car on sait que notre serial est plac en 403008 donc le 1er rang (ou dernier selon le sens o l'on commence, a revient au mme) est en 403008, le second en 403009, puis 40300A, 40300B et enfin 40300C. Reste savoir maintenant ce qu'on va mettre comme valeur correspondant aux caractres. Disons qu'on va prendre les majuscules et minuscules (bon je triche car je connais la rponse :-p mais au dpart je vous conseille plutt de commencer avec seulement l'un ou l'autre a ramera moins, et si les deux ne fonctionnent pas testez avec les deux). On regarde donc dans une table ascii (incluse dans HexDecCharEditor avec le bouton avec un carr jaune) les valeurs correspondantes : en hexa 'A' 'Z' cela fait de 41 5A et 'a' 'z' de 61 7A. On ne va donc pas s'embter pour 8 valeurs entre les deux sries et on va donc les inclure. Ce qui nous donne de 41 7A. Avec tout ce qu'on a, on va pouvoir commencer rentrer les instructions en 40122A. INC BYTE [403008] --> r1+1, "byte" indique qu'il faut incrmenter uniquement un octet (un rang) CMP BYTE [403008],7B --> compare r1 la plus grande valeur + 1 c'est dire 7A+1=7B JNZ 0040116D --> retourne au PUSHAD pour vrifier le serial INC BYTE [403009] --> r2+1 MOV BYTE [403008],41 --> initialise r1 en mettant sa valeur 41 (caractre 'A') CMP BYTE [403009],7B JNZ 0040116D INC BYTE [40300A] --> r3+1 MOV BYTE [403009],41 CMP BYTE [40300A],7B JNZ 0040116D INC BYTE [40300B] --> r4+1 MOV BYTE [40300A],41 CMP BYTE [40300B],7B JNZ 0040116D INC BYTE [40300C] --> r5+1 MOV BYTE [40300B],41 CMP BYTE [40300C],7B JNZ 0040116D RETN --> sort de la routine pour revenir l'affichage des messagebox, si on arrive ici c'est qu'aucun code test ne marche.

Il ne reste plus qu'un lment rajouter. Vous ne voyez pas ce qu'il faut ? Une fois le serial incrment il va vrifier le serial et s'il est invalide il va faire quoi ? Et bien nous emmener au mauvais message. On va donc modifier ce saut pour l'emmener en cas d'chec sur le dbut de notre routine pour incrmenter notre serial. Le saut modifier est le suivant :
004011A0 . CMP EAX,ED3C9A41

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16
004011A5 004011A6 004011A8 004011AD 004011B2 . POPAD . JNZ SHORT crackme.004011B2 . CALL crackme.004011B3 . MOV EAX,29A > RETN

On va donc remplacer la destination du saut par 40122A. Mais l on a un problme ! Le saut est plus long que prvu et on a donc pas assez de bytes pour crire le saut. On va donc procder un petit dmnagement des instructions qui suivent le JNZ. On les dplace en 4012AA l o il y a de la place. Le JNZ reste ici mais en changeant la destination vers 40122A comme on l'avait prvu. En revanche la place du CALL (enfin la suite du JNZ) on va mettre un JMP vers 40122AA. J'espre que vous arrivez suivre un peu. Voici plus clairement ce qu'on change :
004011A0 004011A5 004011A6 004011AC 004011B1 004011B2 004011B3 . . . . . . . CMP EAX,ED3C9A41 POPAD JNZ crackme.0040122A JMP crackme.004012AA NOP RETN PUSHAD

Les instructions en bleu ne seront jamais effectues. Et en 4012AA on retrouve :


004012AA CALL crackme.004011B3 004012AF MOV EAX,29A 004012B4 RETN

Tout a tant dsormais en place il va falloir dsormais tester notre crackme modifi. Je vous conseille, au lieu de lancer le crackme directement, de tester cela dans OllyDbg en posant des BP certains moments. Et n'oubliez pas de sauvegarder votre fichier maintenant car si vous avez fait des erreurs en tapant les instructions le programme pourrait par exemple tourner indfiniment en rond ce qui le ferait planter et vous ferait perdre vos modifications. Comme vous l'avez vu on n'a pas initialis le serial au dpart donc c'est nous de le faire en tapant le serial au dpart. Ainsi pour que le crackme teste toutes les lettres il faut taper "AAAAA". En fait avec cela la solution "AAAAA" ne sera pas teste car elle sera incrmente avant la vrification donc si on veut vraiment tester cette solution on le fait la main ou on commence par "@AAAA" le '@' correspondant 40h soit 1 de moins que pour le 'A'. Pour le tester on va par exemple breaker sur l'incrmentation de r1 et faire ensuite F9 plusieurs reprises pour qu'il fasse plusieurs tours. Vous vrifierez bien (dans la fentre du bas l'adresse 403008) que ce rang l est bien augment et que le passage la "dizaine" suprieur se droule comme prvu. a fonctionne ? Trs bien. Dans ce cas le brute force est oprationnel. Cependant si vous lancez le programme tout seul il risque au mieux de ramer un peu et au pire de planter car il doit tester un nombre important de possibilits. Alors vous pouvez ventuellement poser un BP sur l'incrmentation du dernier rang, a permettra au programme de respirer un peu :-p. Il suffira d'appuyer sur F9 jusqu' ce qu'on trouve le bon serial (au maximum 50-60 appuis). Enfin libre vous de tester comme vous le souhaitez. ;-) On trouve donc un moment un beau messagebox avec marqu "Congratulations - The solution perhaps is 'PobreLorito'" ! On a donc russi ! Si vous avez lanc le bruteforce avec OllyDbg pour connatre le keyword qui fonctionnait il vous suffit de regarder l'adresse 403008 o l'on peut voir "ChaOs". Comme dirait l'autre : "another crackme cracked" ! :-p

Conclusion
Voil un crackme crack d'une manire diffrente de ce qu'on a pu voir dans mes autres cours. La mthode que j'ai utilise n'est pas forcment la meilleure ou la plus rapide mais elle a au moins le mrite de fonctionner ;-). Comme quoi il est possible de brute forcer sans savoir vraiment programmer. Il faut juste savoir exploiter au maximum les connaissances que l'on a pour rsoudre des problmes. J'espre que ce cours vous a plu. N'hsitez pas faire des remarques (critiques, suggestions, autre
file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]

Cours n16

mthodes...) par mail : deamon.crack (at) netcourrier.com ou bien sur le forum : www.forumcrack.new.fr . Excusez-moi pour cette fin de cours qui est peut-tre un peu confuse car j'tais un peu pris par le temps et de plus j'ai mal gr pour le coup du saut court qui se transforme en saut long. Mais maintenant que vous avez compris vous devriez pouvoir refaire ce crackme en l'amliorant tout cela. :-)

Deamon, le 15-18 fvrier 2005 <<< Retour au cours prcdent [ Crackme avec KeyFile ]

file:///C|/Users/Test/Desktop/cours/Cours%20n16.htm[24/05/2012 08:40:46]