有没有一种实用的方法来查找原始二进制文件(例如固件映像)是否具有符号表?寻找开始还是结束呢?如果它存在,它是单个块还是可以将多个块与另一个数据分开?
如何确定二进制是否有符号表
逆向工程
拆卸
固件
符号
2021-06-16 08:18:04
2个回答
我使用了某些类型的符号表。所有这些类型都非常不同,不能定义为允许自动检测的东西。它可以是某种元组列表,例如(指向名称的指针、类型、指向对象的指针、[别的东西])。还有很多其他变体。每当我成功识别符号表时,它都是通过手动检查分析的转储来完成的。
我找到这样的符号表的方法如下(假设 IDA 没有自动找到它):
1 - 查找二进制文件中的所有字符串,对它们进行排序并检查结果。如果您看到很多潜在的对象名称(函数名称、全局变量名称等),您可能会怀疑您可以使用它,并且二进制文件中可能存在符号表。
2 - 从集合中选择一些字符串。检查对它们的引用。如果您在看起来像结构数组或任何其他常规数据结构的东西中发现这些引用,则它可能是您的符号表。
3 - 当您了解符号表的结构时,您可以使用简单的 IDAPython 脚本重命名您的对象。
正如第一条评论中指出的那样:固件可能具有自定义格式,因此没有通用的方法可以从中提取符号表。但是,您可以使用 .elf 二进制文件从 ELF 二进制文件中提取调试符号objcopy
。该命令应类似于:
objcopy --only-keep-debug binary_file output_file_with_debug_symbols
如果您检查 ,output_file_with_debug_symbols
您将看到哪些是二进制文件中的符号。这是确定 ELF 二进制文件是否具有符号表的方法。
通过使用dhex比较 binary_file 和 output_file_with_debug_symbols,您可以看到二进制文件中调试符号开始的位置不是固定的。但是,就我而言,大多数调试符号都位于二进制文件的末尾。
调试符号似乎也不是连续块。在看似随机的位置存在一些短字节序列,它们在二进制文件和调试符号文件中是不同的。因此,我认为您不能通过简单地从索引开始并复制每个字节直到二进制文件中的某个结束索引来提取符号。