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

Mus*_*ker 3 elf reverse-engineering

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

gcc -o simple simple.c
Run Code Online (Sandbox Code Playgroud)

然后我为那个 ELF 二进制文件做 objdump:

objdump --disassemble-all simple
Run Code Online (Sandbox Code Playgroud)

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

Gil*_*il' 7

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

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

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

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