La plate-forme d'analyse binaire de l'Université Carnegie Mellon (CMU BAP) est une suite de services publics et de bibliothèques qui permettent l'analyse des programmes binaires. BAP prend en charge x86, x86-64, ARM, MIPS, PowerPC et de nouvelles architectures peuvent être ajoutées à l'aide de plugins. BAP comprend diverses analyses, un interprète standard, un interprète MicroExécution et un exécuteur symbolique. BAP présente son propre langage spécifique au domaine, Primus Lisp, qui est utilisé pour implémenter des analyses, spécifier les conditions de vérification, les fonctions de modélisation (talons d'écriture) et même l'interfaçage avec le solveur SMT. Le référentiel de la boîte à outils comprend divers exemples d'outils d'analyse de programme qui pourraient être mis en œuvre avec BAP et peuvent être utilisés comme point de départ (en plus du tutoriel) pour implémenter des analyses personnalisées. BAP peut être utilisé comme cadre avec une seule utilité BAP qui est étendue avec des plugins ou peut être utilisée comme bibliothèque intégrée dans une application utilisateur, qui pourrait être écrite dans OCAML ou, dans n'importe quelle autre langue, en utilisant C Bindings. Nous fournissons également un support minimal à Python pour faciliter le début de l'apprentissage du BAP.
BAP a été développé dans CMU, Cylab et est parrainé par des subventions du Département des États-Unis de la Défense, Siemens, Boeing, ForallSure et le gouvernement de Corée, voir Sponsors pour plus d'informations. BAP est utilisé dans diverses institutions et sert de squelette pour de nombreux projets intéressants, certains sont mis en évidence ci-dessous:
Nous fournissons des forfaits binaires emballés pour les dérivés Debian et Red Hat. Pour d'autres distributions, nous fournissons des archives TGZ. Pour installer BAP sur un dérivé Debian:
wget https://github.com/BinaryAnalysisPlatform/bap/releases/download/v2.5.0/{bap,libbap,libbap-dev}_2.5.0.deb
sudo dpkg -i {bap,libbap,libbap-dev}_2.5.0.debNos forfaits binaires n'incluent pas l'environnement de développement OCAML. Si vous allez rédiger une analyse dans OCAML, vous devez installer BAP à partir du code source en utilisant OPAM ou en clonage et en construisant directement ce référentiel. La méthode OPAM est celle recommandée. Une fois installé, les trois commandes suivantes doivent installer la plate-forme dans un commutateur nouvellement créé.
opam init --comp=4.14.1 # inits opam and install the OCaml compiler
opam install bap # installs bap and its dependencies
eval $( opam env ) ` # activates opam environmentOu, si vous avez déjà un interrupteur où vous souhaitez installer BAP, alors faites simplement
opam install bap
La commande opam install bap essaiera également d'installer les dépendances système de BAP à l'aide de votre gestionnaire de package du système d'exploitation. S'il échoue en raison d'une dépendance du système manquante, essayez de l'installer manuellement, puis répétez la commande opam install bap . Si cela ne fonctionne toujours pas, n'hésitez pas à passer par notre chat et à demander de l'aide là-bas. Il est habité avec des gens sympathiques qui seront heureux d'aider.
L'instruction ci-dessus vous permettra de la dernière version stable de BAP. Si vous êtes intéressé par nos versions de roulement, qui sont automatiquement mises à jour chaque fois qu'un engagement dans la branche maître se produit, vous pouvez créer un nouveau commutateur qui utilise notre référentiel de test
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap Une fois qu'il a été ajouté, le référentiel bap aura la priorité sur le référentiel stable et vous obtiendrez les forfaits BAP fraîchement choisis directement dans la ferme.
Si vous souhaitez construire BAP manuellement ou si vous souhaitez simplement vous attaquer avec les internes BAP, vous pouvez cloner ce référentiel et le construire manuellement. Nous vous suggérons de commencer par un environnement frais sans être installé par BAP, pour éviter les affrontements, ou même mieux utiliser un commutateur local, par exemple,
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installL'extrait ci-dessus s'accompagnera de BAP, créera un nouveau commutateur local, installe les dépendances nécessaires, y compris celle du système et, enfin, construire et installer BAP avec Dune. Alternativement, si vous avez déjà un interrupteur où vous souhaitez construire et installer BAP, vous pouvez utiliser
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
Pour installer BAP et ses dépendances dans le commutateur actuellement sélectionné.
BAP, comme Docker ou Git, est entraîné par un seul utilitaire de ligne de commande appelée BAP. Tapez simplement bap dans votre shell et il imprimera un message qui affiche les capacités BAP. La commande disassemble prendra un programme binaire, le démontrera, le soulèvera dans la représentation agnostique de l'architecture intermédiaire, construisait un graphique de flux de contrôle et appliquez enfin une analyse définie par l'utilisateur sous forme de passes de démontage. Enfin, l'option --dump ( -d en bref) sortira le programme résultant au format spécifié. Il s'agit de la commande par défaut, vous n'avez donc même pas besoin de le spécifier, par exemple, ce qui suit sera démonté et vider le binaire /bin/echo sur votre machine:
bap /bin/echo -d Remarque, contrairement à objdump , cette commande créera le graphique de flux de contrôle d'un programme. Si vous souhaitez simplement vider chaque instruction d'un binaire après l'autre (le mode de désassembleur de balayage linéaire), vous pouvez utiliser la commande objdump , par exemple,
bap objdump /bin/echo --show-{insn=asm,bil} Si votre entrée est une goutte de code machine, pas un exécutable, vous pouvez utiliser le chargeur raw , par exemple,
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} Le chargeur brut prend quelques paramètres, comme les décalages, les longueurs et les adresses de base, ce qui en fait un couteau suisse que vous pouvez utiliser comme ouvre-boîte pour les formats qui ne sont pas connus pour BAP. Le chargeur brut fonctionne pour toutes les commandes qui ouvrent les fichiers, par exemple, si le chargeur raw est utilisé avec la commande disassemble , BAP identifiera automatiquement les démarrages de la fonction et créera un CFG approprié sans même savoir où le code se trouve dans le binaire,
bap /bin/echo --loader=raw --raw-base=0x400000 -d Si vous souhaitez jouer manuellement avec des octets, par exemple, tapez les instructions encodant manuellement et voyez comment BAP le démonte et quelle sémantique il a, alors mc est la commande que vous recherchez. Il est nommé pour l'utilitaire correspondant dans LLVM et signifie code machine et a la même interface que la commande objdump , sauf qu'il prend un codage ASCII d'instructions au lieu d'un fichier binaire, par exemple,
bap mc --show-{insn=asm,bil} -- 48 83 ec 08ou
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Il reconnaît quelques formats d'entrée (y compris llvm-mc utilise pour son option -show-encoding ). Consultez la documentation pour des informations plus détaillées.
BAP est un framework basé sur un plugin et si vous souhaitez développer une nouvelle analyse, vous pouvez écrire un plugin, le construire, installer et cela fonctionnera avec le reste du BAP sans aucune recompilation. Il existe de nombreux points d'extension que vous pourriez utiliser pour ajouter une nouvelle analyse, modifier l'existence ou même créer vos propres applications. Nous allons commencer par un exemple simple, qui enregistre une passe de désassemblage à la commande Disassemble. Supposons que nous voulons rédiger une analyse qui estime le rapport des instructions de saut au nombre total d'instructions dans le binaire. Nous commencerons par créer un fichier vide nommé jmp.ml dans un dossier vide (le nom du dossier n'a pas d'importance). Ensuite, en utilisant notre éditeur de texte préféré, nous y mettrons le code suivant:
open Core_kernel
open Bap_main
open Bap.Std
let counter = object
inherit [ int * int ] Term. visitor
method ! enter_term _ _ (jmps,total) = jmps,total + 1
method ! enter_jmp _ (jmps,total) = jmps + 1 ,total
end
let main proj =
let jmps,total = counter#run ( Project. program proj) ( 0 , 0 ) in
printf " ratio = %d/%d = %g n " jmps total ( float jmps /. float total)
let () = Extension. declare @@ fun _ctxt ->
Project. register_pass' main;
Ok ()Maintenant, nous pouvons créer, installer et exécuter notre analyse en utilisant les commandes suivantes:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Passons brièvement par le code. Le counter est un visiteur qui a l'état composé d'une paire de compteurs. Le premier compteur garde une trace du nombre de termes JMP, et le deuxième compteur est incrémenté chaque fois que nous entrons dans n'importe quel terme. La fonction main exécute simplement le compteur et imprime la sortie. Nous déclarons que notre extension utilise la fonction Extension.Declare de la bibliothèque BAP_MAIN. Une extension n'est qu'une fonction qui reçoit le contexte (qui pourrait être utilisé pour obtenir des paramètres de configuration). Dans cette fonction, nous enregistrons notre fonction main comme un laissez-passer en utilisant la fonction Project.register_pass .
Un peu plus de complexe, ainsi qu'un exemple qui utilise Python, peut être trouvé dans notre tutoriel.
Vous pouvez également construire et installer des plugins BAP à l'aide de Dune. Pour cela, vous devez définir une bibliothèque et utiliser la strophe plugin qui utilise cette bibliothèque. Vous trouverez ci-dessous le fichier dune de modèle,
(library
(name FOO)
(public_name OUR-FOO.plugin)
(libraries bap bap-main))
(plugin
(name FOO)
(package OUR-FOO)
(libraries OUR-FOO.plugin)
(site (bap-common plugins)))
Le fait que la chose qui est capitalisé dans l'extrait ci-dessus est un espace réservé que vous substituez par des noms privés et publics appropriés pour votre plugin. Notez que l'extension .plugin n'est pas nécessaire, mais est perçue comme une bonne convention.
BAP expédie également un baptop d'interactif Toplevel Utility. Il s'agit d'une utilité en forme de coquille qui évalue de manière interactive les expressions OCAML et imprime leurs valeurs. Il chargera les bibliothèques BAP et initialisera tous les plugins pour vous, afin que vous puissiez explorer de manière interactive le vaste monde de BAP. L'utilitaire baptop peut également servir d'interprète non interactif, afin que vous puissiez exécuter vos scripts OCAML, par exemple, baptop myscript.ml ou vous pouvez même le spécifier en utilisant Sha-bang en haut de votre fichier, par exemple, #!/usr/bin/env baptop . Nous avons ocaml baptop à ocaml aide bap.top une utop
#use " topfind " ;;
#require " bap.top " ;;Nous comprenons que BAP est énorme et qu'il est facile de se perdre. Nous travaillons constamment sur l'amélioration de la documentation en garantissant que chaque fonction dans l'API BAP est entièrement documentée. Mais rédiger des directives de niveau supérieur sous forme de manuels ou de tutoriels est beaucoup plus difficile et très longue, en particulier compte tenu de la différence des objectifs de nos collègues chercheurs et utilisateurs. Par conséquent, nous employons une approche à dénigrer et préférons répondre à de vraies questions plutôt que d'essayer prématurément de répondre à toutes les questions possibles. Nous serons heureux de vous voir dans votre chat qui présente des fonctionnalités consultables, indexées par Google, Archive.
Nous écrivons, à l'occasion, à notre blog et à notre wiki et encourageons tout le monde à contribuer à les deux. Vous pouvez également poster vos questions sur StackOverflow ou discuter de BAP sur la carte OCAML. Nous avons également un joli canal Discord, qui a beaucoup moins de trafic que notre gitter.
BAP est construit par la communauté et nous sommes les bienvenus toutes les contributions d'auteurs qui sont disposées à les partager sous la licence du MIT. Si vous ne pensez pas que votre analyse ou votre outil convient à ce référentiel (par exemple, il a une utilisation limitée, pas entièrement prêt, ne répond pas à nos normes, etc.), vous pouvez envisager de contribuer à notre référentiel BAP-Plugins qui est une collection de plugins BAP utiles qui ne sont pas assez matures pour être inclus dans la distribution principale. Alternativement, vous pouvez envisager d'étendre notre boîte à outils avec votre outil.
Bien sûr, il n'est pas nécessaire de soumettre votre travail à l'un de nos référentiels. BAP est un cadre basé sur des plugins et votre code pourrait être hébergé n'importe où et avoir n'importe quelle licence (y compris propriétaire). Si vous souhaitez mettre votre travail à la disposition de la communauté, ce serait une bonne idée de le publier via OPAM.
Pour la sécurité
Boeing
Projet de vétérinaire DARPA
Siemens AG
Grant Institute for Information & Communications Technology Promotion (IITP) financé par le gouvernement de la Corée (MSIT) (n ° 2015-0-00565, Développement des technologies de découverte de vulnérabilité pour la sécurité des logiciels IoT)
S'il vous plaît, contactez-nous si vous souhaitez devenir sponsor ou cherchez une collaboration plus profonde.