Question:
Soulever les binaires de n'importe quel arc dans un langage intermédiaire pour l'analyse statique
frogatto
2016-04-17 12:16:31 UTC
view on stackexchange narkive permalink

Background

Comme le titre est explicite, je voudrais traduire les binaires de toute architecture (par exemple x86, ARM, ARM Thumb) vers un langage intermédiaire afin d'appliquer une analyse statique indépendante de l'archive .

Pour être exact, mon travail se limite aux objets partagés fournis dans les fichiers APK pour la plate-forme Android. Mes exigences de base, auxquelles je m'attendrais à ce que l'IL satisfasse, sont les suivantes (en fait, mon objectif est d'extraire des flux d'informations à partir d'un fichier .so donné fourni dans un fichier APK).

  • Tranchage binaire
  • PDG (CFG / DFG)
  • Bien soutenu par son responsable ou sa communauté

À cette fin J'ai examiné certains des outils existants répertoriés ci-dessous, mais je ne sais malheureusement pas si je peux les utiliser pour révéler des flux d'informations ou non.

  • OpenREIL: L'objectif de ce projet est de transformer les binaires dépendants de l'arc en REIL.
  • Projet Barf: un cadre d'analyse binaire et de rétroingénierie open source multiplateforme
  • Capstone: Un framework de désassemblage.
  • Epic: Cet outil traduit les binaires de any-arch en bitcode LLVM indépendant de l'arch. (Ce projet n'est pas public, donc je ne peux pas l'utiliser.)

Question

Y a-t-il un IL que j'utilise pour analyser statiquement un .so (dans une archive APK) pour extraire les flux d'informations? Fondamentalement, je veux qu'il fournisse des exigences de base telles que le découpage et PDG.

Les résultats ici peuvent être utiles: https://www.google.com/webhp?q="static"+"binary+rewriting"+OR+"binary+transformation"+OR+"binary+translation"+"intermediate"+OR+ "abstrait + représentation"
Vous pouvez également essayer https://github.com/zaddach/libqemu, bien que ce soit à un stade précoce.
Bien que ce ne soit pas arbitraire, bap semble soutenir le levage du bras et x86 en bil.
Cinq réponses:
Jeff
2016-06-16 05:55:19 UTC
view on stackexchange narkive permalink

Radare2 est peut-être ce que vous recherchez:

https://github.com/radare/radare2

Ils élèvent tout à un niveau intermédiaire langage appelé ESIL afin qu'il puisse être émulé facilement. Ce code peut être accédé, analysé et piloté par programme via leurs bibliothèques ou via des liaisons en C, Python, etc. Ils ont bien plus d'architectures et de formats de fichiers que vous n'en mentionnez. Vous pourrez peut-être faire tout ce dont vous avez besoin avec cela.

joxeankoret
2016-08-17 18:12:33 UTC
view on stackexchange narkive permalink

Ma recommandation est d'utiliser libVEX, car c'est la bibliothèque de code intermédiaire la plus robuste que je connaisse. Il fait partie de Valgrind et prend en charge de nombreuses architectures. Vous pouvez soit utiliser libVEX dans un programme C / C ++, soit utiliser les liaisons Python appelées PyVex.

Dans tous les cas: considérez que la plupart des choses que vous voulez faire doit être mis en œuvre à partir de zéro. Tout sauf la traduction des «dialectes» d'assemblage en une représentation intermédiaire, je dirais. Ou peut-être pouvez-vous utiliser certaines parties du Projet Angr. Je ne l'ai pas testé moi-même.

Bonne chance!

VEX gère-t-il maintenant les calculs d'indicateur? Ils omettent les informations sémantiques, ce qui les rend irréalisables pour certains cas d'utilisation de l'analyse statique
Oui, il effectue des calculs d'indicateur et appelle des fonctions de vérification internes pour déterminer si, selon les indicateurs traduits, le saut doit être effectué ou non.
Malheureusement, vex ne peut toujours pas exprimer tous les calculs d'indicateur dans sa propre syntaxe, encore des fonctions d'assistance paresseuses. : / Vous n'obtiendrez pas d'informations sémantiques à moins que vous ne les analysiez tous vous-même.
Ah, oui, c'est vrai. Cependant, je ne comprends pas pourquoi cela peut causer de gros problèmes. Pourriez-vous s'il vous plaît me donner un exemple où les drapeaux calculés VEX + les calculs manuels peuvent être problématiques? Ou est-ce juste que c'est ennuyeux parce qu'il faut réinventer la roue?
Il s'agit plutôt de réinventer la roue. VEX résout en interne ses fonctions d'assistance. La plupart des projets utilisant ces informations (comme angr) finissent par ré-implémenter toutes les fonctions d'assistance.
ivg
2016-09-27 17:12:16 UTC
view on stackexchange narkive permalink

Je souhaite ajouter BAP à votre liste. Avertissement, je suis l'un des auteurs. Nous venons de publier la version 1.0.0. Il s'agit de notre dixième version publique (après une dizaine d'années de développement en interne). Bien que notre public cible soit composé de chercheurs professionnels et d'agences gouvernementales, nous avons toujours une communauté plutôt décente de chercheurs indépendants. Nous sommes également très réactifs sur un canal gitter et notre suivi des problèmes.

Notre représentation intermédiaire a une sémantique formellement spécifiée, et nos élévateurs sont intensivement vérifiés avec notre cadre de vérification. À ce jour, nos élévateurs prennent en charge de nombreuses architectures - x86, x86-64, mips32, mips64, powerpc32, powerpc64 et armv7.

Il serait injuste de ne pas mentionner d'autres bibliothèques, au moins Radare2 et Angr.

La représentation intermédiaire de Radare2 s'appelle ESIL. Il n'est pas lisible par l'homme (à moins que vous ne soyez un programmeur Forth), mais on le pense efficace. Ils prennent en charge au moins 5 architectures (ARM, x86, GameBoy et 8051).

Angr utilise la bibliothèque VEX (qui est GPL) pour le lifter, donc ils ont un support prêt à l'emploi pour 5 architectures (x86, arm, mips, ppc, s390). Le langage VEX est également illisible (bien qu'il soit toujours meilleur que ESIL) et perd une certaine précision. Nous avons utilisé VEX dans les incarnations précédentes de BAP, mais nous nous sommes éloignés de nos propres haltérophiles il y a de nombreuses années.

Nordwald
2016-09-28 12:26:43 UTC
view on stackexchange narkive permalink

J'ai passé en revue environ 14 représentations intermédiaires pour le projet sur lequel je travaille. Il semble que n'importe quel auteur (même pour les doctorants et les thèses de master) ait trouvé tous les autres IR existants manquants et a inventé le leur.

Il y a deux exceptions notables:

VEX est une approche préhistorique des IR et fournit un backend stable. Cela étant dit, il utilise des fonctions d'aide pour des choses comme les calculs d'indicateurs et peut ainsi omettre des informations sémantiques.

REIL est bien conçu pour l'analyse statique, mais il est fragmenté depuis grand G acheté zynamícs. Certains projets communautaires maintiennent le concept en vie, mais introduisent leurs propres extensions à REIL.

Comme l'analyse statique nécessite un SMT pour la plupart de ses tâches lourdes, nous avons eu recours à la conversion des IR en formules logiques et les avons utilisées comme une sorte de représentation intermédiaire.

Par exemple:

  pop eax  

est égal à:

esp = esp -4

[esp - 4] = eax

Hé Nordwald, puis-je vous demander si vous avez finalement employé REIL? Si tel est le cas, combien d'efforts supplémentaires doivent être effectués pour que cela fonctionne pour une exécution symbolique (puisque vous avez mentionné le solveur SMT)? Merci!
Une gamme d'implémentations REIL comme BARF contient déjà une traduction vers le solveur d'instructions. Jetez un œil aux exemples ici: https://github.com/programa-stic/barf-project/tree/master/examples/scripts/x86
C'est génial! Merci beaucoup pour la ressource.
BTW: puis-je demander quel "frontal" vous recommandez d'utiliser? J'ai le plus récent IDA-Pro + Binnavi ...
Hé, nous utilisons ici des solutions internes, car un cfg approprié est crucial pour l'analyse des flux de données, mais vous pouvez utiliser IDA. Je recommande d'éviter les gros travaux (par exemple, créer un plugin d'exportation).
Eric Hoang
2016-04-18 12:17:47 UTC
view on stackexchange narkive permalink

J'ai des recherches connexes sur il y a quelques mois. Je ne connais pas assez d'outil pour toutes vos exigences. Cependant, je pense que vous pouvez suivre Jakstab. Il prend en charge l'analyse des fichiers ELF Linux et génère un graphique de flux de contrôle. En général, vous devez modifier Jakstab pour vos recherches.



Ce Q&R a été automatiquement traduit de la langue anglaise.Le contenu original est disponible sur stackexchange, que nous remercions pour la licence cc by-sa 3.0 sous laquelle il est distribué.
Loading...