Die Analyse von Binärcode ist eine entscheidende Aktivität in vielen Bereichen der Disziplinen für Computerwissenschaften und Software -Engineering, die von der Softwaresicherheit und der Programmanalyse bis hin zu Reverse Engineering reichen. Manuelle Binäranalyse ist eine schwierige und zeitaufwändige Aufgabe, und es gibt Softwaretools, mit denen menschliche Analysten automatisiert oder unterstützt werden sollen. Die meisten dieser Tools verfügen jedoch über mehrere technische und kommerzielle Beschränkungen, die den Zugang und die Verwendung durch einen großen Teil der akademischen und praktikeren Gemeinschaften einschränken. BARF ist ein Open -Source -Binäranalyse -Framework, das darauf abzielt, eine Vielzahl von Binärcode -Analyse -Aufgaben zu unterstützen, die in der Disziplin der Informationssicherheit üblich sind. Es handelt sich um eine skriptierbare Plattform, die das Anheben mehrerer Architekturen, eine binäre Übersetzung in eine Zwischendarstellung, ein erweiterbares Framework für Codeanalyse -Plugins und Interoperation mit externen Tools wie Debuggen, SMT -Solvers und Instrumenten -Tools unterstützt. Das Framework wurde hauptsächlich für die menschlich unterstützte Analyse entwickelt, kann jedoch vollständig automatisiert werden.
Das BARF -Projekt umfasst BARF sowie verwandte Tools und Pakete. Bisher besteht das Projekt aus den folgenden Elementen:
Weitere Informationen finden Sie unter:
Aktueller Status:
| Letzte Veröffentlichung | v0.6.0 |
|---|---|
| URL | https://github.com/programa-stic/barf-project/releases/tag/v0.6.0 |
| Protokoll ändern | https://github.com/programa-stic/barf-project/blob/v0.6.0/changelog.md |
Alle Pakete wurden auf Ubuntu 16.04 (x86_64) getestet.
Barf ist ein Python -Paket für binäre Analyse und Reverse Engineering. Es kann:
ELF , PE usw.).Es befindet sich derzeit in der Entwicklung .
BARF hängt von den folgenden SMT -Solvers ab:
Der folgende Befehl installiert BARF in Ihrem System:
$ sudo python setup.py installSie können es auch lokal installieren:
$ sudo python setup.py install --usersudo pip install pyasmjitsudo apt-get install graphvizDies ist ein sehr einfaches Beispiel, das zeigt, wie eine binäre Datei geöffnet und jede Anweisung mit seiner Übersetzung in die Zwischensprache ( Reil ) gedruckt wird.
from barf import BARF
# Open binary file.
barf = BARF ( "examples/misc/samples/bin/branch4.x86" )
# Print assembly instruction.
for addr , asm_instr , reil_instrs in barf . translate ():
print ( "{:#x} {}" . format ( addr , asm_instr ))
# Print REIL translation.
for reil_instr in reil_instrs :
print ( " t {}" . format ( reil_instr )) Wir können den CFG auch wiederherstellen und in einer .dot -Datei speichern.
# Recover CFG.
cfg = barf . recover_cfg ()
# Save CFG to a .dot file.
cfg . save ( "branch4.x86_cfg" )Wir können die Beschränkungen des Codes mit einem SMT -Solver überprüfen. Angenommen, Sie haben den folgenden Code:
80483ed: 55 push ebp
80483ee: 89 e5 mov ebp,esp
80483f0: 83 ec 10 sub esp,0x10
80483f3: 8b 45 f8 mov eax,DWORD PTR [ebp-0x8]
80483f6: 8b 55 f4 mov edx,DWORD PTR [ebp-0xc]
80483f9: 01 d0 add eax,edx
80483fb: 83 c0 05 add eax,0x5
80483fe: 89 45 fc mov DWORD PTR [ebp-0x4],eax
8048401: 8b 45 fc mov eax,DWORD PTR [ebp-0x4]
8048404: c9 leave
8048405: c3 ret
Und Sie möchten wissen, welche Werte Sie den Speicherorten ebp-0x4 , ebp-0x8 und ebp-0xc zuweisen müssen, um nach der Ausführung des Codes einen bestimmten Wert im eax Register zu erhalten.
Zunächst fügen wir die Anweisungen zur Analysatorkomponente hinzu.
from barf import BARF
# Open ELF file
barf = BARF ( "examples/misc/samples/bin/constraint1.x86" )
# Add instructions to analyze.
for addr , asm_instr , reil_instrs in barf . translate ( 0x80483ed , 0x8048401 ):
for reil_instr in reil_instrs :
barf . code_analyzer . add_instruction ( reil_instr )Dann generieren wir Ausdrücke für jede interessierende Variable und fügen ihnen die gewünschten Einschränkungen hinzu.
ebp = barf . code_analyzer . get_register_expr ( "ebp" , mode = "post" )
# Preconditions: set range for variable a and b
a = barf . code_analyzer . get_memory_expr ( ebp - 0x8 , 4 , mode = "pre" )
b = barf . code_analyzer . get_memory_expr ( ebp - 0xc , 4 , mode = "pre" )
for constr in [ a >= 2 , a <= 100 , b >= 2 , b <= 100 ]:
barf . code_analyzer . add_constraint ( constr )
# Postconditions: set desired value for the result
c = barf . code_analyzer . get_memory_expr ( ebp - 0x4 , 4 , mode = "post" )
for constr in [ c >= 26 , c <= 28 ]:
barf . code_analyzer . add_constraint ( constr )Schließlich überprüfen wir, ob die Einschränkungen, die wir festlegen, gelöst werden können.
if barf . code_analyzer . check () == 'sat' :
print ( "[+] Satisfiable! Possible assignments:" )
# Get concrete value for expressions
a_val = barf . code_analyzer . get_expr_value ( a )
b_val = barf . code_analyzer . get_expr_value ( b )
c_val = barf . code_analyzer . get_expr_value ( c )
# Print values
print ( "- a: {0:#010x} ({0})" . format ( a_val ))
print ( "- b: {0:#010x} ({0})" . format ( b_val ))
print ( "- c: {0:#010x} ({0})" . format ( c_val ))
assert a_val + b_val + 5 == c_val
else :
print ( "[-] Unsatisfiable!" )Sie können diese und weitere Beispiele im Beispielverzeichnis sehen.
Das Framework ist in drei Hauptkomponenten unterteilt: Kern , Bogen und Analyse .
Diese Komponente enthält wesentliche Module:
REIL : Bietet Definitionen für die Reil -Sprache. Es implementiert auch einen Emulator und einen Parser .SMT : Bietet Mittel zur Schnittstelle mit Z3- und CVC4 -SMT -Solver. Außerdem bietet es Funktionen, um Reil -Anweisungen in SMT -Ausdrücke zu übersetzen.BI : Das Binärschnittstellenmodul ist für das Laden von Binärdateien für die Verarbeitung verantwortlich (es verwendet Pefile und Pyelftools). Jede unterstützte Architektur wird als Unterkomponente bereitgestellt, die die folgenden Module enthält.
Architecture : Beschreibt die Architektur, dh Register, Speicheradressgröße.Translator : Bietet Übersetzer, um für jede unterstützte Anweisung zu reil.Disassembler : Bietet Disassembling -Funktionen (es verwendet Capstone).Parser : Transformiert die Anweisung von String in Objektform. Bisher besteht diese Komponente aus Modulen: Kontroll-Flow-Diagramm , Aufrufdiagramm und Codeanalysator . Die ersten beiden liefert Funktionen für die CFG- bzw. CG -Wiederherstellung. Letzteres ist eine hochrangige Schnittstelle zur SMT Solver-bezogenen Funktionalität.
BARFgadgets ist ein Python -Skript, das auf Barf aufgebaut ist, mit dem Sie in einem binären Programm suchen , klassifiziert und verifizieren können. Die Suchstufe findet alle ret -, jmp -und call die Geräte im Binary an. Die Klassifizierungsphase klassifiziert zuvor gefundene Geräte gemäß den folgenden Typen:
Dies geschieht durch Anweisungsemulation. Schließlich besteht die Überprüfungsstufe darin, einen SMT -Löser zu verwenden, um die Semantik zu überprüfen, die jedem Gerät in der zweiten Stufe zugewiesen wurde.
usage: BARFgadgets [-h] [--version] [--bdepth BDEPTH] [--idepth IDEPTH] [-u]
[-c] [-v] [-o OUTPUT] [-t] [--sort {addr,depth}] [--color]
[--show-binary] [--show-classification] [--show-invalid]
[--summary SUMMARY] [-r {8,16,32,64}]
filename
Tool for finding, classifying and verifying ROP gadgets.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
--version Display version.
--bdepth BDEPTH Gadget depth in number of bytes.
--idepth IDEPTH Gadget depth in number of instructions.
-u, --unique Remove duplicate gadgets (in all steps).
-c, --classify Run gadgets classification.
-v, --verify Run gadgets verification (includes classification).
-o OUTPUT, --output OUTPUT
Save output to file.
-t, --time Print time of each processing step.
--sort {addr,depth} Sort gadgets by address or depth (number of
instructions) in ascending order.
--color Format gadgets with ANSI color sequences, for output
in a 256-color terminal or console.
--show-binary Show binary code for each gadget.
--show-classification
Show classification for each gadget.
--show-invalid Show invalid gadget, i.e., gadgets that were
classified but did not pass the verification process.
--summary SUMMARY Save summary to file.
-r {8,16,32,64} Filter verified gadgets by operands register size.
Weitere Informationen finden Sie unter Readme.
BARFcfg ist ein Python-Skript, das auf BARF baut, mit dem Sie das Kontroll-Flow-Diagramm eines binären Programms wiederherstellen können.
usage: BARFcfg [-h] [-s SYMBOL_FILE] [-f {txt,pdf,png,dot}] [-t]
[-d OUTPUT_DIR] [-b] [--show-reil]
[--immediate-format {hex,dec}] [-a | -r RECOVER]
filename
Tool for recovering CFG of a binary.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
-s SYMBOL_FILE, --symbol-file SYMBOL_FILE
Load symbols from file.
-f {txt,pdf,png,dot}, --format {txt,pdf,png,dot}
Output format.
-t, --time Print process time.
-d OUTPUT_DIR, --output-dir OUTPUT_DIR
Output directory.
-b, --brief Brief output.
--show-reil Show REIL translation.
--immediate-format {hex,dec}
Output format.
-a, --recover-all Recover all functions.
-r RECOVER, --recover RECOVER
Recover specified functions by address (comma
separated).
BARFcg ist ein Python -Skript, das auf Barf zusammen ist, mit dem Sie das Anrufdiagramm eines binären Programms wiederherstellen können.
usage: BARFcg [-h] [-s SYMBOL_FILE] [-f {pdf,png,dot}] [-t] [-a | -r RECOVER]
filename
Tool for recovering CG of a binary.
positional arguments:
filename Binary file name.
optional arguments:
-h, --help show this help message and exit
-s SYMBOL_FILE, --symbol-file SYMBOL_FILE
Load symbols from file.
-f {pdf,png,dot}, --format {pdf,png,dot}
Output format.
-t, --time Print process time.
-a, --recover-all Recover all functions.
-r RECOVER, --recover RECOVER
Recover specified functions by address (comma
separated).
Pyasmjit ist ein Python -Paket für die Erzeugung und Ausführung von X86_64/ARM -Assembly -Code.
Dieses Paket wurde entwickelt, um die BARF -Anweisungsübersetzung von x86_64/arm nach Reil zu testen. Die Hauptidee besteht darin, nativ mit Codefragmenten auszuführen. Dann wird das gleiche Fragment in Reil übersetzt und in einer Reil -VM ausgeführt. Schließlich sind beide endgültigen Kontexte (die durch native Ausführung erhaltene und die aus Emulation erhalten) für Unterschiede verglichen.
Weitere Informationen finden Sie unter Pyasmjit.
Die BSD 2-Klausel-Lizenz. Weitere Informationen finden Sie unter Lizenz.