了解由objdump创建的转储

时间:2019-06-19 14:33:07

标签: assembly x86 objdump

我对汇编语言非常陌生。我已经研究了两个星期。 这是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是否仅适用于函数。我在主函数的第三行上没有看到sub。不确定prolog是否始终使用该模式。

我对<__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。我在反汇编代码中找不到它。

1 个答案:

答案 0 :(得分:2)

使用指令

将数组buffer1buffer2分配到堆栈上
sub esp, 0x10

这是从堆栈指针的当前值(即0x10)中减去16esp,这会使函数中的堆栈空间增加16个字节({ 1}}是一个字节,char中有5个字节,buffer1中有10个字节,由于对齐的原因,结果将四舍五入为16个字节,即AFAIK)。 buffer2中没有这样的指令,因为它没有局部变量,因此不需要堆栈空间。

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