Baboon's Blog - Mot-clé - Acide2016-11-05T16:24:49+00:00Baboonurn:md5:f26b67ff836d93885e04843b0cae9de4DotclearArmadillo est un tatoo sous acide en manque de crackurn:md5:5ce6367442a9e64a7967083827274d032010-05-09T21:10:00+01:002010-05-10T22:15:34+01:00Baboon5192296858534827627896703833467507AcideArmadilloBigNumECCGF(2^113)Tatoo<p>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...</p>
<p>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é".</p>
<p>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.</p>
<p>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</p>
<p>Armadillo utilise les courbes elliptiques pour vérifier le sérial entré, et c'est là que le bas blesse ...</p>
<p>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 ...</p> <p>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 <a href="http://csrc.nist.gov/groups/ST/toolkit/documents/dss/NISTReCur.pdf" hreflang="en">NIST</a> ou du <a href="http://www.secg.org/download/aid-386/sec2_final.pdf" hreflang="en">SECG</a> 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</p>
<p>Une recherche sur google nous informe que l'ordre premier correspond à une courbe de Koblitz sur GF(2^113) décrite dans les <a href="http://www.yqie.com/service/wap/source/wap/download/spec-wtls-19991105.pdf" hreflang="en">specs WAP WTLS</a> de 1999.</p>
<p>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)</p>
<p>On vérifie avec Pari GP (au passage petite pub pour ce merveilleux outil dev par des français (cocorico)) :</p>
<pre>
(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]
</pre>
<p>youpi !</p>
<p>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 ...</p>
<p>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.</p>
<p>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 ...</p>
<p>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.</p>
<p>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 ...</p>
<p>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</p>
<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 <img src="/themes/default/smilies/wink.png" alt=";)" class="smiley" /></p>