【问题标题】:Understanding this dump created by objdump了解 objdump 创建的这个转储
【发布时间】:2019-06-19 14:33:07
【问题描述】:

我对汇编语言很陌生。我已经研究了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。不确定 prolog 是否总是使用该模式。

&lt;__x86.get_pc_thunk.ax&gt; 我也很困惑,不知道是什么。

我也想知道为什么它将 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。我在反汇编代码中找不到。

【问题讨论】:

  • 您不会将它们用于任何事情。此外,您没有启用优化。此外,您似乎正在生成与位置无关的代码,这就是 get_pc_thunk 的意义所在。编写一些实际执行某些操作并启用优化的合理代码。如果您不关心位置独立性,请禁用它以获得更具可读性的输出。
  • 我将添加 -O 和 -no-pie 谢谢你的建议。我还在学习。我做了这样的例子来了解堆栈是如何工作的。

标签: assembly x86 objdump


【解决方案1】:

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

sub esp, 0x10

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 2011-10-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多