objdump 如何反汇编 elf 二进制文件

objdump 如何反汇编 elf 二进制文件

我有一个快速的问题。我使用以下代码从 ac 代码生成了 ELF 二进制文件:

gcc -o simple simple.c

然后我对该 ELF 二进制文件执行 objdump:

objdump --disassemble-all simple

我检查了我的目录,ls -a那里没有 .o 文件。我的问题仍然是如何objdump显示完整的反汇编代码?是否objdump在二进制文件中进行静态分析以覆盖所有代码?

答案1

objdump显示反汇编代码,因为这是它的工作。它知道可执行文件的格式。可执行文件不仅仅是直接的指令序列:它们具有结构。可执行文件通常以包含各种元数据的标头开始,并按部分组织。动态链接的可执行文件必须包含动态链接器所需的足够信息,因此它们必须指示可执行文件需要哪些符号以及这些符号将加载到何处的指示,以便程序在运行时可以找到它们。

例如,大多数 Unix 系统使用极低频(存在其他格式)。如果objdump检测到 ELF 二进制文件(通过检查幻数在文件的开头),它解析文件头,这让它知道程序头和节表的位置。每个部分都包含其包含的内容类型的指示。objdump根据其类型进一步解析每个部分。当它看到应该包含代码的部分时,它会对其运行反汇编程序。

反汇编原则上相当简单:代码是指令列表,反汇编只是将指令的二进制表示形式转换为文本表示形式。反汇编器只是按顺序获取指令。实际上,在指令大小可变的架构上,事情可能会更加复杂,因为数据可以嵌入到代码段中。objdump通常适用于“正常”可执行文件,但可能不会在故意混淆的二进制文件上产生合理的输出。

objdump不执行任何静态分析。它只是进行直接的解析和翻译,并没有对指令的含义进行任何分析。

答案2

objdump“GNU 实用程序”是一个使用线性扫描方法反汇编对象(也是可执行文件)的工具。这意味着它以静态方式线性解析文件并解码每条指令。然而,存在严重的局限性。 objdump 无法区分代码中的代码和数据字节,例如没有理想的规则来解码填充字节。

Objdump 通常从程序的入口点(存在于 ELF 标头中)开始并线性解码指令。下面是线性扫描算法...

在此输入图像描述

相关内容