了解由 objdump 创建的转储

Understanding this dump created by objdump

我对汇编语言还很陌生。我已经研究了 2 周了。 这是 objdump 生成的转储。 objdump -Mintel -d stack

00000560 <function>:
    560:    55                      push   ebp
    561:    89 e5                   mov    ebp,esp
    563:    83 ec 10                sub    esp,0x10
    566:    e8 26 00 00 00          call   591 <__x86.get_pc_thunk.ax>
    56b:    05 95 1a 00 00          add    eax,0x1a95
    570:    90                      nop
    571:    c9                      leave
    572:    c3                      ret

00000573 <main>:
    573:    55                      push   ebp
    574:    89 e5                   mov    ebp,esp
    576:    e8 16 00 00 00          call   591 <__x86.get_pc_thunk.ax>
    57b:    05 85 1a 00 00          add    eax,0x1a85
    580:    6a 03                   push   0x3
    582:    6a 02                   push   0x2
    584:    6a 01                   push   0x1
    586:    e8 d5 ff ff ff          call   560 <function>
    58b:    83 c4 0c                add    esp,0xc
    58e:    90                      nop
    58f:    c9                      leave
    590:    c3                      ret

我目前正在学习堆栈。我不确定 prolog 是否只适用于函数。我在 main 函数的第三行没有看到 sub 。不确定序言是否总是使用该模式。

我也很困惑 <__x86.get_pc_thunk.ax> 不知道是什么。

我也想知道为什么它要将 0x1a95 添加到 eax 并且我不确定它为什么选择那个数字。基本上,添加到 eax 的值是 0x1a85.

这是我用gcc编译的c。我用了 gcc -m32 -ggdb stack.c -o stack

void function(int a, int b, int c) {
  char buffer1[5];
  char buffer2[10];
}

void main() {
  function(1, 2,3 );
}

现在我试图在反汇编代码中找到 buffer1 和 buffer2。我猜 buffer1[5] 是 0x05,buffer2[10] 是 0x0a。我在反汇编代码中找不到。

数组buffer1buffer2分配在栈上,使用指令

sub esp, 0x10

它所做的是从堆栈指针的当前值减去 0x1016,即 esp,这会增加函数中的堆栈 space 16 个字节(char 是一个字节,buffer1 中有 5 个字节,buffer2 中有 10 个字节,出于对齐原因,结果四舍五入为 16 个字节, AFAIK)。 main() 中没有这样的指令,因为它没有局部变量,因此不需要堆栈 space.

(这在本书的第 4 章中有更详细的解释:http://pacman128.github.io/pcasm/