在 malloc 调用之后,eax 存储在堆栈或内存中的哪个地址?

逆向工程 艾达 反编译 调试器 数据库 转储
2021-06-18 15:42:39

这是我的objdump -d带有 malloc 调用和周围代码的片段。这个二进制文件被剥离了。

dbgLab.bin:     file format elf32-i386


080483d0 <malloc@plt>:
 80483d0:   ff 25 04 a0 04 08       jmp    *0x804a004
 80483d6:   68 08 00 00 00          push   $0x8
 80483db:   e9 d0 ff ff ff          jmp    80483b0 <printf@plt-0x10>


Disassembly of section .text:


 804853e:   55                      push   %ebp
 804853f:   89 e5                   mov    %esp,%ebp
 8048541:   83 e4 f0                and    $0xfffffff0,%esp
 8048544:   83 ec 20                sub    $0x20,%esp
 8048547:   c6 44 24 1f cf          movb   $0xcf,0x1f(%esp)
 804854c:   c7 04 24 0d 00 00 00    movl   $0xd,(%esp)
 8048553:   e8 78 fe ff ff          call   80483d0 <malloc@plt>
 8048558:   89 44 24 18             mov    %eax,0x18(%esp)
 804855c:   83 7d 08 02             cmpl   $0x2,0x8(%ebp)
 8048560:   7f 0c                   jg     804856e <strncmp@plt+0x12e>
 8048562:   c7 04 24 ff ff ff ff    movl   $0xffffffff,(%esp)
 8048569:   e8 92 fe ff ff          call   8048400 <exit@plt>
 804856e:   8b 45 0c                mov    0xc(%ebp),%eax
 8048571:   83 c0 04                add    $0x4,%eax
 8048574:   8b 00                   mov    (%eax),%eax
 8048576:   c7 44 24 08 0d 00 00    movl   $0xd,0x8(%esp)
2个回答

调用malloc返回eax寄存器 on x86raxonx86_64r0on中已分配内存的地址ARM没有任何东西被压入堆栈。检查调用后的行malloc& 你就会明白!您也应该检查平台的调用约定。

假设你的代码中有这个:

      int *p = malloc(sizeof(int) * 4);

如果您将此行翻译成汇编,您将得到以下内容:

      call   80483d0 <malloc@plt>
      mov    %eax,0x18(%esp)

malloc调用返回eax分配的内存块的地址。在 C 代码中,这个地址被分配给p一个位于堆栈上的局部变量。这就是以下组件的功能:mov %eax,0x18(%esp)

通常,返回值存储在eax. 结构和花车/双打可能是例外,这取决于ABI与使用的编译器,但是malloceax是的返回值。所以在堆栈上无处可去

在您的具体情况下:

 8048553:   e8 78 fe ff ff          call   80483d0 <malloc@plt>
 8048558:   89 44 24 18             mov    %eax,0x18(%esp)

eax寄存器存储在堆栈中,位于堆栈指针“上方”24(十六进制18)字节的某个局部变量中。无法从objdump.

下次请尝试以更易于理解的方式提出您的问题 - 例如“我调用 malloc 的函数将结果存储在某处,该指令有什么作用?” 并仅发布相关代码。