Logo Blog perso d'Ozwald

metasm, en mieux (ou pas)

Par Oz le - Sécurité
Gentoo Outil Reverse Engineering miasm python

Oz2020Migration : True

Il n'y a que deux choses qui manquent à Python, à mon humble avis : metasploit, et metasm. Or il semblerait qu'il y a quelques jours/semaines, l'un de ces deux manques ait été comblé par miasm, l'équivalent de metasm en python ! J'étais donc obligé de faire au moins un petit billet là dessus :)

Engine - Creative Common by "cbowns" on Flickr

Comment installer miasm ? La page officielle du projet est relativement claire, mais ne s'applique pas immédiatement (en particulier quand on est sous gentoo). Voilà donc la démarche que j'ai suivi, ce n'est peut être pas la meilleure mais "chez moi ça marche"(c). D'abord voyons les dépendances :

  • Grandalf (https://github.com/bdcht/grandalf) in order to render graphical disassembler.
  • Modified libtcc (http://bellard.org/tcc/) to Jit code for emulation mode. see below
  • python-ply for parsing
  • numpy
  • python-virtualenv
  • python-dev
  • python-qt4

Allons y par étape en adaptant pour gentoo :

Grandalf viendra tout seul quand on clonera le méta-répertoire, on ne s'en occupe donc pas.

Concernant la libtcc on va suivre les instructions tout simplement : git clone git://repo.or.cz/tinycc.git puis on édite le Makefile conformément à ce qu'indique le site de miasm, puis make...échec texi2html: Command not found...Pas de problème emerge -v texi2html puis on re-tente le make : victoire ! Il ne reste plus qu'à make install.

Pour "python-ply" il faut en fait installer "dev-python/ply", sauf qu'il est masqué par le keyword x86. On démasque donc et on installe joyeusement : echo "dev-python/ply ~x86" >> /etc/portage/package.keywords && emerge -v ply

Pour "numpy" rien de plus simple emerge -v numpy.

Idem pour "python-virtualenv" qui s'installe sans poser de problème avec un simple emerge -v virtualenv

Pour "python-dev" c'est encore plus simple : rien à installer puisque nous sommes sous Gentoo :)

Enfin "python-qt4" est lui aussi assez simple à obtenir puisqu'il suffit d'un emerge PyQt41

Maintenant on clone le répertoire hg clone https://code.google.com/p/smiasm/ smiasm...fail. Après un emerge -v hg-git ça ne se passe pas mieux...Après quelques recherches la version de mercurial stable sous gentoo est la 1.7, or le support des subrepository GIT n'apparait dans mercurial qu'à partir de 1.8 -_- ....bon...echo "=dev-vcs/mercurial-1.8.2 ~x86" >> /etc/portage/package.keywords && emerge -v =dev-vcs/mercurial-1.8.2...damned ça foire encore. Après un poil de trifouillage il semblerait que ça soit le clonage de grandalf qui foire...probablement à cause du .hgsub du répertoire smiasm qui pointe (à tort?) vers [git]https://github.com/bdcht/grandalf ...Bon on clone grandalf à la main git clone git://github.com/bdcht/grandalf.git, et également miasm parceque "chezmoiçaapasmarché"(c) hg clone https://code.google.com/p/miasm/ miasm -v --traceback ainsi que le README.txt qui est à la racine du repository smiasm et, plus important : pyMakefile et Makefile. Pfiou, tout ça ! Maintenant on revient sur le chemin tracé par le site officiel : on tape donc make && make install dans le répertoire de smiasm..victoire :) !!!

On teste si tout marche bien cd miasm/example/ && python disas_and_graph.py /bin/ls ...FAIL NameError: global name 'route_with_nurbs' is not defined

Bon, on re-trifouille et je vous fait grace des détails. Au final la méthode que j'ai employé (et qui marche sur gentoo et ubuntu 10.4 une fois les dépendances de chaque distro réglées) c'est :

  1. D'abord on se débarasse du problème de TCC en suivant à la lettre les instruction du site officiel smiasm : clone git://repo.or.cz/tinycc.git, ensuite on rajoute "-fPIC" dans les CFLAGS du fichier Makefile (CFLAGS+=-g -Wall -fPIC) puis on compile/installe : ./configure && make && make install
  2. Maintenant on attaque smiasm à proprement parler : On clone une première fois smiams : hg clone http://code.google.com/p/smiasm/, ça se termine avec un message d'erreur mais "pas grave". On télécharge ensuite à la main les fichiers Makefile et pyMakefile depuis l'accès HTTP au repository (http://code.google.com/p/smiasm/source/browse/)
  3. On clone à la main grandalf parce que le .hgsub de smiasm utilise une notation exotique qui n'est comprise ni par le mercurial gentoo par défaut ni par le mercurial ubuntu 10.4 par défaut : cd smiasm && rm -Rf grandalf && git clone git://github.com/bdcht/grandalf.git grandalf
  4. On fait un rollback de version de grandalf puisque les versions commitées depuis juillet dernier ne semblent plus compatibles avec miasm (disparition de la fonction route_with_nurbs) : git checkout a851b359185132645d9dce3d11037f3263604358
  5. Il ne reste plus qu'à compiler et installer smiasm :) ! cd .. && make && make install

A présent on peut tester le tout cd miasm/example/ && python disas_and_graph.py /bin/ls. Victoire :

miasm - test script

Il ne nous reste plus qu'à dévorer la documentation pointée par Sid2 et à nous les joies du bas niveau avec encore plus de facilité ! A bientôt donc pour de nouveaux billets passionants (en tout cas j'espère qu'ils réussiront au moins à me passioner lors de leur rédaction lol) !


ipv le 2011/08/30 15:25

Pour l'install auto sur debian/ubuntu :
http://www.ring0.me/scripts/miasm_i...
;)

Ozwald le 2011/08/30 22:43

J'avais déjà vu le script mais je ne dois pas avoir de bol parce, "chezmoiçamarchaitpas"(c) malheureusement :-(

Ceci dit, encouragé par l'intéret porté à mon mini retour d'expérience ^^, je viens de refaire quelques bidouilles et finalement le clonage du git grandalf fonctionne sur la gentoo à condition de rajouter le flag "gnutls" à mon package curl (j'étais encore en "ssl" simple, oui j'ai honte :-/)

Ce qui m'inquiète un poil c'est que le clonage de grandalf me descend une version où "route_with_nurbs" n'existe pas dans "grandalf/routing.py" donc je me dis que, probablement, le problème de version de grandalf se pose toujours et que le script "example/disas_and_graph.py" ne marchera toujours pas (ce qui ne semble pas adressé par le script. Je suis le seul à avoir ce problème de "route_with_nurbs" ?)

...Bref assez de digression Gentoo, revenons aux debian-like : je viens de revérifier sur internet (n'ayant pas accès à mon ubuntu en ce moment pour vérifier sur pièce) et la version de git qui vient avec lucid (10.04, la dernière LTS) c'est la 1.4.3-1, donc on a probablement trouvé d'où venait mon problème de fetch puisqu'il faut un git plus récent que 1.5.6-4 :-/ En résumé : pour ubuntu il faut donc au moins être en maverick (10.10) pour que le clonage git (et donc le script) fonctionne puisque Maverick propose la version 1.6.3-1.

Seule question qui reste en suspens : quid de la version de grandalf clonée et de la disparition de la fonction "route_with_nurbs" dans grandalf/routing.py qui semble pourtant être utilisée par miasm ?

serpi le 2011/08/31 18:30

Yop

oué le capitaine igloo qui maintient Grandalf avait une merde sur un patch, c'est pour ca que le meta repo SMIASM avait un pointeur grandalf sur l'avant dernier patch, qui du coup, n'est pas appliqué quand on clone a la main. Tout devrait rentrer dans l'ordre (ainsi que le .git) sous peu. (ou pas, bien évidement)

ps:chémoicamarche
pps: fais gaffe, tu disasm un binaire /bin/ls ELF64 en utilisant le moteur de disasm 32 bit, d'ou un code étrange.
ppps: je réponds a la future question: non le moteur 64 bit de disasm est pas fini

The Rasta Gods are pleased for your sacrifice.

  1. Ce qui peut prendre pas mal de temps si jamais vous devez recompiler qt-core :( ...
  2. Merci d'ailleurs, sans ce blog post je ne l'aurai jamais trouvé lol