Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
| 
    ndhquals2015:crackme_prime [2015/04/05 14:59] Spl3en  | 
    
    ndhquals2015:crackme_prime [2017/04/09 15:33] (Version actuelle) | 
    ||
|---|---|---|---|
| Ligne 34: | Ligne 34: | ||
| - Dans la première condition, le programme vérifie si un argument a été donné au programme en vérifiant ''argc'' | - Dans la première condition, le programme vérifie si un argument a été donné au programme en vérifiant ''argc'' | ||
| + | |||
| - Dans la deuxième condition, il vérifie que la taille du premier argument fait 29 caractères en faisant un ''strlen (argv[1])'' | - Dans la deuxième condition, il vérifie que la taille du premier argument fait 29 caractères en faisant un ''strlen (argv[1])'' | ||
| + | |||
| - Dans la troisième condition, il vérifie que le premier argument ne contient pas le caractère '0' en faisant un ''strchr (argv[1], '0')'' | - Dans la troisième condition, il vérifie que le premier argument ne contient pas le caractère '0' en faisant un ''strchr (argv[1], '0')'' | ||
| Ligne 40: | Ligne 42: | ||
| - | Le long block au milieu s'occupe de lire le premier argument, en le décomposant en 6 sous parties de 4 caractères, en sautant un caractères à chaque fois entre chaque. | + | Sachant cela, on doit maintenant comprendre ce que fait le gros block du milieu. | 
| + | Voici une décompilation d'HexRays afin d'éviter la lecture de l'assembleur : | ||
| + | |||
| + | {{http://puu.sh/h2e1d/57b740b3fb.png}} | ||
| + | |||
| + | |||
| + | On en déduit que le long block au milieu s'occupe de lire le premier argument du programme, en le décomposant en 6 sous parties de 4 caractères, en sautant un caractères à chaque fois entre chaque. | ||
| Notre serial est donc de la forme : ''xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'' | Notre serial est donc de la forme : ''xxxx-xxxx-xxxx-xxxx-xxxx-xxxx'' | ||
| Ligne 49: | Ligne 57: | ||
| 29 | 29 | ||
| - | Sachant cela, on doit maintenant comprendre ce que fait le gros block du milieu. | + | Chaque sous partie de 4 caractère passe dans ''strtol'' ayant pour argument 16, ce qui nous indique que ces sous parties doivent être de l'hexadécimal. | 
| - | Voici une décompilation d'HexRays afin d'éviter la lecture de l'assembleur : | + | |
| - | + | ||
| - | {{http://puu.sh/h2e1d/57b740b3fb.png}} | + | |
| - | On remarque l'utilisation d'une fonction ''c1'' que l'on a pas encore analysé. | + | En fin de block, on remarque l'utilisation d'une fonction ''c1'' que l'on n'a pas encore analysé. | 
| - | Elle prend en entrée un mot de 16 bits récupéré depuis notre argument. | + | Elle prend en entrée un mot de 16 bits, récupéré depuis les sous parties de 4 caractères hexa. | 
| Un rapide aperçu du flow graph de cette fonction nous indique qu'elle est complexe : | Un rapide aperçu du flow graph de cette fonction nous indique qu'elle est complexe : | ||
| {{http://puu.sh/h2ekZ/8c485f4fd4.png}} | {{http://puu.sh/h2ekZ/8c485f4fd4.png}} | ||
| - | Elle appelle des fonctions telles que ''aes_init'', ''aes_decrypt'', ''EVP_aes_256_cbc'', laissant supposer que de l'AES-256 CBC est utilisé. | ||
| Plutôt que d'analyser cette fonction, nous allons nous intéresser à sa sortie : 0, 1, ou -1 en cas d'erreur. | Plutôt que d'analyser cette fonction, nous allons nous intéresser à sa sortie : 0, 1, ou -1 en cas d'erreur. | ||