我需要获得ELF二进制文件的总数


函数调用指令
条件跳转(分支)指令

二进制文件可以是任何CPU体系结构,例如x64,ARM,MIPS,摩托罗拉68K等。

最好使用反汇编工具提供中间表示/语言。

我发现有几种候选选项,例如IDA Pro,Binary Ninja,Radare2,Capstone,Angr和Bap。

最后感觉Radare2是实现该功能的好工具。
但是我在Internet上搜索,大多数教程都显示了如何研究特定功能(例如main)的特定代码。 br />如何在拆卸后直接获得整个IR(称为ESIL)?

或对完成此任务有何建议?

#1 楼

您还可以使用Ghidra脚本执行此操作:


使用InstructionIterator遍历指令,


使用FlowType获得指令的getFlowType()


使用Ghidra的isCall()isConditional()方法


Ghidra是免费的开放源代码,这种方法适用于各种体系结构。

#2 楼

您可以使用angr及其IL-vex来完成此操作。

一般的逻辑是:


从二进制文件创建angr项目。
创建angr cfg。
在所有cfg节点上运行。
从cfg节点获取每个指令的vex表示。
在每个指令表示上,检查其jumpkind。例如,无论CPU架构如何,'Ijk_Call'都是一个呼叫。


#3 楼

实际上,这是一个非常有趣的问题,有多种选择,所有选择都需要解决。我对ELF(主要是Windows)不是很熟悉,但是无论如何文件格式都不会有任何不同。在许多情况下,进行静态分析即可对可从文件格式中检索的代码节进行爬网,并使用反汇编程序库(例如DiStorm)就足够了。为此,您需要足够聪明的东西来跳过代码中的过去数据(即嵌入式跳转表)。符号执行是另一种选择,但是如果您依赖某些动态值来混淆控制流分支会发生什么呢?然后,在将完全垃圾扔入代码中(这需要跳过所有代码)方面,还有进一步的混淆。您还可以使用运行时调试,这当然有其自身的缺陷,即仅对以下已执行分支的限制,速度和逃避检测。我想说,在大多数情况下,最简单的解决方案是编写自己的静态分析工具或利用IDA脚本之类的优势。假设您的大多数目标基本没有混淆,那么这应该是一种有效且几乎通用的工具(按CPU实现)。如果您的目标受到保护,则类似angr的东西可能更适合您的需求。如果您要处理虚拟化,那么这是一个完全不同的问题,应该自己回答。

评论


您是说目标受到保护是什么意思?此外,是否有任何方法可以混淆动态值?

–我不知道
19-10-12在4:02

因此,您本质上想要的是用二进制代码构建代码的控制流图(CFG)。实际上只有两种方法可以做到这一点-静态或动态。使用静态方法(特别是使用反汇编程序库处理所有代码段,跳过代码中的数据等)是最快,最简单的实现方式。但是,如果目标受到保护(即混淆,虚拟化等),则静态分析通常会完全中断,因为有太多情况会破坏反汇编程序。

–Pickle Rick
19-10-13在0:37