卡内基·梅隆大学二进制分析平台(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软件安全性的脆弱性发现技术的开发)
请与我们联系,如果您想成为赞助商或正在寻求更深入的合作。