基本上我有一组由编译过32位ELF程序二进制gcc
或llvm
。它们在分析前都被剥离。
我的问题是,给定一个二进制文件,有什么方法可以确定它是由gcc
还是编译的llvm
?有没有可用的工具来做到这一点?
基本上我有一组由编译过32位ELF程序二进制gcc
或llvm
。它们在分析前都被剥离。
我的问题是,给定一个二进制文件,有什么方法可以确定它是由gcc
还是编译的llvm
?有没有可用的工具来做到这一点?
我不是这方面的专家,但我会尝试:
查看导出的函数名称
如果存在重整,您可以将其用于编译器检测。只需列出导出的函数名称并与已知的修改方案进行比较(例如来自链接维基页面中的表格)
检查链接的 DLL
您可以通过文件名检测众所周知的RTL。
您也可以尝试查找语言/编译器引擎
现代编程语言的每个编译器的每个版本都需要有自己的引擎。它是负责堆栈、变量、控制流等内容的代码的一部分,并且对于具有相同编译器版本的每个已编译程序始终相同。
因此,在您可以找到的每个编译器中创建简单的 hello world 应用程序并提取引擎二进制文件。然后只需搜索未知的二进制文件并测试是否存在受支持的引擎。
前两个项目更多用于PE(不确定 elf 是否具有相同的信息)并且有用于此类检查的工具(例如PE/DLL explorer,因此对于 elf 应该有类似的东西)。