NDH2k11 Prequals - Rce300
By NiklosKoda on Tuesday, April 5 2011, 00:12 :: Prequals ndh2k11 :: Permalink
L'épreuve qui nous a donné le plus de mal, est sans doute la RCE300. C'était la dernière épreuve qu'il nous restait, et toute la team s'y est attaqué afin de finir ces préquals :p
On nous fournissais un fichier crackme.nds, avec pour seule indication qu'il s'agissait d'une application pour nintendo DS !
L'intéressant ici était de se documenter sur le format, et d'arriver à se faire un environnement de débug + reverse :)
Au final, nous avons utilisé les outils suivants :
- DeSmuME, un émulateur Nintendo DS
- Insight pour utiliser gdb
- IDA
- Un loader pour IDA qui permet de reconnaitre les fichiers *.nds
Avec ça on est paré, on peut donc maintenant lancer DeSmuME en mode dev avec la commande :
DesMume_dev.exe --arm9gdb=5555 crackme.nds
Pour y attacher ensuite un gdb, avec la commande :
target remote localhost:5555
On utilise ensuite IDA, avec le loader permettant de charger le *.nds :
Au passage il est bon de noter que la DS utilise un processeur ARM, il va donc falloir se documenter un peu sur l'ARM, ici, ici, ici et ici.
En cherchant la chaîne password, on tombe sur une première routine intéressante : sub_20002B8. Dans laquelle on voit clairement l'affichage du prompt et la demande de serial (on devine que sub_2003888 est un printf() et que sub_2003ACC est un scanf()) :

On voit ensuite que si on entre un serial, le chemin emprunté passe par 2 boucles qui ont la même structure :
- Multiplication de R0 par une constante
- Appel de sub_2003530 (qui prend en paramètre R0, et le caractère courant du serial entré dans R1, et qui renvoie R0 modifié)
- Xor de R0 par une constante
- En fin de boucle : comparaison de R0 à une checksum : granted si les 2 checksums matchent, denied sinon !
On voit que :
- La première checksum est 0x33E0D2F1
- La deuxième checksum est 0xBCFA8D3F
Et enfin, on analyse la fonction sub_3530, qui était assez impréssionnante :

Plusieurs hints avaient été données sur l'IRC #ndhprequals, notamment qu'il fallait faire un brute-force, et qu'il fallait se limiter au charset alphanumérique et à une longueur de 6 caractères. En refaisant l'alogrithme en C (le plugin hex-rays pour IDA peut grandement aider...) on est alors capable de faire un rapide bruteforce, qui au bout de quelques dizaine de minutes nous a sorti le serial valide "DsLrox" ! \o/
Voilà donc une épreuve vraiment sympathique, dont le plus intéressant pour moi a été de découvrir comment mettre en place un environnement de débug comme celui ci. Et ce fut également un bel exemple de travail en équipe ;)




Comments
Apparemment, comme le fait remarquer Baboon sur le write-up de nibbles, la fonction sub_3530 était une simple division >.<
Ca nous aurait bien simplifié la vie de remarquer ça :p
http://blog.nibbles.fr/2436/comment...