logo Homepage
Pages: [1]
  Imprimer  
Auteur Fil de discussion: Cracking: Breakpoint sur fonction  (Lu 2391 fois)
Lascazas

Profil challenge

Classement : 141/54278

Membre Junior
**
Hors ligne Hors ligne
Messages: 94

//


Voir le profil
« le: 13 Juillet 2015 à 19:59:58 »

Les 2 techniques les plus basiques pour cracker un programme sont:
-Regarder les text strings
-Mater les appels dans la pile

Je vous en propose une troisième: Mettre des breakpoint sur des fonctions spécifiques
Le prog, un crackme que je vous ai codé (code source à la fin) :
https://www.dropbox.com/s/u64y765zl7vhudv/crackme.exe

C'est du 100% ligne de commande, il prend le mot de passe en argument dans la ligne de commande.
Donc soit vous ouvrez avec cmd.exe etc, soit vous créez un .bat à coté avec dedans:
Code:
crackme.exe password
pause

Donc, on ouvre dans ollydbg, on va lui mettre un argument avec ce menu, on met 123456789 pour tester:
http://image.noelshack.com/fichiers/2012/33/1344872852-0.png

Une fois que c'est fait, il faut relancer avec le bouton ou CTRL+F2

Pour tenter l'approche classique, on cherche les text strings et... Fail:
http://image.noelshack.com/fichiers/2012/33/1344872989-00.png

Il va falloir trouver une autre solution.
Cette solution sera de s'arrêter sur des fonctions qu'on suspecte de jouer un rôle dans la vérif du serial.

Donc on va aller cliquer sur le bouton E bleu
On voit les modules chargés, on fait clic droit sur crackme > View names

Ca nous affiche toutes les fonctions utilisées par le programme:
http://image.noelshack.com/fichiers/2012/33/1344873096-1.png

Rien de très flagrant, à part memcmp, qui pourrait servir à comparer des données en mémoire.
On fait donc clic droit dessus, set breakpoint on every reference

Le programme va s'arrêter à l'appel de memcmp, ce qui nous permettra d'analyser ce qui se passe.
Donc on lance avec F9, et on regarde la pile quand ça s'arrête:
http://image.noelshack.com/fichiers/2012/33/1344873219-2.png

Voilà les paramètres de memcmp.
s1, s2 et n.
n c'est le nombre de caractères à comparer, ici 10.
s1 et s2 ce sont les chaines comparées.

On fait clic droit sur s1 > Follow in dump:
http://image.noelshack.com/fichiers/2012/33/1344873557-3.png
Ca nous permet de voir les données brutes de s1.
"01 02 03 04 05 06 07 08 09"...Tiens, c'est le 123456789 qu'on a entré

On fait clic droit sur s2 > Follow in dump:
http://image.noelshack.com/fichiers/2012/33/1344873664-4.png
01 07 05 04 06 03 02 09 08 08
Donc en fait le pass est 1754632988
...
http://image.noelshack.com/fichiers/2012/33/1344873765-7.png
Voilà !

Le code source du programme était:
Code:
#include <stdio.h>
#include <stdlib.h>

void pc(int c)
{
    putc(c^0xCC,stdout);
}

int main(int argc,char* argv[])
{
    char password[]={1,7,5,4,6,3,2,9,8,8,0};
    unsigned char msg[]={'B'^0xCC,'a'^0xCC,'d'^0xCC,0xCC};
    unsigned char msg2[]={'G'^0xCC,'o'^0xCC,'o'^0xCC,'d'^0xCC,0xCC};
    char* buf=argv[1];
    if(argc==1) buf=main;
    int i;
    for(i=0;buf[i]!=0;i++)
        buf[i]-=0x30;
    if(memcmp(buf,password,10)==0)
        for(i=0;msg2[i]!=0xCC;i++)
            pc(msg2[i]);
    else
        for(i=0;msg[i]!=0xCC;i++)
            pc(msg[i]);
}
On peut voir que j'ai appliqué un XOR au texte pour qu'on puisse pas le trouver
Journalisée
Pages: [1]
  Imprimer  
 
Aller à: