Platform Analisis Biner Universitas Carnegie Mellon (CMU BAP) adalah serangkaian utilitas dan perpustakaan yang memungkinkan analisis program biner. BAP mendukung x86, x86-64, ARM, MIPS, PowerPC dan arsitektur baru dapat ditambahkan menggunakan plugin. BAP mencakup berbagai analisis, juru bahasa standar, juru bahasa mikro, dan pelaksana simbolik. BAP fitur bahasa khusus domainnya sendiri, Primus Lisp, yang digunakan untuk mengimplementasikan analisis, menentukan kondisi verifikasi, fungsi pemodelan (menulis stubs), dan bahkan berinteraksi dengan solver SMT. Repositori Toolkit mencakup berbagai contoh alat analisis program yang dapat diimplementasikan dengan BAP dan dapat digunakan sebagai titik awal (selain tutorial) untuk mengimplementasikan analisis khusus. BAP dapat digunakan sebagai kerangka kerja dengan utilitas BAP tunggal yang diperluas dengan plugin atau dapat digunakan sebagai perpustakaan yang tertanam dalam aplikasi pengguna, yang dapat ditulis dalam OCAML atau, dalam bahasa lain, menggunakan ikatan C. Kami juga memberikan beberapa dukungan minimal bagi Python untuk membuatnya lebih mudah untuk mulai belajar BAP.
BAP dikembangkan di CMU, Cylab dan disponsori oleh hibah dari Departemen Pertahanan Amerika Serikat, Siemens, Boeing, Forallsecure, dan Pemerintah Korea, lihat sponsor untuk informasi lebih lanjut. BAP digunakan di berbagai lembaga dan berfungsi sebagai tulang punggung untuk banyak proyek menarik, beberapa disorot di bawah ini:
Kami menyediakan paket biner yang dikemas untuk turunan Debian dan Red Hat. Untuk distribusi lain, kami menyediakan arsip TGZ. Untuk menginstal BAP pada turunan 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.debPaket biner kami tidak termasuk lingkungan pengembangan OCAML. Jika Anda akan menulis analisis di OCAML, Anda perlu menginstal BAP dari kode sumber menggunakan OPAM atau dengan mengkloning dan membangun repositori ini secara langsung. Metode OPAM adalah yang disarankan. Setelah diinstal, tiga perintah berikut harus menginstal platform dalam sakelar yang baru dibuat.
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 environmentAtau, jika Anda sudah memiliki sakelar di mana Anda ingin menginstal bap, maka lakukan saja
opam install bap
Perintah opam install bap juga akan mencoba menginstal dependensi sistem BAP menggunakan Manajer Paket Sistem Operasi Anda. Jika gagal karena ketergantungan sistem yang hilang, coba pasang secara manual dan kemudian ulangi perintah opam install bap . Jika masih tidak berhasil, jangan ragu untuk mampir dan mencari bantuan di sana. Itu dijaga dengan orang -orang ramah yang akan dengan senang hati membantu.
Instruksi di atas akan memberi Anda rilis stabil terbaru dari BAP. Jika Anda tertarik dengan rilis rolling kami, yang secara otomatis diperbarui setiap kali komit ke cabang master terjadi, maka Anda dapat membuat sakelar baru yang menggunakan repositori pengujian kami
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap Setelah ditambahkan, repositori bap akan diutamakan daripada repositori yang stabil dan Anda akan mendapatkan paket BAP yang baru dipilih langsung dari pertanian.
Jika Anda ingin membangun BAP secara manual atau hanya ingin mengatasi internal BAP, maka Anda dapat mengkloning repositori ini dan membangunnya secara manual. Kami menyarankan Anda memulai dengan lingkungan yang segar tanpa BAP dipasang, untuk mencegah bentrokan, atau bahkan lebih baik menggunakan sakelar lokal, misalnya, misalnya
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installCuplikan di atas akan mengkloning BAP, membuat sakelar lokal baru, memasang dependensi yang diperlukan, termasuk sistem satu, dan, akhirnya, membangun dan menginstal BAP dengan Dune. Atau, jika Anda sudah memiliki sakelar tempat Anda ingin membangun dan menginstal BAP, Anda dapat menggunakan
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
Untuk menginstal BAP dan ketergantungannya ke sakelar yang saat ini dipilih.
BAP, seperti Docker atau Git, digerakkan oleh utilitas baris perintah tunggal yang disebut BAP. Cukup ketik bap di shell Anda dan itu akan mencetak pesan yang menunjukkan kemampuan BAP. Perintah disassemble akan mengambil program biner, membongkar, mengangkatnya ke dalam representasi agnostik arsitektur menengah, membangun grafik aliran kontrol, dan akhirnya menerapkan analisis yang ditentukan pengguna dalam bentuk lulus pembongkaran. Akhirnya, opsi --dump ( -d singkatnya) akan menghasilkan program yang dihasilkan dalam format yang ditentukan. Ini adalah perintah default, jadi Anda bahkan tidak perlu menentukannya, misalnya, berikut ini akan membongkar dan membuang biner /bin/echo pada mesin Anda:
bap /bin/echo -d Perhatikan, bahwa tidak seperti objdump perintah ini akan membangun grafik aliran kontrol suatu program. Jika Anda hanya ingin membuang setiap instruksi biner satu demi satu (yang disebut mode disassembler sapuan linear), maka Anda dapat menggunakan perintah objdump , misalnya,
bap objdump /bin/echo --show-{insn=asm,bil} Jika input Anda adalah gumpalan kode mesin, bukan yang dapat dieksekusi, maka Anda dapat menggunakan loader raw , misalnya,
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} Loader mentah mengambil beberapa parameter, seperti offset, panjang, dan alamat dasar, yang menjadikannya pisau swiss yang dapat Anda gunakan sebagai pembuka kaleng untuk format yang tidak diketahui BAP. Loader mentah berfungsi untuk semua perintah yang membuka file, misalnya, jika loader raw digunakan bersama dengan perintah disassemble , BAP masih akan secara otomatis mengidentifikasi fungsi dimulai dan membangun CFG yang sesuai tanpa mengetahui di mana kode berada dalam biner,
bap /bin/echo --loader=raw --raw-base=0x400000 -d Jika Anda ingin bermain secara manual dengan byte, misalnya, ketikkan pengkodean instruksi secara manual dan lihat bagaimana BAP membongkar dan semantik apa yang dimilikinya, maka mc adalah perintah yang Anda cari. Dinamai untuk utilitas yang sesuai di LLVM dan singkatan dari Code Mesin dan memiliki antarmuka yang sama dengan perintah objdump kecuali bahwa ia mengambil pengkodean instruksi ASCII alih -alih file biner, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, misalnya, mis
bap mc --show-{insn=asm,bil} -- 48 83 ec 08atau
bap mc --show-{insn=asm,bil} "x48x83xecx08"
Ini mengenali beberapa format input (termasuk llvm-mc digunakan untuk opsi -show-encoding nya). Konsultasikan dokumentasi untuk informasi yang lebih rinci.
BAP adalah kerangka kerja berbasis plugin dan jika Anda ingin mengembangkan analisis baru, Anda dapat menulis plugin, membangunnya, menginstal, dan itu akan bekerja dengan sisa BAP tanpa kompilasi ulang. Ada banyak titik ekstensi yang dapat Anda gunakan untuk menambahkan analisis baru, mengubah yang ada, atau bahkan membangun aplikasi Anda sendiri. Kita akan mulai dengan contoh sederhana, yang mendaftarkan umpan yang membongkar ke perintah pembongkaran. Misalkan kami ingin menulis analisis yang memperkirakan rasio instruksi lompatan terhadap jumlah total instruksi dalam biner. Kami akan mulai dengan membuat file kosong bernama jmp.ml di folder kosong (nama folder tidak masalah). Selanjutnya, menggunakan editor teks favorit kami, kami akan memasukkan kode berikut ke dalamnya:
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 ()Sekarang kita dapat membangun, menginstal, dan menjalankan analisis kami menggunakan perintah berikut:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
Mari kita melalui kode secara singkat. Objek counter adalah pengunjung yang memiliki negara yang terdiri dari sepasang penghitung. Penghitung pertama melacak jumlah istilah JMP, dan penghitung kedua bertambah setiap kali kita memasukkan istilah apa pun. Fungsi main hanya menjalankan penghitung dan mencetak output. Kami mendeklarasikan ekstensi kami menggunakan fungsi ekstensi.declare dari pustaka BAP_MAIN. Ekstensi hanyalah fungsi yang menerima konteks (yang dapat digunakan untuk mendapatkan parameter konfigurasi). Dalam fungsi ini, kami mendaftarkan fungsi main kami sebagai pass menggunakan fungsi Project.register_pass .
Sedikit contoh yang lebih kompleks, serta contoh yang menggunakan Python, dapat ditemukan di tutorial kami.
Anda juga dapat membangun dan menginstal plugin BAP menggunakan Dune. Untuk itu, Anda perlu mendefinisikan perpustakaan dan menggunakan bait plugin yang menggunakan perpustakaan ini. Di bawah ini adalah file Template dune ,
(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 yang dikapitalisasi dalam cuplikan di atas adalah placeholder yang harus Anda gantikan dengan nama pribadi dan publik yang sesuai untuk plugin Anda. Perhatikan, bahwa ekstensi .plugin tidak diperlukan, tetapi dianggap sebagai konvensi yang baik.
BAP juga mengirimkan baptop Utilitas Toplevel Interaktif. Ini adalah utilitas seperti shell yang secara interaktif mengevaluasi ekspresi OCAML dan mencetak nilainya. Ini akan memuat pustaka BAP dan menginisialisasi semua plugin untuk Anda, sehingga Anda dapat secara interaktif menjelajahi dunia BAP yang luas. Utilitas baptop juga dapat berfungsi sebagai penerjemah non-interaktif, sehingga Anda dapat menjalankan skrip OCAML Anda, misalnya, baptop myscript.ml atau Anda bahkan dapat menentukannya menggunakan Sha-bang di bagian atas file Anda, misalnya, #!/usr/bin/env baptop . Kami membangun baptop menggunakan utop, tetapi Anda dapat dengan mudah menggunakan toplevel ocaml lainnya, termasuk ocaml itu sendiri, cukup muat bap.top library, misalnya, untuk vanilla ocaml toplevel menggunakan arahan berikut berikut
#use " topfind " ;;
#require " bap.top " ;;Kami memahami bahwa BAP sangat besar dan mudah tersesat. Kami bekerja terus -menerus untuk meningkatkan dokumentasi memastikan bahwa setiap fungsi dalam API BAP didokumentasikan secara menyeluruh. Tetapi menulis pedoman tingkat yang lebih tinggi dalam bentuk manual atau tutorial jauh lebih sulit dan sangat memakan waktu, terutama mengingat betapa berbedanya tujuan rekan peneliti dan pengguna kami. Oleh karena itu kami menggunakan pendekatan rantai mundur dan lebih suka menjawab pertanyaan nyata daripada mencoba sebelum waktunya untuk menjawab semua pertanyaan yang mungkin. Kami akan senang melihat Anda dalam obrolan Anda yang fitur dapat dicari, diindeks oleh Google, Archive.
Kami menulis, kadang -kadang, ke blog dan wiki kami dan mendorong semua orang untuk berkontribusi pada keduanya. Anda juga dapat memposting pertanyaan Anda di StackOverflow atau mendiskusikan BAP di papan OCAML. Kami juga memiliki saluran perselisihan yang lucu, yang memiliki lalu lintas jauh lebih sedikit daripada gitter kami.
BAP dibangun oleh masyarakat dan kami menyambut semua kontribusi dari penulis yang bersedia membaginya di bawah lisensi MIT. Jika Anda tidak berpikir bahwa analisis atau alat Anda sesuai dengan repositori ini (misalnya, ia memiliki penggunaan terbatas, tidak sepenuhnya siap, tidak memenuhi standar kami, dll), maka Anda dapat mempertimbangkan berkontribusi pada repositori BAP-plugin kami yang merupakan kumpulan plugin BAP yang berguna yang tidak cukup matang untuk dimasukkan dalam distribusi utama. Atau, Anda dapat mempertimbangkan untuk memperluas toolkit kami dengan alat Anda.
Tentu saja, tidak perlu mengirimkan pekerjaan Anda ke salah satu repositori kami. BAP adalah kerangka kerja berbasis plugin dan kode Anda dapat di-host di mana saja dan memiliki lisensi (termasuk hak milik). Jika Anda ingin membuat pekerjaan Anda tersedia untuk komunitas,, ide yang baik untuk merilisnya melalui OPAM.
Forallsecure
Boeing
Proyek DARPA VET
Siemens AG
Institute for Information & Communications Technology Promotion (IITP) Hibah yang didanai oleh Pemerintah Korea (MSIT) (No.2015-0-00565, Pengembangan Teknologi Penemuan Kerentanan untuk Keamanan Perangkat Lunak IoT)
Tolong, hubungi kami jika Anda ingin menjadi sponsor atau mencari kolaborasi yang lebih dalam.