x86 linux 二进制文件有哪些部分?

逆向工程 部件 x86 转储
2021-06-10 21:19:03

我想学习逆向工程,所以我开始尝试编译简单的(开始)C 程序,然后阅读反汇编。

以下文件

int main(void) {
  return 0;
}

编译gcc然后反汇编objdump -d最终创建了 172 行输出。我不明白为什么有这么多输出。

不同部分的含义是什么:

0000000000400370 <_init>:
0000000000400390 <__libc_start_main@plt-0x10>:
00000000004003a0 <__libc_start_main@plt>:
00000000004003b0 <__gmon_start__@plt>:
00000000004003c0 <_start>:
00000000004003f0 <deregister_tm_clones>:
0000000000400420 <register_tm_clones>:
0000000000400460 <__do_global_dtors_aux>:
0000000000400480 <frame_dummy>:
00000000004004ad <main>:
00000000004004c0 <__libc_csu_init>:
0000000000400530 <__libc_csu_fini>:
0000000000400534 <_fini>:

当然,我一直在阅读有关调用约定和操作码的信息,因此我可以了解该部分与 C 代码的对应关系。

2个回答

我看到您将部分与功能混为一谈。

您在问题中提供的是执行 ELF 二进制文件所需的函数。例如,_start函数通常是二进制文件入口点,它可能会main在某个时刻调用该函数。您可以使用readelf -h您拥有的二进制文件获取二进制条目的地址

关于输出,尽管您的程序是“空的”,但它仍然被成功编译和链接 - 因为它没有错误 - 成为可执行的 ELF。本文档提供了您需要了解的有关 ELF 二进制文件的结构以及如何操作它的所有信息:ELF 格式(PDF)。

现在,如果您想检索二进制文件中的部分信息,该readelf函数可以再次帮助您,您只需使用-S和目标二进制文件 ( readelf -S prog)调用它

由于您刚刚开始学习,我建议您检查 binutils ( readelf, objdump, ...) 及其相关文档,并在转向破解程序和更高级或混淆的二进制文件之前开始使用简单的程序。

这些不是部分,它们是二进制文件中的不同功能。这些在进程生命周期的不同时间被调用。

您感兴趣的是 function mainobjdump -d反汇编整个二进制文件,但如果您main只想了解其中发生了什么,此时您不必查看其余部分。

当您用于gcc将二进制文件编译为可执行文件时,会调用链接器。如果您不想调用链接器,要生成目标文件,请使用gcc -c. 这是结果objdump -d test.o

$ objdump -d test.o 

test.o:     file format elf64-x86-64


Disassembly of section .text:

0000000000000000 <main>:
   0:   55                      push   %rbp
   1:   48 89 e5                mov    %rsp,%rbp
   4:   b8 00 00 00 00          mov    $0x0,%eax
   9:   5d                      pop    %rbp
   a:   c3                      retq 

在这里,由于代码未链接,您只能看到您的功能。