Analisis kode biner adalah kegiatan penting di banyak bidang ilmu komputer dan disiplin rekayasa perangkat lunak mulai dari keamanan perangkat lunak dan analisis program hingga rekayasa terbalik. Analisis biner manual adalah tugas yang sulit dan memakan waktu dan ada alat perangkat lunak yang berupaya mengotomatisasi atau membantu analis manusia. Namun, sebagian besar alat ini memiliki beberapa pembatasan teknis dan komersial yang membatasi akses dan penggunaan oleh sebagian besar komunitas akademik dan praktisi. BARF adalah kerangka analisis biner open source yang bertujuan untuk mendukung berbagai tugas analisis kode biner yang umum dalam disiplin keamanan informasi. Ini adalah platform skrip yang mendukung pengangkatan instruksi dari beberapa arsitektur, terjemahan biner ke representasi perantara, kerangka kerja yang dapat diperluas untuk plugin analisis kode dan interoperasi dengan alat eksternal seperti debugger, pemecah SMT dan alat instrumentasi. Kerangka kerja ini dirancang terutama untuk analisis berbantuan manusia tetapi dapat sepenuhnya otomatis.
Proyek BARF mencakup BARF dan alat dan paket terkait. Sejauh ini proyek terdiri dari item berikut:
Untuk informasi lebih lanjut, lihat:
Status Saat Ini:
| Rilis terbaru | V0.6.0 |
|---|---|
| Url | https://github.com/programa-stic/barf-project/releases/tag/v0.6.0 |
| Ubah log | https://github.com/programa-stic/barf-project/blob/v0.6.0/changelog.md |
Semua paket diuji pada Ubuntu 16.04 (x86_64).
Barf adalah paket Python untuk analisis biner dan rekayasa terbalik. Itu bisa:
ELF , PE , dll),Saat ini sedang dalam pengembangan .
BARF tergantung pada pemecah SMT berikut:
Perintah berikut menginstal BARF pada sistem Anda:
$ sudo python setup.py installAnda juga dapat menginstalnya secara lokal:
$ sudo python setup.py install --usersudo pip install pyasmjitsudo apt-get install graphvizIni adalah contoh yang sangat sederhana yang menunjukkan cara membuka file biner dan mencetak setiap instruksi dengan terjemahannya ke bahasa menengah ( Reil ).
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 )) Kami juga dapat memulihkan CFG dan menyimpannya ke file .dot .
# Recover CFG.
cfg = barf . recover_cfg ()
# Save CFG to a .dot file.
cfg . save ( "branch4.x86_cfg" )Kami dapat memeriksa pembatasan kode menggunakan SMT Solver. Misalnya, misalkan Anda memiliki kode berikut:
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
Dan Anda ingin tahu nilai apa yang harus Anda tetapkan ke lokasi memori ebp-0x4 , ebp-0x8 dan ebp-0xc untuk mendapatkan nilai spesifik dalam register eax setelah menjalankan kode.
Pertama, kami menambahkan instruksi ke komponen penganalisa.
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 )Kemudian, kami menghasilkan ekspresi untuk setiap variabel yang diminati dan menambahkan batasan yang diinginkan.
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 )Akhirnya, kami memeriksa adalah pembatasan yang kami buat dapat diselesaikan.
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!" )Anda dapat melihat ini dan lebih banyak contoh di direktori contoh.
Kerangka kerja ini dibagi dalam tiga komponen utama: inti , lengkungan dan analisis .
Komponen ini berisi modul penting:
REIL : Memberikan definisi untuk bahasa Reil. Itu juga mengimplementasikan emulator dan parser .SMT : Menyediakan sarana untuk berinteraksi dengan pemecah SMT Z3 dan CVC4. Juga, ia menyediakan fungsionalitas untuk menerjemahkan instruksi Reil ke ekspresi SMT.BI : Modul antarmuka biner bertanggung jawab untuk memuat file biner untuk diproses (menggunakan pefile dan pyelftools.) Setiap arsitektur yang didukung disediakan sebagai subkomponen yang berisi modul -modul berikut.
Architecture : Menjelaskan arsitektur, yaitu, register, ukuran alamat memori.Translator : Menyediakan penerjemah untuk Reil untuk setiap instruksi yang didukung.Disassembler : Menyediakan fungsionalitas pembongkaran (menggunakan batu penjuru.)Parser : Mengubah instruksi dari string ke bentuk objek. Sejauh ini komponen ini terdiri dari modul: grafik kontrol , grafik panggilan dan penganalisa kode . Dua yang pertama, masing -masing memberikan fungsionalitas untuk pemulihan CFG dan CG. Yang terakhir, ini merupakan antarmuka tingkat tinggi ke fungsionalitas terkait pemecah SMT.
BARFgadgets adalah skrip Python yang dibangun di atas barf yang memungkinkan Anda mencari , mengklasifikasikan dan memverifikasi gadget ROP di dalam program biner. Tahap pencarian menemukan semua gadget ret -, jmp -dan call -enden di dalam biner. Tahap klasifikasi mengklasifikasikan gadget yang sebelumnya ditemukan sesuai dengan jenis berikut:
Ini dilakukan melalui emulasi instruksi. Akhirnya, tahap verifikasi terdiri dari menggunakan solver SMT untuk memverifikasi semantik yang ditugaskan untuk setiap gadget pada tahap kedua.
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.
Untuk informasi lebih lanjut, lihat ReadMe.
BARFcfg adalah skrip Python yang dibangun di atas barf yang memungkinkan Anda memulihkan grafik kontrol-aliran dari program biner.
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 adalah skrip Python yang dibangun di atas barf yang memungkinkan Anda memulihkan grafik panggilan dari program biner.
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 adalah paket Python untuk X86_64/ARM Assembly Code Generation and Execution.
Paket ini dikembangkan untuk menguji terjemahan instruksi BARF dari x86_64/lengan ke Reil. Gagasan utamanya adalah dapat menjalankan fragmen kode secara asli. Kemudian, fragmen yang sama diterjemahkan ke Reil dan dieksekusi dalam Reil VM. Akhirnya, kedua konteks akhir (yang diperoleh melalui eksekusi asli dan yang dari emulasi) dibandingkan dengan perbedaan.
Untuk informasi lebih lanjut, lihat Pyasmjit.
Lisensi BSD 2 Clause. Untuk informasi lebih lanjut, lihat lisensi.