カーネギーメロン大学バイナリ分析プラットフォーム(CMU BAP)は、バイナリプログラムの分析を可能にする一連のユーティリティとライブラリです。 BAPはX86、X86-64、ARM、MIPS、PowerPCをサポートし、プラグインを使用して新しいアーキテクチャを追加できます。 BAPには、さまざまな分析、標準的な通訳、マイクロエクスケーションインタープリター、および象徴的な執行者が含まれます。 BAPは、分析の実装、検証条件の指定、モデリング機能(スタブの作成)、さらにはSMTソルバーとのインターフェースに使用される独自のドメイン固有の言語であるPrimus Lispを備えています。 Toolkitリポジトリには、BAPで実装できるプログラム分析ツールのさまざまな例が含まれており、カスタム分析を実装するために(チュートリアルに加えて)開始点として使用できます。 BAPは、プラグインで拡張された単一のBAPユーティリティを備えたフレームワークとして使用できます。また、OCAMLまたは他の言語でC Bindingを使用して記述できるユーザーアプリケーションに埋め込まれたライブラリとして使用できます。また、Pythonの最小限のサポートを提供して、BAPの学習を開始しやすくします。
BAPは、CYLABのCMUで開発され、米国国防総省、シーメンス、ボーイング、フォーオールセキュア、および韓国政府からの助成金が後援しています。詳細については、スポンサーを参照してください。 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メソッドは推奨されるものです。インストールされると、次の3つのコマンドが新しく作成されたスイッチにプラットフォームをインストールする必要があります。
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をクローンし、新しいローカルスイッチを作成し、システム1を含む必要な依存関係をインストールし、最後にDuneで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}生のローダーは、オフセット、長さ、ベースアドレスなどのいくつかのパラメーターを取ります。これにより、バップが知られていないフォーマットの缶切りとして使用できるスイスナイフになります。生のローダーは、ファイルを開くすべてのコマンドに対して機能します。たとえば、 raw Loaderがdisassembleコマンドと一緒に使用されている場合、BAPは機能を自動的に識別し、コードがバイナリのどこにあるかさえ知らずに適切なCFGを構築します、
bap /bin/echo --loader=raw --raw-base=0x400000 -dバイトで手動で再生したい場合は、たとえば、手動でエンコードする命令を入力し、BAPがどのようにそれを分解し、どのセマンティクスを持っているかを確認する場合、 mc探しているコマンドです。 LLVMの対応するユーティリティに名前が付けられており、マシンコードの略で、 objdumpコマンドと同じインターフェイスを持っています。
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用語の数を追跡し、2番目のカウンターは、あらゆる用語に入るたびに増加します。 main関数はカウンターを実行して出力を印刷します。拡張機能は、bap_mainライブラリのextension.declare関数を使用すると宣言します。拡張機能は、コンテキストを受信する関数です(構成パラメーターの取得に使用できます)。この関数では、 Project.register_pass関数を使用して、 main関数をパスとして登録します。
もう少し複雑な例と、Pythonを使用する例は、私たちのチュートリアルに記載されています。
Duneを使用して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)))
上記のスニペットで大文字になっているeveythingは、プラグインの適切なプライベート名と公開名に置き換えるプレースホルダーです。 .plugin拡張機能は必要ではありませんが、良い慣習として困っていることに注意してください。
BAPは、インタラクティブなトップレベルユーティリティbaptopも出荷します。これは、OCAMLの表現をインタラクティブに評価し、その価値を印刷するシェルのようなユーティリティです。 BAPライブラリをロードして、すべてのプラグインを初期化するため、BAPの広大な世界をインタラクティブに探索できます。 baptopユーティリティは非対話型通訳者としても機能するため、OCAMLスクリプトを実行することができます。たとえば、 baptop myscript.mlまたはファイルの上部にSha-bangを使用して指定#!/usr/bin/env baptopもできます。 UTOPを使用してbaptopを構築しましたが、 ocaml自体を含む他のOCAML Toplevelを簡単に使用できます。たとえば、Vanilla ocaml Toplevelのbap.top Libraryをロードするだけです。
#use " topfind " ;;
#require " bap.top " ;;BAPは巨大であり、迷子になるのは簡単であることを理解しています。私たちは常にドキュメントの改善に取り組んでおり、BAP APIのすべての機能が徹底的に文書化されるようにしています。しかし、特に私たちの仲間の研究者やユーザーの目標がどれほど違うかを考えると、マニュアルやチュートリアルの形で高レベルのガイドラインを書くことは、はるかに難しく、非常に時間がかかります。したがって、私たちは後方を追跡するアプローチを採用しており、すべての可能な質問に早期に対処しようとするよりも、実際の質問に答えることを好みます。 Google、Archiveがインデックスを付けた検索可能な特徴を特徴とするチャットでお会いできてうれしいです。
私たちは時折、私たちのブログやWikiに書いており、誰もがそれらの両方に貢献するように奨励しています。また、StackoverFlowに質問を投稿したり、OCAMLボードでBAPについて話し合うこともできます。また、私たちのギッターよりもはるかに少ないトラフィックを持つかわいい不一致チャンネルもあります。
BAPはコミュニティによって構築されており、MITライセンスの下でそれらを共有する意思のある著者からのすべての貢献を歓迎します。分析やツールがこのリポジトリに適しているとは思わない場合(たとえば、使用が制限されていない、完全に準備ができていない、当社の基準を満たしていないなど)、メインディストリビューションに含まれるほど成熟していない有用なBAPプラグインのコレクションであるBAPプラギンリポジトリに貢献することを検討できます。または、ツールでツールキットを拡張することを検討することもできます。
もちろん、私たちのリポジトリのいずれかにあなたの作品を提出する必要はありません。 BAPはプラグインベースのフレームワークであり、コードはどこでもホストされ、ライセンス(独自を含む)を持つことができます。コミュニティで仕事を利用できるようにしたい場合は、Opam経由でリリースすることをお勧めします。
OllSecureの場合
ボーイング
DARPA VETプロジェクト
シーメンスAG
韓国政府(MSIT)(No.2015-0-00565の資金提供を受けた情報&コミュニケーション技術プロモーション研究所(IITP)助成金、IoTソフトウェアセキュリティのための脆弱性ディスカバリーテクノロジーの開発)
あなたがスポンサーになりたい場合、またはより深いコラボレーションを求めている場合は、お問い合わせください。