SSTIC 2012 - Miasm un framework de reverse engineering
Miasm est basé sur elfesteem, sorte de scapy des PE qui permet de modifier des exe et de les rebuild en suite. L’auteur nous fait une démo de miasm avec un patching de la calculatrice Windows. Effectivement l’asm c’est un peu velu, ça pique aux yeux, alors c’est pour ça que miasm à été créé. L’idée c’est de s’abstraire de l’assembleur en travaillant sur un langage intermédiaire un poil plus haut niveau et bien plus compréhensible pour l’humain.
(Edit: les slides sont disponibles ici)
Le langage intermédiaire est formé de 8 mots qui permettent de définir des entiers, des symboles, des conditionnelles ternaires, déréférencement mémoire (pour prendre la valeur d’une case mémoire), l’addition, le slice…
Le slice est là pour découper les registres & cie 🙂 genre eax / ax / ah – al un peu comme un hamburger.
Et ensuite il suffit de définir chaque élèment de l’instruction set intel dans ce langage simple de 8 mots que tout le monde peut comprendre. Mais comme c’est un peu pourrav les bouquins intel, il faut valider tout ça. Donc pour ce faire ils ont mit au point un JiT pour générer le code en c et donc le code binaire pour émuler l’instruction choisie et on compare la trace de l’exec du binaire émulé avec la trace du code python. Donc si les résultats sont les mêmes c’est bon. En gros l’auteur nous raconte qu’il vient de recoder qemu. (NDLR: ça rigole dur dans la salle).
Il est donc possible de sandboxer des binaires windows sous linux et inversement pour effectuer de l’analyse de malware avec.
« Les mecs on croit qu’ils font des codes obfusqués mais en fait ils codent très salement ». A partir du langage intermédiaire il est possible de faire des réductions qui vont venir simplifier le code assembleur et donc ça fait moins de code à analyser et on peut partir plus tôt en vacances. Finalement c’est comme le principe de l’affichage de la TI 92 qui te simplifiait tes equations mathématiques à l’affichage.
Coté flots de données, on peut faire des trucs de fakir pour slicer du code, etc… (NDLR: en « français dans le texte »). L’execution symbolique c’est un truc de fainéant pour ceux qui veulent pas se faire chier a reverser les malwares (NDLR: rofl). Un cas concret de ça, c’est de faire du ROP. La lib c’est juste un gros bouquin dont vous êtes le heros, et vous voulez faire du RAP en utilisant rien que des bouts de phrases du bouquin pour faire votre chanson.
Et donc en utilisant le langage intermédiaire, on lui dit ce que l’on contrôle dans la machine. L’émulation de tous les octets de la librairie si tu trouves un cas ou les contraintes sont résolues dans l’équation (ça fait vachement mathématique dixit l’auteur), on affiche w00t et on a trouvé un flot d’exec qui permet d’avoir notre ROP.
Ensuite, reverse de flame avec miasm… à grand coup d’execution symbolique et de résolution de xrefs. On patche les chaines chiffrés avec les chaines déchiffrés, et avec elfesteem on re-génère un flame sans crypto.
L’auteur à refait fuzzgrind avec miasm grâce à l’execution symbolique. rien que ça… et vous êtes des fakirs niveau 8 de l’analyse de code….
La suite, c’est de debug la machine intermédiaire, des scripts « simples » de recherche de vuln (hauteur de stack etc…). Faire des algo de preuve de code avec de la notation abstraite (mais ça c’est pour les gars de microsoft).