Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
ndh2k12_public:crackme:bukakke [2012/07/02 14:05] TheLizardKing [ccc function] |
ndh2k12_public:crackme:bukakke [2017/04/09 15:33] (Version actuelle) |
||
---|---|---|---|
Ligne 109: | Ligne 109: | ||
</code> | </code> | ||
- | Bon, on voit un certains nombre de ''mov [ebp-xx],0xyy'', je décide de ne pas y prêter attention pour le moment. On remarque surtout l'appel à la fonction ''WhatisIt'' avec laquelle notre serial est passé en argument, ainsi que l'appel à ''ccc'' qui passe en argument quelque chose stocké en ''ebp-0x28'' ainsi que ''ebp-0x48''. Ceci parait louche, d'autant qu'il y a un certain nombre de ''mov'' sur l'''ebp''. La suite du programme dépend de ce que renvois ''ccc'' dans ''eax''. Si c'est un 0, le serial n'est pas le bon, si c'est autre chose, le mot de passe est le bon. | + | Bon, on voit un certain nombre de ''mov [ebp-xx],0xyy'', je décide de ne pas y prêter attention pour le moment. On remarque surtout l'appel à la fonction ''WhatisIt'' avec laquelle notre serial est passé en argument, ainsi que l'appel à ''ccc'' qui passe en argument quelque chose stocké en ''ebp-0x28'' ainsi que ''ebp-0x48''. Ceci parait louche, d'autant qu'il y a un certain nombre de ''mov'' sur l'''ebp''. La suite du programme dépend de ce que renvoie ''ccc'' dans ''eax''. Si c'est un 0, le serial n'est pas le bon, si c'est autre chose, le mot de passe est le bon. |
Il ne nous reste plus qu'à regarder ce que font ''WhatisIt'' et ''ccc''. | Il ne nous reste plus qu'à regarder ce que font ''WhatisIt'' et ''ccc''. | ||
Ligne 137: | Ligne 137: | ||
0x08048cdb <+39>: je 0x8048ce4 <ccc+48> ; ils sont égaux | 0x08048cdb <+39>: je 0x8048ce4 <ccc+48> ; ils sont égaux | ||
0x08048cdd <+41>: mov eax,0x0 ; si non, eax <- 0 | 0x08048cdd <+41>: mov eax,0x0 ; si non, eax <- 0 | ||
- | 0x08048ce2 <+46>: jmp 0x8048cf3 <ccc+63> ; on sors de la fonction ! (return 0) <=> le serial n'est pas le bon | + | 0x08048ce2 <+46>: jmp 0x8048cf3 <ccc+63> ; on sort de la fonction ! (return 0) <=> le serial n'est pas le bon |
0x08048ce4 <+48>: add DWORD PTR [ebp-0x4],0x1 ; si les deux chars sont égaux, on incrémente de 1 le compteur | 0x08048ce4 <+48>: add DWORD PTR [ebp-0x4],0x1 ; si les deux chars sont égaux, on incrémente de 1 le compteur | ||
0x08048ce8 <+52>: cmp DWORD PTR [ebp-0x4],0x1f ; | 0x08048ce8 <+52>: cmp DWORD PTR [ebp-0x4],0x1f ; | ||
Ligne 147: | Ligne 147: | ||
</code> | </code> | ||
- | Bon, on remarque très facilement que c'est une boucle qui vérifie si deux chaines sont les mêmes. A partir de la première différence, on sors de la boucle. Il ne nous reste plus qu'à savoir à quoi corresponde les deux chaines. L'une doit probablement correspondre à notre serial et l'autre au serial à trouver. Elles ont certainement été calculées par la fonction ''WhatisIt'' que nous avons choisis de ne pas regarder. | + | Bon, on remarque très facilement que c'est une boucle qui vérifie si deux chaines sont les mêmes. A partir de la première différence, on sort de la boucle. Il ne nous reste plus qu'à savoir à quoi correspondent les deux chaines. L'une doit probablement correspondre à notre serial et l'autre au serial à trouver. Elles ont certainement été calculées par la fonction ''WhatisIt'' que nous avons choisi de ne pas regarder. |
- | Pour arriver à trouver quelle chaine correspond à quoi, il suffit de lancer le programme deux fois, avec deux serials différent et de regarder laquelle des deux valeurs a changé! | + | Pour arriver à trouver quelle chaine correspond à quoi, il suffit de lancer le programme deux fois, avec deux serials différent et de regarder laquelle des deux valeurs a changé ! |
<code> | <code> |