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

以下文件>
使用gcc进行编译,然后使用objdump -d进行反汇编,最终产生172行输出。我不明白为什么会有这么多输出。

不同部分的含义是什么:

int main(void) {
  return 0;
}


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

#1 楼

我看到您将各部分与函数混在一起。

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

关于输出,尽管您的程序是“空的”,但它仍然可以成功编译和链接-为此不是错误的-放入可执行的ELF中。本文档提供了有关ELF二进制文件的结构及其操作方式的所有信息:ELF格式(PDF)。现在,如果要在二进制文件中检索节信息,请使用readelf函数可以再次为您提供帮助,您只需使用-S和目标二进制文件(readelf -S prog)进行调用。 readelf,...)及其相关文档,并开始使用简单的程序,然后再移至破解程序和更高级或模糊的二进制文件。

#2 楼

这些不是节,是二进制文件中的不同功能。这些在过程的生命周期中会被多次调用。

您感兴趣的是函数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    q4312078qx0,%eax
   9:   5d                      pop    %rbp
   a:   c3                      retq 


这里,由于未链接代码,因此只能看到函数。