如何查找给定的库函数是否在二进制文件中使用?

逆向工程 二元分析 静态分析
2021-07-05 09:06:06

假设库 X 是静态链接的,有没有办法以可接受的置信度知道它的函数是否在二进制文件中使用?

我目前正在使用这种方法:

  1. 将库函数从其反汇编转换为其抽象表示,以检索控制流结构、函数和系统调用,并按它们出现的顺序将它们保存到数据结构中。
  2. 对二进制文件中的每个静态链接函数重复该过程。
  3. 尝试找出我感兴趣的库函数的表示与二进制文件中的表示之间的相似之处。

它有效,但它可能会做得更好,而且我担心我缺少使用特定编译器设置和/或混淆的代码。例如,如果设置了一个优化标志并且两个或多个函数连接在同一块代码中,我的方法就会错过它。此外,它的时间效率并不高,当我需要针对数百或数千个库分析大型二进制文件时,这成为一个问题。

我正在考虑为整个二进制而不是单个函数生成 AST,并将其中的一部分与库函数的表示相匹配。是否有一种通用技术可以做到这一点,可能已经在公开可用的工具中实现了?有更好的主意吗?

我已经知道生成抽象表示的工具。我对匹配部分更感兴趣,或者理想情况下,对两者都做的工具更感兴趣。

编辑:来自 security.SE 的 @HamZa 提到了我 IDA FLIRT 和 Zignatures。这些对混淆/优化有效吗?

编辑 2:@HamZa 提到了在某些情况下构建 AST 的困难,并提出了一种混合方法,例如符号执行,不幸的是,它不能很好地扩展。此外,他还向我指出了这篇这篇论文。

编辑 3:可能是一个选项,但它不适用于闭源二进制文件(即使涵盖了某些体系结构的汇编代码)。此外,它是作为互联网服务提供的,我宁愿不通过每秒对不同图书馆进行数千次检查来取消它。

1个回答

只要能找到类似libc版本的静态库,就可以使用IDA Pro的FLIRT签名。

通常不会混淆此代码,因为将使用系统的 libc.a。可以从源代码编译 libc 并使用混淆,但这不是您通常会遇到的。

我有一个脚本(下面的链接),我用它来生成一个“.sig”文件,您可以将其放入 IDA Pro sig/pcsig/arm或任何最相关的文件)并通过.sig加载它与 FLIRT 签名File > Load File > FLIRT Signatures

在 macOS 上,目录是: /Applications/IDA Pro 7.5/ida.app/Contents/MacOS/sig/pc

加载 FLIRT 签名后,您可以从 IDA 中查找您感兴趣的任何符号。

[1]: https://gist.github.com/zachriggle/130e01cf4541615e2062ca66d1637a07