卡內基·梅隆大學二進制分析平台(CMU BAP)是一套公用事業和圖書館,可以分析二進製程序。 BAP支持X86,X86-64,ARM,MIPS,POWERPC,並且可以使用插件添加新的架構。 BAP包括各種分析,標準解釋器,微執行解釋器和符號執行人。 BAP具有其自己的特定領域語言Primus LISP,用於實施分析,指定驗證條件,建模功能(編寫存根),甚至與SMT求解器接口。工具包存儲庫包括可以用BAP實施的各種程序分析工具的示例,可用作實施自定義分析的起點(除教程之外)。 BAP可以用作具有單個BAP實用程序的框架,該框架可以用插件擴展,也可以用作用戶應用程序中嵌入的庫,該庫可以用OCAML或任何其他語言使用C綁定來編寫。我們還為Python提供了一些最小的支持,以使開始學習BAP變得更加容易。
BAP是在CMU,Cylab開發的,並由美國國防部,西門子,波音,Forallsecure和韓國政府的贈款贊助,有關更多信息,請參見贊助商。 BAP用於各種機構,並用作許多有趣項目的骨幹,有些則在下面突出顯示:
我們為Debian和Red Hat衍生品提供了包裝的二進制包。對於其他分佈,我們提供TGZ檔案。在Debian衍生產品上安裝BAP:
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中編寫分析,則需要使用OPAM或直接克隆和構建此存儲庫來安裝源代碼中的BAP。 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內部設備來解決,那麼您可以克隆此存儲庫並手動構建它。我們建議您從新鮮的環境開始而不會安裝BAP,以防止衝突,甚至更好地使用本地開關,例如
git clone [email protected]:BinaryAnalysisPlatform/bap.git && cd bap
opam switch create . --deps-only
dune build && dune install上面的摘要將克隆,創建一個新鮮的本地開關,安裝所需的依賴項,包括系統一個,最後,用沙丘構建和安裝BAP。另外,如果您已經有一個要構建和安裝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二進制二進制於您的計算機上:
bap /bin/echo -d請注意,與objdump不同,此命令將構建程序的控制流程圖。如果您只想將一個接一個二進制的每個指令(所謂的線性掃描拆卸器模式)倒置,那麼您可以使用objdump命令,例如
bap objdump /bin/echo --show-{insn=asm,bil}如果您的輸入是機器代碼的斑點,而不是可執行文件,則可以使用raw加載程序,例如
bap objdump /bin/echo --loader=raw --raw-base=0x400000 --show-{insn=asm,bil}原始加載程序採用一些參數,例如偏移,長度和基礎地址,這使其成為瑞士刀,您可以用作易於bap的格式的罐頭開瓶器。 RAW加載程序適用於打開文件的所有命令,例如,如果將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函數僅運行計數器並打印輸出。我們聲明我們的擴展名使用擴展名。從bap_main庫中的declare函數。擴展名只是接收上下文的函數(可用於獲得配置參數)。在此功能中,我們使用Project.register_pass函數將main函數註冊為通過。
可以在我們的教程中找到一個更複雜的示例,以及使用Python的示例。
您還可以使用沙丘構建和安裝BAP插件。為此,您需要定義庫並使用使用此庫的plugin節。以下是模板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)))
在上述片段中大寫的evewing是一個佔位符,您可以用適當的私人和公共名稱代替插件。請注意, .plugin擴展是不需要的,而是被視為良好的慣例。
BAP還發出了交互式檯面式載baptop 。這是一個類似殼的實用程序,可以交互評估OCAML表達式並打印其值。它將加載BAP庫並為您初始化所有插件,因此您可以交互探索廣闊的BAP世界。 baptop Utility還可以用作非相互作用的解釋器,因此您可以運行OCAML腳本,例如,例如, baptop myscript.ml ,甚至可以使用文件頂部的sha-bang使用Sha-bang來指定它,例如, #!/usr/bin/env baptop 。我們使用UTOP構建了baptop ,但是您可以輕鬆地使用任何其他OCAML Toplevel,包括ocaml本身,只需加載bap.top庫,例如,用於Vanilla ocaml Toplevel使用以下指令
#use " topfind " ;;
#require " bap.top " ;;我們了解BAP是巨大的,很容易迷路。我們正在不斷地改進文檔,以確保徹底記錄BAP API中的每個功能。但是,以手冊或教程的形式編寫更高級別的準則要困難得多,而且非常耗時,尤其是考慮到我們的研究人員和用戶的目標有何不同。因此,我們採用了一種向後的鏈接方法,寧願回答真實的問題,而不是過早地試圖解決所有可能的問題。我們很高興在您的聊天中見到您,這些功能可搜索,由Google,Archive索引。
我們偶爾會寫信給我們的博客和Wiki,並鼓勵每個人為他們倆做出貢獻。您也可以在Stackoverflow上發布問題,也可以在OCAML板上討論BAP。我們還有一個可愛的Discord頻道,其流量遠低於我們的吉特。
BAP是由社區建造的,我們歡迎所有願意根據麻省理工學院許可證共享它們的作者的貢獻。如果您不認為您的分析或工具適合此存儲庫(例如,它的用途有限,沒有完全準備,不符合我們的標準等),那麼您可以考慮為我們的Bap-Plugins存儲庫做出貢獻,該存儲庫是有用的BAP插件集合的集合,這些插件的集合不足以成熟,無法包含在主要分佈中。另外,您可以考慮使用工具擴展我們的工具包。
當然,無需將您的工作提交給我們的一個存儲庫。 BAP是一個基於插件的框架,您的代碼可以在任何地方託管並擁有任何許可證(包括專有)。如果您想向社區提供您的作品,那麼最好通過OPAM發布它是個好主意。
forallsecure
波音
DARPA獸醫項目
西門子AG
韓國政府(MSIT)資助的信息與通信技術促銷研究所(IITP)贈款(No.2015-0-00565,IoT軟件安全性的脆弱性發現技術的開發)
請與我們聯繫,如果您想成為贊助商或正在尋求更深入的合作。