แพลตฟอร์มการวิเคราะห์ไบนารีของ Carnegie Mellon University (CMU BAP) เป็นชุดยูทิลิตี้และห้องสมุดที่เปิดใช้งานการวิเคราะห์โปรแกรมไบนารี BAP รองรับ X86, X86-64, ARM, MIPS, PowerPC และสถาปัตยกรรมใหม่สามารถเพิ่มได้โดยใช้ปลั๊กอิน BAP รวมถึงการวิเคราะห์ที่หลากหลายล่ามมาตรฐานล่าม MicroExecution และผู้ดำเนินการเชิงสัญลักษณ์ BAP มีภาษาเฉพาะโดเมนของตัวเอง Primus Lisp ที่ใช้สำหรับการใช้การวิเคราะห์การระบุเงื่อนไขการตรวจสอบฟังก์ชั่นการสร้างแบบจำลอง (การเขียน Stubs) และแม้แต่การเชื่อมต่อกับ SMT Solver พื้นที่เก็บข้อมูล Toolkit รวมถึงตัวอย่างต่าง ๆ ของเครื่องมือวิเคราะห์โปรแกรมที่สามารถนำไปใช้กับ BAP และสามารถใช้เป็นจุดเริ่มต้น (นอกเหนือจากการสอน) สำหรับการใช้การวิเคราะห์ที่กำหนดเอง BAP สามารถใช้เป็นเฟรมเวิร์กที่มียูทิลิตี้ BAP เดียวที่ขยายด้วยปลั๊กอินหรือสามารถใช้เป็นไลบรารีที่ฝังอยู่ในแอปพลิเคชันผู้ใช้ซึ่งสามารถเขียนใน OCAML หรือในภาษาอื่น ๆ โดยใช้การผูก C นอกจากนี้เรายังให้การสนับสนุนน้อยที่สุดสำหรับ Python เพื่อให้ง่ายต่อการเริ่มเรียนรู้ BAP
BAP ได้รับการพัฒนาใน CMU, Cylab และได้รับการสนับสนุนจากทุนจากกระทรวงกลาโหมสหรัฐอเมริกา, ซีเมนส์, โบอิ้ง, Forallsecure และรัฐบาลเกาหลีดูผู้สนับสนุนสำหรับข้อมูลเพิ่มเติม BAP ใช้ในสถาบันต่าง ๆ และทำหน้าที่เป็นกระดูกสันหลังสำหรับโครงการที่น่าสนใจหลายโครงการบางแห่งมีการเน้นด้านล่าง:
เราให้บริการแพคเกจไบนารีที่บรรจุสำหรับอนุพันธ์ Debian และ Red Hat สำหรับการแจกแจงอื่น ๆ เรามีคลังเก็บ TGZ ในการติดตั้ง BAP บนอนุพันธ์ของ 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.debแพ็คเกจไบนารีของเราไม่รวมถึงสภาพแวดล้อมการพัฒนา OCAML หากคุณกำลังจะเขียนการวิเคราะห์ใน OCAML คุณต้องติดตั้ง BAP จากซอร์สโค้ดโดยใช้ OPAM หรือโดยการโคลนนิ่งและสร้างที่เก็บนี้โดยตรง วิธี OPAM เป็นวิธีที่แนะนำ เมื่อติดตั้งคำสั่งสามคำต่อไปนี้ควรติดตั้งแพลตฟอร์มในสวิตช์ที่สร้างขึ้นใหม่
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 environmentหรือถ้าคุณมีสวิตช์ที่คุณต้องการติดตั้ง BAP อยู่แล้วเพียงแค่ทำ
opam install bap
คำสั่ง opam install bap จะพยายามติดตั้งการพึ่งพาระบบของ BAP โดยใช้ตัวจัดการแพ็คเกจระบบปฏิบัติการของคุณ หากล้มเหลวเนื่องจากการพึ่งพาระบบที่หายไปให้ลองติดตั้งด้วยตนเองจากนั้นทำซ้ำคำสั่ง opam install bap หากยังไม่ทำงานอย่าลังเลที่จะแวะแชทของเราและขอความช่วยเหลือที่นั่น มันเป็นคนที่เป็นมิตรกับคนที่ยินดีที่จะช่วยเหลือ
คำสั่งด้านบนจะช่วยให้คุณได้รับการเปิดตัว BAP ที่มั่นคงล่าสุด หากคุณสนใจในรีลีสของเราซึ่งได้รับการอัปเดตโดยอัตโนมัติทุกครั้ง
opam switch create bap-testing --repos
default,bap=git+https://github.com/BinaryAnalysisPlatform/opam-repository#testing 4.14.1
opam install bap หลังจากที่มีการเพิ่มพื้นที่เก็บข้อมูล bap จะมีความสำคัญเหนือกว่าที่เก็บที่มั่นคงและคุณจะได้รับแพ็คเกจ BAP ที่เลือกใหม่ตรงจากฟาร์ม
หากคุณต้องการสร้าง BAP ด้วยตนเองหรือเพียงแค่ต้องการจัดการกับ BAP Internals คุณสามารถโคลนที่เก็บนี้และสร้างมันด้วยตนเอง เราขอแนะนำให้คุณเริ่มต้นด้วยสภาพแวดล้อมที่สดใหม่โดยไม่ต้องติดตั้ง BAP เพื่อป้องกันการปะทะหรือดีกว่าที่จะใช้สวิตช์ท้องถิ่นเช่น
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune installตัวอย่างด้านบนจะโคลน bap สร้างสวิตช์ท้องถิ่นใหม่ติดตั้งการอ้างอิงที่จำเป็นรวมถึงระบบหนึ่งและในที่สุดก็สร้างและติดตั้ง BAP ด้วย Dune หรือถ้าคุณมีสวิตช์ที่คุณต้องการสร้างและติดตั้ง BAP คุณสามารถใช้งานได้
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam install . --deps-only
dune build && dune install
ในการติดตั้ง BAP และการอ้างอิงลงในสวิตช์ที่เลือกในปัจจุบัน
BAP เช่น Docker หรือ Git ถูกขับเคลื่อนด้วยยูทิลิตี้บรรทัดคำสั่งเดียวที่เรียกว่า BAP เพียงพิมพ์ bap ในเชลล์ของคุณและจะพิมพ์ข้อความซึ่งแสดงความสามารถของ BAP คำสั่ง disassemble จะใช้โปรแกรมไบนารีถอดชิ้นส่วนมันขึ้นไปในการแสดงสถาปัตยกรรมระดับกลางสร้างกราฟการไหลของการควบคุมและในที่สุดก็ใช้การวิเคราะห์ที่ผู้ใช้กำหนดไว้ในรูปแบบของการแยกชิ้นส่วนผ่าน ในที่สุดตัวเลือก --dump ( -d ในระยะสั้น) จะส่งออกโปรแกรมผลลัพธ์ในรูปแบบที่ระบุ นี่คือคำสั่งเริ่มต้นดังนั้นคุณไม่จำเป็นต้องระบุด้วยซ้ำเช่นต่อไปนี้จะถอดประกอบและทิ้ง /bin/echo binary บนเครื่องของคุณ:
bap /bin/echo -d หมายเหตุที่แตกต่างจาก objdump คำสั่งนี้จะสร้างกราฟโฟลว์ควบคุมของโปรแกรม หากคุณเพียงต้องการทิ้งคำสั่งแต่ละคำสั่งของไบนารีหลังจากอื่น (โหมด disassembler linear sweep ที่เรียกว่า) คุณสามารถใช้คำสั่ง objdump เช่น
bap objdump /bin/echo --show-{insn=asm,bil} หากอินพุตของคุณเป็น blob ของรหัสเครื่องไม่ใช่แบบปฏิบัติการได้คุณสามารถใช้ตัวโหลด raw เช่น
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil} ตัวโหลดดิบใช้พารามิเตอร์สองสามอย่างเช่นออฟเซ็ตความยาวและที่อยู่พื้นฐานซึ่งทำให้เป็นมีดสวิสที่คุณสามารถใช้เป็นตัวเปิดกระป๋องสำหรับรูปแบบที่ไม่รู้จัก BAP ตัวโหลดดิบทำงานได้สำหรับคำสั่งทั้งหมดที่เปิดไฟล์เช่นถ้าใช้ตัวโหลด raw พร้อมกับคำสั่ง disassemble BAP จะยังคงระบุฟังก์ชั่นเริ่มต้นและสร้าง CFG ที่เหมาะสมโดยอัตโนมัติโดยไม่ทราบว่ารหัสอยู่ที่ไหนในไบนารี
bap /bin/echo --loader=raw --raw-base=0x400000 -d หากคุณต้องการเล่นด้วยตนเองกับไบต์เช่นพิมพ์การเข้ารหัสคำสั่งด้วยตนเองและดูว่า BAP ถอดชิ้นส่วนและความหมายของความหมายอย่างไร mc คือคำสั่งที่คุณกำลังมองหา มันมีชื่อสำหรับยูทิลิตี้ที่สอดคล้องกันใน LLVM และย่อมาจากรหัสเครื่องและมีอินเทอร์เฟซเดียวกับคำสั่ง objdump ยกเว้นว่าใช้การเข้ารหัส ASCII ของคำสั่งแทนไฟล์ไบนารีเช่น
bap mc --show-{insn=asm,bil} -- 48 83 ec 08หรือ
bap mc --show-{insn=asm,bil} "x48x83xecx08"
มันรับรู้รูปแบบอินพุตบางอย่าง (รวมถึง llvm-mc ใช้สำหรับตัวเลือก -show-encoding ) ปรึกษาเอกสารสำหรับข้อมูลรายละเอียดเพิ่มเติม
BAP เป็นเฟรมเวิร์กที่ใช้ปลั๊กอินและหากคุณต้องการพัฒนาการวิเคราะห์ใหม่คุณสามารถเขียนปลั๊กอินสร้างติดตั้งและจะทำงานกับส่วนที่เหลือของ BAP โดยไม่ต้องรวมกันใหม่ มีจุดขยายมากมายที่คุณสามารถใช้เพื่อเพิ่มการวิเคราะห์ใหม่เปลี่ยนที่มีอยู่หรือแม้แต่สร้างแอปพลิเคชันของคุณเอง เราจะเริ่มต้นด้วยตัวอย่างง่ายๆที่ลงทะเบียนผ่านการแยกชิ้นส่วนผ่านคำสั่งถอดชิ้นส่วน สมมติว่าเราต้องการเขียนการวิเคราะห์ที่ประมาณอัตราส่วนของคำแนะนำการกระโดดต่อจำนวนคำแนะนำทั้งหมดในไบนารี เราจะเริ่มต้นด้วยการสร้างไฟล์ว่างชื่อ jmp.ml ในโฟลเดอร์ว่าง (ชื่อโฟลเดอร์ไม่สำคัญ) ต่อไปโดยใช้ตัวแก้ไขข้อความที่เราชื่นชอบเราจะใส่รหัสต่อไปนี้ลงไป:
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 ()ตอนนี้เราสามารถสร้างติดตั้งและเรียกใช้การวิเคราะห์ของเราโดยใช้คำสั่งต่อไปนี้:
bapbuild jmp.plugin
bapbundle install jmp.plugin
bap /bin/echo --pass=jmp
ลองดูรหัสสั้น ๆ วัตถุ counter เป็นผู้เข้าชมที่มีสถานะประกอบด้วยเคาน์เตอร์คู่หนึ่ง ตัวนับแรกติดตามจำนวนข้อกำหนด JMP และตัวนับที่สองจะเพิ่มขึ้นทุกครั้งที่เราป้อนคำใด ๆ ฟังก์ชั่น main เพียงแค่เรียกใช้ตัวนับและพิมพ์เอาต์พุต เราประกาศว่าส่วนขยายของเราใช้ฟังก์ชั่นส่วนขยาย declare จากไลบรารี BAP_Main ส่วนขยายเป็นเพียงฟังก์ชั่นที่ได้รับบริบท (ซึ่งสามารถใช้เพื่อรับพารามิเตอร์การกำหนดค่า) ในฟังก์ชั่นนี้เราลงทะเบียนฟังก์ชั่น main ของเราเป็นบัตรผ่านโดยใช้ฟังก์ชัน Project.register_pass
ตัวอย่างที่ซับซ้อนยิ่งขึ้นเล็กน้อยรวมถึงตัวอย่างที่ใช้ Python สามารถพบได้ในบทช่วยสอนของเรา
คุณยังสามารถสร้างและติดตั้งปลั๊กอิน BAP โดยใช้ Dune สำหรับสิ่งนั้นคุณต้องกำหนดไลบรารีและใช้ plugin stanza ที่ใช้ไลบรารีนี้ ด้านล่างคือไฟล์เทมเพลต 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)))
ทุกสิ่งที่เป็นตัวพิมพ์ใหญ่ในตัวอย่างด้านบนเป็นตัวยึดตำแหน่งที่คุณจะทดแทนชื่อส่วนตัวและสาธารณะที่เหมาะสมสำหรับปลั๊กอินของคุณ ขอให้สังเกตว่าไม่จำเป็นต้องขยายส่วนขยาย .plugin แต่ได้รับการยอมรับว่าเป็นอนุสัญญาที่ดี
BAP ยังจัดส่ง baptop ยูทิลิตี้ Toclevel แบบโต้ตอบ นี่คือยูทิลิตี้ที่มีลักษณะคล้ายเปลือกหอยที่ประเมินการแสดงออกของ OCAML และพิมพ์ค่าของพวกเขา มันจะโหลดไลบรารี BAP และเริ่มต้นปลั๊กอินทั้งหมดสำหรับคุณเพื่อให้คุณสามารถสำรวจโลกที่กว้างใหญ่ของ BAP ยูทิลิตี้ baptop สามารถทำหน้าที่เป็นล่ามที่ไม่โต้ตอบเพื่อให้คุณสามารถเรียกใช้สคริปต์ OCAML ของคุณเช่น baptop myscript.ml หรือคุณสามารถระบุได้โดยใช้ sha-bang ที่ด้านบนของไฟล์เช่น #!/usr/bin/env baptop เราสร้าง baptop โดยใช้ UTOP แต่คุณสามารถใช้ OCAML Toplevel อื่น ๆ ได้อย่างง่ายดายรวมถึง ocaml เองเพียงแค่โหลดไลบรารี bap.top เช่นวานิลลา ocaml Toplevel ใช้คำสั่งต่อไปนี้
#use " topfind " ;;
#require " bap.top " ;;เราเข้าใจว่า BAP มีขนาดใหญ่มากและเป็นเรื่องง่ายที่จะหลงทาง เรากำลังทำงานอย่างต่อเนื่องในการปรับปรุงเอกสารเพื่อให้มั่นใจว่าทุกฟังก์ชั่นใน BAP API ได้รับการบันทึกไว้อย่างละเอียด แต่การเขียนแนวทางระดับที่สูงขึ้นในรูปแบบของคู่มือหรือแบบฝึกหัดนั้นยากและใช้เวลานานมากโดยเฉพาะอย่างยิ่งเมื่อเป้าหมายของนักวิจัยและผู้ใช้ของเราแตกต่างกันอย่างไร ดังนั้นเราจึงใช้วิธีการที่ซ่อนเร้นไปข้างหลังและต้องการตอบคำถามจริงแทนที่จะพยายามตอบคำถามที่เป็นไปได้ทั้งหมดก่อนเวลาอันควร เรายินดีที่จะพบคุณในการแชทของคุณที่มีคุณสมบัติค้นหาได้โดย Google, Archive
เรากำลังเขียนบางครั้งไปยังบล็อกและวิกิของเราและสนับสนุนให้ทุกคนมีส่วนร่วมกับทั้งคู่ นอกจากนี้คุณยังสามารถโพสต์คำถามของคุณบน StackOverflow หรือพูดคุย BAP บนบอร์ด OCAML นอกจากนี้เรายังมีช่องความไม่ลงรอยกันที่น่ารักซึ่งมีปริมาณการใช้งานน้อยกว่า Gitter ของเรา
BAP ถูกสร้างขึ้นโดยชุมชนและเรายินดีต้อนรับการมีส่วนร่วมทั้งหมดจากผู้เขียนที่ยินดีแบ่งปันภายใต้ใบอนุญาต MIT หากคุณไม่คิดว่าการวิเคราะห์หรือเครื่องมือของคุณเหมาะสมกับที่เก็บนี้ (เช่นมีการใช้งาน จำกัด ไม่พร้อมอย่างเต็มที่ไม่เป็นไปตามมาตรฐานของเรา ฯลฯ ) คุณสามารถพิจารณามีส่วนร่วมในการเก็บ BAP-plugins ของเราซึ่งเป็นคอลเลกชันของปลั๊กอิน BAP ที่มีประโยชน์ หรือคุณสามารถพิจารณาขยายชุดเครื่องมือของเราด้วยเครื่องมือของคุณ
แน่นอนไม่จำเป็นต้องส่งงานของคุณไปยังหนึ่งในที่เก็บของเรา BAP เป็นเฟรมเวิร์กที่ใช้ปลั๊กอินและรหัสของคุณสามารถโฮสต์ได้ทุกที่และมีใบอนุญาตใด ๆ (รวมถึงกรรมสิทธิ์) หากคุณต้องการทำให้งานของคุณพร้อมใช้งานกับชุมชนมันเป็นความคิดที่ดีที่จะปล่อยผ่าน OPAM
forallsecure
โบอิ้ง
โครงการสัตวแพทย์ DARPA
ซีเมนส์ ag
สถาบันเพื่อการส่งเสริมเทคโนโลยีสารสนเทศและการสื่อสาร (IITP) ได้รับทุนสนับสนุนจากรัฐบาลเกาหลี (MSIT) (ฉบับที่ 2015-0-00565 การพัฒนาเทคโนโลยีการค้นพบช่องโหว่สำหรับความปลอดภัยซอฟต์แวร์ IoT)
โปรดติดต่อเราหากคุณต้องการเป็นสปอนเซอร์หรือกำลังมองหาการทำงานร่วมกันที่ลึกซึ้งยิ่งขึ้น