Armadillo est un tatoo sous acide en manque de crack
Par Baboon le dimanche, mai 9 2010, 21:10 - Lien permanent
Salut les zouaves, aujourd'hui pas vraiment de choses techniques juste une mise en bouche à mon prochain post ainsi qu'une bonne dose de rage...
Voulant me remettre un peu au reverse d'applis flash pour ne pas être spammé de pub quand je veux regarder le dernier épisode de bob l'éponge, j'ai téléchargé un soft qui va bien et que j'avais déjà "étudié".
Il se trouve que le soft en question est protégé par armadillo ayant un peu la flemme de l'unpacker une fois de plus, j'ai cherché si il n'avait pas été released et je suis tombé sur un keygen+patch de DVT.
Sachant que l'application était protégée par Armadillo, j'ai été assez impressionné par cette release et me suis mis en tête de faire la même chose :p
Armadillo utilise les courbes elliptiques pour vérifier le sérial entré, et c'est là que le bas blesse ...
Il se trouve que la librairie de bignum utilisée par Armadillo a surement été codée par un stagiaire d'Ouzbékistan en manque de crack et sous acide. Je ne sais pas si c'est une lib maison ou connue mais c'est assez édifiant ...
Avant de m'étendre là dessus un petit mot sur la courbe utilisée par Armadillo. Déjà plutôt que d'utiliser les courbes "standards" du NIST ou du SECG il fait le malin et utilise une courbe sortie de "nulle part". La seule information que l'on a est l'ordre premier du générateur que l'on trouve dans les SDR : 5192296858534827627896703833467507
Une recherche sur google nous informe que l'ordre premier correspond à une courbe de Koblitz sur GF(2^113) décrite dans les specs WAP WTLS de 1999.
La courbe utilisée est donc : y² + xy = x^3 + x² + 1. Qui est utilisée dans GF(2^113) construit à l'aide du polynôme x^113 + x^9 + 1. (à vérifier pour le polynôme)
On vérifie avec Pari GP (au passage petite pub pour ce merveilleux outil dev par des français (cocorico)) :
(21:47) gp > gf = ffgen(Mod(1,2)*(x^113+x^9+1)) time = 0 ms. %1 = x (21:47) gp > e = ellinit([1,1,0,0,1]) time = 0 ms. %2 = [1, 1, 0, 0, 1, 5, 0, 4, 5, 25, -989, -557, -15625/557, [-1.627524374728508475847551213, 0.1887621873642542379237756065 - 0.7607883796077915001151281354*I, 0.1887621873642542379237756065 + 0.7607883796077915001151281354*I]~, 4.319289634023725525717193601, 2.159644817011862762858596801 - 1.130485447887283043983103252*I, 2.614355328193713389891272325 - 5.04870979 E-29*I, 1.307177664096856694945636163 + 0.7704263744753850346564148888*I, 4.882894076474210213866946808] (21:47) gp > ellpow(e,[gf+1,ellordinate(e,gf+1)[1]],5192296858534827627896703833467507) time = 12 ms. %3 = [0]
youpi !
Bon maintenant il reste à chercher le générateur utilisé (est ce le standard ou un autre ?), à voir comment le sérial est transformé en abscisse, a confirmé que Armadillo utilise bien Nyberg-Rüeppel etc. et pour ça il faut bien mettre les mains dans le code ...
Armadillo ne nous aide pas vraiment, la librairie de bignum utilisée semble être maison (enfin j'espère vu la qualité du code ...), elle est compilée visiblement en mode debugg, il y a des traces de variables de debugg un peu partout, le code n'est ABSOLUMENT PAS optimisé par le compilo etc.
On se retrouve donc à tracer du code dégueulasse sous olly en essayant de défricher un peu le tout à l'aide de IDA et là on tombe sur des énormités sans noms ...
Des BigNums constants créés et détruits à chaque tour de boucle au lieu de les crée une fois avant la boucle et de les détruire après.
Une ENORME routine utilisant les modulos / divisions / décalages / multiplications (le tout sur des bignums je le rappelle ...) pour transformer un BigNums en sa représentation hexadécimale en little endian .... représentation directement accessible dans la structure du bignum, un memcpy aurait suffit ...
Bref, c'est horrible à tracer, c'est une saloperie sans nom et n'ayant pas de twitter pour me plaindre, je me permet de le faire sur mon blog :p
Je vous tiens au courant de mon avancé concernant ce reverse, par contre je suis aussi en stage donc je ne pourrai bosser dessus qu'en dehors de mes horaires de boulot
Commentaires
Bon courage pour ce crack, il est bien que tu éclaire une tache sombre dans le cracking.
Le code source vient du livre "Implementing elliptic curve cryptography" de Michael Rosing.
Un lien qui peut t'aider : http://www.manning-source.com/books... Regarde dans les dossiers onb et fast_onb =)
Salut JB
Merci pour le lien, quand j'aurai le temps je recommencerai un peu mon étude, là j'ai trop de taff pour mon stage.
Enfin ces sources devraient bien me faciliter la tâche.
j'adore ton blog !
j'ai l impression de retrouver mes premiers articles a l'epoque de noroute
continue comme ca je suis tres fier de dire que des petit frenchies se demerde a ce point et en restant humble , marrant et avec un excellent contenus. je suis bluffer.
antilove / ADM Crew
Salut antilove
Merci pour ton commentaire ca fait toujours plaisir
Sinon pour le blog, je n'ai pas vraiment le temps de le mettre à jour ces temps ci ni pour continuer mon truc sur armadillo :/
Mon stage me prend pas mal de temps !
Salut Baboon,
je n'ai pas touché à la partie crypto, mais jB a raison
désolé pour le code degueulasse, mais ca fait du sport
Sinon toujours agréable à lire ton blog, même si je ne viens pas très régulierement.
Hehe
Je sais que la partie crypto n'est pas de toi (heureusement :p)
Pour ce qui est du code j'ai fini par m'en sortir et plus c'est dégueulasse, plus on est content d'y être arrivé mais si je ne me plains pas on ne me reconnais plus !
Merci pour ton commentaire sinon, venant de toi ca me fait tout spécialement plaisir, à l'occasion j'essaierai de te remercier en bière