SSTIC 2017 – Désobfuscation binaire : Reconstruction de fonctions virtualisées

Kevin Boulom Conférences, Etude - Recherche

Le SSTIC

Le SSTIC (Symposium sur la sécurité des technologies de l’information et des communications)  est une conférence Française qui s’est déroulée du 7 au 9 juin 2017 dans la ville de Rennes pour sa 15e édition.

Des consultants de Devoteam y ont participé et ont souhaité partager des résumés sur les sujets suivants :

  • WSUS pendu – Romain Coltel & Yves Le Provost
  • Désobfuscation binaire : Reconstruction de fonctions virtualisées – Jonathan Salwan, Marie-Laure Potet & Sébastien Bardin
  • CrashOS : Recherche de vulnérabilités système dans les hyperviseurs – Anaïs Gantet
  • Binacle : indexation « full-bin » de fichiers binaires – Guillaume Jeanne

Désobfuscation binaire : Reconstruction de fonctions virtualisées

Speaker :

Jonathan Salwan

https://www.sstic.org/2017/presentation/desobfuscation_binaire_reconstruction_de_fonctions_virtualisees/

Ce talk abordait les problématiques d’obfuscation de binaire par Machine Virtuel embarquée dans le binaire. Cette technique permet de rendre très difficile le reverse engineering du binaire, car le byte code original est transformé vers un nouveau jeu d’instruction (ISA – Instruction Set Architecture) propriétaire et peut être utilisé pour l’élaboration de malwares sophistiqués.

La méthode d’analyse normale de ce genre de binaire obfusqué est le reverse engineering de la machine virtuel, afin d’en comprendre le fonctionnement et ainsi d’extraire le byte code classique à partir du byte code propriétaire.

Cette méthode est longue et fastidieuse, comme on peut l’imaginer.

Le conférencier propose une approche en partant du postulat suivant :

Quoi qu’il arrive, la machine virtuelle devra exécuter l’instruction sur le CPU host correspondant à la sémantique de l’opcode à simuler

Ainsi, le conférencier nous propose une analyse du binaire par teinte, puis une simplification par représentation symbolique dans le but d’éliminer le code appartenant à la machine virtuelle. In Fine cette approche permet d’obtenir un byte code similaires à celui d’origine en s’affranchissant de la fastidieuse rétro ingénierie de la machine virtuelle.

L’approche s’effectuera en 4 étapes :

  1. Analyse par teinte
  2. Représentation symbolique
  3. Couverture de code
  4. Reconstruction binaire

Analyse par teinte :

Cette première étape permet de teinter l’argument d’une des fonctions émulées en VM.

Elle permet de déterminer un premier chemin d’exécution, et ainsi de comprendre les différentes fonctions des Handler.

Cependant, le code qui en est extrait ne pourra pas être compilé. En effet, il manquera l’état initial défini par la VM, mais aussi l’état avant chaque Handler.

Représentions symbolique :

Afin de donner du sens à ce code, il sera primordial d’effectuer du DSE (Dynamic Symbolic execution) sur les instructions teintées. Cette DSE permettra d’obtenir les expressions sémantiques correspondant à l’évolution de l’argument tout au long de l’exécution.

L’outil choisi par l’orateur permettant d’effectuer ce DSE est Triton, un Framework d’analyse binaire présenté au SSTIC 2015.

A partir de cette étape, nous ne travaillons plus sur de l’assembleur, mais sur un IR (Intermediate Representation), sous forme de pseudo code et d’arbre d’expression.

Nous n’avons donc plus une trace instructions, mais une trace d’expressions.

Comme les arguments ont été teintés en amont, la trace d’expressions contient également la teinte. Il est alors aisé de simplifier le modèle en simplifiant les groupes de nœuds où ne passe pas la teinte.

A cette étape, tout le processus de la machine virtuelle à été éliminé.

Couverture de code :

A ce stade, seul un chemin à été parcouru. Il faudra réitérer l’opération pour découvrir tous les chemins à l’aide d’un SMT Solver (satisfiability modulo theories) sur les contraintes de branchement.

A l’issue de cette phase, il nous reste l’IR Triton du code désobfusqué.

Reconstruction binaire :

Pour reconstruire le binaire à l’aide de LLVM, il faudra au préalable convertir l’IR Triton en IR LLVM. Pour ce faire, le conférencier à utiliser l’outil Arybo, qui permet d’effectuer cette traduction. Le conférencier incite également la communauté à définir un formalisme d’IR, afin que la compatibilité entre les différents outils soit simplifiée.

Afin de reconstruire le binaire, l’orateur a utilisé l’outil LLVM avec l’option –O2. En sortie de cet outil, nous aurons le binaire compilé désobfusqué.