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. |