Writeup RCE100 préqualifications NDH 2k11

Article écrit par Le_MaLaDe. Merci à lui 🙂

Dans cette épreuve, nous avons un simple crackme avec un code à rentrer nous indiquant si le mot de passe inséré est bon ou non.

Ouvrons donc ce crackme au moyen d’un debugger, ici OllyDbg.

On remarque très vite que le binaire est packé. On le voit quand on arrive en 00466D90 au début du programme.

On entre dans une routine de décompression (fin en 00466F1B).

On pose donc un breakpoint en sélectionnant la ligne et en appuyant sur F2. On lance le soft pour le laisser se décompresser en appuyant sur F9. OllyDbg s’arrête donc à la fin de la décompression et nous redirige vers le début du soft.

Il suffit ensuite d’avancer dans le programme pas à pas en appuyant sur la touche F8. Arrivé en 0041E48A, nous sommes en zone de données.

Pour avoir le code lisible il suffit de faire un clic-droit, puis Analysis, et Analyse code.

Partons maintenant à la recherche de la routine de vérification du code ou quelque chose qui pourrait nous intéresser. Un clic-droit, Search for, All referenced strings pour avoir des indices. Nous ne pouvons pas chercher de texte sur le bon message comme il s’agit d’une image. On voit tout de même le texte du bouton Login et Quit. Si on double-clique sur Login on arrive en 0041EE48.
On descend rien de spécial… On remonte, on tombe sur un PostQuitMessage, on remonte un peu et on tombe sur quelque chose d’intéressant !

De l’imul, du sub, il pourrait bien s’agir d’une routine de calcul ! On pose donc un breakpoint en 0041EC50, on lance le soft mais ça s’arrête de suite… Par contre si on pose un point d’arrêt à la fonction juste en-dessous en 0041ECB0 on s’arrête bien quand on valide.
Le soft va donc récupérer le code, et on voit ensuite qu’on fait bien appel à notre fonction en 0041EC50, celle-ci hashe notre code entré, et le compare à 0xC4B1801C, si c’est égal, on affiche le bon message.

Nous allons donc recoder la fonction de hash pour comparer le code à ce qu’il faut obtenir, à savoir 0xC4B1801C.
Comme il s’agit d’une fonction de hash, elle n’est donc pas réversible (des multiplications en fonction des caractères saisis…), il faudra donc brute-forcer, c’est-à-dire tester toutes les possibilités jusqu’à ce que ça corresponde au code.
En gros, la routine initialise ESI à 0xDEADBEEF, et débute une boucle.

Début de la boucle en prenant chaque caractère dans EAX

ESI = ESI * 0x38271606
EAX = EAX * 0X5B86AFFE
EAX = EAX – ESI
ESI = EAX
Fin de la boucle
EAX = ESI

Voici le code python qui nous génèrera tout ça : Lien_Code_RCE100

Il est possible d’utiliser les librairies de python pour faire le brute-force, mais le but était de montrer l’algo.
Une fois lancé, on patiente… et on obtient pWn3D.

Laissez un commentaire