假设库 X 是静态链接的,有没有办法以可接受的置信度知道它的函数是否在二进制文件中使用?
我目前正在使用这种方法:
- 将库函数从其反汇编转换为其抽象表示,以检索控制流结构、函数和系统调用,并按它们出现的顺序将它们保存到数据结构中。
- 对二进制文件中的每个静态链接函数重复该过程。
- 尝试找出我感兴趣的库函数的表示与二进制文件中的表示之间的相似之处。
它有效,但它可能会做得更好,而且我担心我缺少使用特定编译器设置和/或混淆的代码。例如,如果设置了一个优化标志并且两个或多个函数连接在同一块代码中,我的方法就会错过它。此外,它的时间效率并不高,当我需要针对数百或数千个库分析大型二进制文件时,这成为一个问题。
我正在考虑为整个二进制而不是单个函数生成 AST,并将其中的一部分与库函数的表示相匹配。是否有一种通用技术可以做到这一点,可能已经在公开可用的工具中实现了?有更好的主意吗?
我已经知道生成抽象表示的工具。我对匹配部分更感兴趣,或者理想情况下,对两者都做的工具更感兴趣。
编辑:来自 security.SE 的 @HamZa 提到了我 IDA FLIRT 和 Zignatures。这些对混淆/优化有效吗?
编辑 2:@HamZa 提到了在某些情况下构建 AST 的困难,并提出了一种混合方法,例如符号执行,不幸的是,它不能很好地扩展。此外,他还向我指出了这篇和这篇论文。
编辑 3:这可能是一个选项,但它不适用于闭源二进制文件(即使涵盖了某些体系结构的汇编代码)。此外,它是作为互联网服务提供的,我宁愿不通过每秒对不同图书馆进行数千次检查来取消它。