Die Binäranalyse -Plattform der Carnegie Mellon University (CMU BAP) ist eine Reihe von Versorgungsunternehmen und Bibliotheken, die eine Analyse von Binärprogrammen ermöglicht. BAP unterstützt X86, X86-64, Arm, MIPS, PowerPC und neue Architekturen können mit Plugins hinzugefügt werden. BAP umfasst verschiedene Analysen, Standard -Dolmetscher, Microexecution Interpreter und einen symbolischen Vollstrecker. BAP verfügt über eine eigene domänenspezifische Sprache, Primus LISP, die zur Implementierung von Analysen, zur Angabe von Verifizierungsbedingungen, Modellierungsfunktionen (Schreibstubs) und sogar der Schnittstelle mit dem SMT-Solver verwendet wird. Das Toolkit -Repository enthält verschiedene Beispiele für Programmanalyse -Tools, die mit BAP implementiert werden können und können als Ausgangspunkt (zusätzlich zum Tutorial) für die Implementierung benutzerdefinierter Analysen verwendet werden. BAP kann als Framework mit einem einzigen BAP -Dienstprogramm verwendet werden, das mit Plugins erweitert wird oder als Bibliothek in einer Benutzeranwendung eingebettet wird, die in OCAML oder in jeder anderen Sprache unter Verwendung von C -Bindungen geschrieben werden kann. Wir bieten Python auch eine minimale Unterstützung, um das Lernen von BAP einfacher zu erleichtern.
BAP wurde in CMU, Zylaber, entwickelt und wird durch Zuschüsse des US -Verteidigungsministeriums, Siemens, Boeing, ForallSecure und der koreanischen Regierung gesponsert, siehe Sponsoren für weitere Informationen. BAP wird in verschiedenen Institutionen verwendet und dient als Rückgrat für viele interessante Projekte. Einige werden unten hervorgehoben:
Wir bieten Binärpakete für Debian- und Red Hat Derivate an. Für andere Verteilungen bieten wir TGZ -Archive an. So installieren Sie BAP auf einem Debian -Derivat:
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.debUnsere Binärpakete enthalten nicht die OCAML -Entwicklungsumgebung. Wenn Sie eine Analyse in OCAML schreiben möchten, müssen Sie BAP aus dem Quellcode entweder OPAM oder durch Klonen und Erstellen dieses Repositorys installieren. Die OPAM -Methode ist die empfohlene. Sobald es installiert ist, sollten die folgenden drei Befehle die Plattform in einem neu erstellten Switch installieren.
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 environmentOder wenn Sie bereits einen Schalter haben, an dem Sie BAP installieren möchten, dann tun Sie es einfach
opam install bap
Mit dem Befehl opam install bap versucht auch die Systemabhängigkeiten von BAP mithilfe Ihres Betriebssystempaket -Paket -Managers zu installieren. Wenn es aufgrund einer fehlenden Systemabhängigkeit fehlschlägt, installieren Sie sie manuell und wiederholen Sie dann den Befehl opam install bap . Wenn es immer noch nicht funktioniert, zögern Sie nicht, an unserem Chat vorbeizuschauen und dort Hilfe zu suchen. Es ist besetzt mit freundlichen Menschen, die gerne helfen.
In der obigen Anweisung erhalten Sie die neueste stabile Veröffentlichung von BAP. Wenn Sie an unseren Rolling -Veröffentlichungen interessiert sind, die jedes Mal automatisch aktualisiert werden, wenn ein Verpflichtung zum Master -Zweig stattfindet, können Sie einen neuen Switch erstellen, der unser Test -Repository verwendet
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap Nachdem es hinzugefügt wurde, hat das bap -Repository Vorrang vor dem stabilen Repository und Sie erhalten die frisch ausgewählten BAP -Pakete direkt von der Farm.
Wenn Sie ein BAP manuell bauen möchten oder nur mit BAP -Interna angehen möchten, können Sie dieses Repository klonen und manuell erstellen. Wir empfehlen, dass Sie mit einer frischen Umgebung beginnen, ohne dass BAP installiert wird, um Zusammenstöße zu vermeiden, oder sogar besser einen lokalen Schalter, z. B., z.
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installDer obige Ausschnitt klon das BAP, erstellt einen frischen lokalen Schalter, installiert die erforderlichen Abhängigkeiten, einschließlich des Systems eins und schließlich mit Dune BAP aufbauen und installieren. Wenn Sie bereits einen Schalter haben, an dem Sie BAP erstellen und installieren möchten
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
So installieren Sie BAP und seine Abhängigkeiten in den aktuell ausgewählten Switch.
BAP wird wie Docker oder Git von einem einzigen Befehlszeilendienstprogramm namens BAP angetrieben. Geben Sie einfach bap in Ihre Shell ein und druckt eine Nachricht, die BAP -Funktionen anzeigt. Der Befehl disassemble nimmt ein binäres Programm auf, zerlegt es, hebt es in die Agnostikdarstellung der Zwischenarchitektur, erstellt einen Steuerflussdiagramm und wendet schließlich die veranstaltete benutzerdefinierte Analyse in Form von Disassembling-Pässen an. Schließlich gibt die Option --dump ( -d ) das resultierende Programm im angegebenen Format aus. Dies ist der Standardbefehl, sodass Sie ihn nicht einmal angeben müssen, z. B. folgendermaßen, z. B. das folgende Abbau und die /bin/echo -Binärin auf Ihrer Maschine:
bap /bin/echo -d Beachten Sie, dass dieser Befehl im Gegensatz zu objdump das Steuerflussdiagramm eines Programms erstellt. Wenn Sie nur jede Anweisung eines binären Binären nacheinander (dem sogenannten linearen Sweep-Disassembler-Modus) ablegen möchten, können Sie den Befehl objdump verwenden, z. B.
bap objdump /bin/echo --show-{insn=asm,bil} Wenn Ihre Eingabe ein Maschungscode -Blob und keine ausführbare Datei ist, können Sie den raw z. B. verwenden, z.
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} Der Rohloader nimmt einige Parameter wie Offsets, Längen und Grundadressen ein, was ihn zu einem Schweizer Knieh zu machen, das Sie als Opener für Formate verwenden können, die nicht bekannt sind. Der Rohloader funktioniert für alle Befehle, die Dateien öffnen, z. B. wenn der raw zusammen mit dem Befehl disassemble verwendet wird. BAP identifiziert weiterhin automatisch die Funktionsstarts und erstellt einen geeigneten CFG, ohne zu wissen, wo sich der Code im Binärer befindet.
bap /bin/echo --loader=raw --raw-base=0x400000 -d Wenn Sie manuell mit Bytes spielen möchten, z. B. die Anweisung manuell eingeben und sehen, wie BAP sie zerlegt und welche Semantik sie hat, dann ist mc der Befehl, den Sie suchen. Es ist nach dem entsprechenden Dienstprogramm in LLVM benannt und steht für den Maschinencode und hat dieselbe Schnittstelle wie der Befehl objdump
bap mc --show-{insn=asm,bil} -- 48 83 ec 08oder
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Es erkennt einige Eingangsformate (einschließlich llvm-mc verwendet für die Option für -show-encoding ). In der Dokumentation finden Sie detailliertere Informationen.
BAP ist ein Plugin-basiertes Framework. Wenn Sie eine neue Analyse entwickeln möchten, können Sie ein Plugin schreiben, erstellen, installieren und mit dem Rest des BAP ohne Neukompilation funktioniert. Es gibt viele Erweiterungspunkte, mit denen Sie neue Analysen hinzufügen, vorhanden sind oder sogar eigene Anwendungen erstellen können. Wir werden mit einem einfachen Beispiel beginnen, in dem ein Disassemling -Pass zum Disassemble -Befehl registriert wird. Nehmen wir an, wir möchten eine Analyse schreiben, in der das Verhältnis von Sprunganweisungen zu der Gesamtzahl der Anweisungen im Binary geschätzt wird. Wir werden zunächst eine leere Datei mit dem Namen jmp.ml in einem leeren Ordner erstellen (der Ordnerame spielt keine Rolle). Als nächstes geben wir mit unserem Lieblings -Texteditor den folgenden Code ein:
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 ()Jetzt können wir unsere Analyse mit den folgenden Befehlen erstellen, installieren und ausführen:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Lassen Sie uns kurz den Code durchgehen. Das counter ist ein Besucher, der den Zustand aus einem Paar Zähler hat. Der erste Zähler verfolgt die Anzahl der JMP -Begriffe, und der zweite Zähler wird jedes Mal erhöht, wenn wir eine Begriff eingeben. Die main führt nur den Zähler aus und druckt die Ausgabe. Wir deklarieren unsere Erweiterung Verwenden Sie die Erweiterung. Declare -Funktion aus der BAP_MAIN -Bibliothek. Eine Erweiterung ist nur eine Funktion, die den Kontext empfängt (mit dem Konfigurationsparameter erhalten werden können). In dieser Funktion registrieren wir unsere main als Pass mit der Funktion Project.register_pass .
Ein bisschen komplexeres Beispiel sowie ein Beispiel, das Python verwendet, finden Sie in unserem Tutorial.
Sie können auch BAP -Plugins mit Dune erstellen und installieren. Dafür müssen Sie eine Bibliothek definieren und die plugin -Stanze verwenden, die diese Bibliothek verwendet. Unten finden Sie die dune -Datei,
(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)))
EveyThing, das in den oben genannten Snippet aktiviert ist, ist ein Platzhalter, den Sie durch entsprechende private und öffentliche Namen für Ihr Plugin ersetzen. Beachten Sie, dass die .plugin -Erweiterung nicht erforderlich ist, sondern als gute Konvention geforscht wird.
BAP versendet auch einen interaktiven Toplevel -Utility baptop . Dies ist ein Shell-ähnliches Dienstprogramm, das OCAML-Ausdrücke interaktiv bewertet und ihre Werte druckt. Es wird BAP -Bibliotheken geladen und alle Plugins für Sie initialisieren, sodass Sie interaktiv die riesige Welt des BAP erforschen können. Das baptop Dienstprogramm kann auch als nicht-interaktiver Interpreter dienen, sodass Sie Ihre OCAML-Skripte, z. B. baptop myscript.ml , ausführen oder sogar mit SHA-Bang oben in Ihrer Datei, z. #!/usr/bin/env baptop , angeben können. Wir haben baptop mit UTOP gebaut, aber Sie können problemlos andere OCAML -Toplevel verwenden, einschließlich ocaml selbst. Laden Sie einfach die bap.top -Bibliothek, z. B. für Vanilla ocaml Toplevel
#use " topfind " ;;
#require " bap.top " ;;Wir verstehen, dass BAP riesig ist und es leicht ist, sich zu verlieren. Wir arbeiten ständig an der Verbesserung der Dokumentation, um sicherzustellen, dass jede einzelne Funktion in der BAP -API gründlich dokumentiert wird. Das Schreiben von Richtlinien auf höherer Ebene in Form von Handbüchern oder Tutorials ist jedoch viel schwieriger und sehr zeitaufwändig, insbesondere angesichts der unterschiedlichen Ziele unserer Mitforscher und Benutzer. Daher verwenden wir einen Rückwärtskettenansatz und bevorzugen es, echte Fragen zu beantworten, anstatt vorzeitig zu versuchen, alle möglichen Fragen zu beantworten. Wir freuen uns, Sie in Ihrem Chat zu sehen, der von Google und Archive durchsuchbar ist.
Wir schreiben gelegentlich zu unserem Blog und Wiki und ermutigen alle, zu beiden beizutragen. Sie können Ihre Fragen auch auf Stackoverflow veröffentlichen oder BAP im OCAML -Board besprechen. Wir haben auch einen süßen Discord -Kanal, der viel weniger Verkehr als unser Gitter hat.
BAP wird von der Community gebaut und wir sind alle Beiträge von Autoren willkommen, die bereit sind, sie unter der MIT -Lizenz zu teilen. Wenn Sie nicht der Meinung sind, dass Ihre Analyse oder Ihr Tool zu diesem Repository geeignet sind (z. B. sie hat eine begrenzte Verwendung, nicht vollständig bereit, erfüllt unsere Standards nicht usw.), können Sie in Betracht ziehen, zu unserem BAP-Plugins-Repository beizutragen, das eine Sammlung nützlicher BAP-Plugins ist, die nicht ausgereift sind, um in die Hauptverteilung einbezogen zu werden. Alternativ können Sie in Betracht ziehen, unser Toolkit mit Ihrem Tool zu erweitern.
Natürlich müssen Ihre Arbeit keine unserer Repositorys vorlegen. BAP ist ein Plugin-basiertes Framework, und Ihr Code könnte überall gehostet werden und über eine Lizenz (einschließlich proprietär). Wenn Sie Ihre Arbeit der Community zur Verfügung stellen möchten, wäre es eine gute Idee, sie über OPAM zu veröffentlichen.
Forallsecure
Boeing
DARPA Vet Project
Siemens AG
Institut für Informations- und Kommunikationstechnologien Promotion (IITP) Grant Finanziert von der Korea Government (MSIT) (Nr. 2015-0-00565, Entwicklung von Sicherheitsentdeckungstechnologien für IoT-Software-Sicherheit)
Bitte kontaktieren Sie uns, wenn Sie Sponsor werden möchten oder eine tiefere Zusammenarbeit suchen.