“调用 0x80482f0 ”?只需要澄清 x86 程序集中“hello world”程序中的一行代码

2024-02-14

"call 0x80482f0 <puts@plt>“?只需要 x86 汇编中“hello world”程序中一行代码的帮助。

注意:我在编程/调试时运行 ubuntu linux,使用 gcc 作为编译器,使用 gdb 作为调试器。

我在读黑客:利用的艺术 V2我编译了这个C程序:

1       #include <stdio.h>
2
3       int main()
4       {
5         int i;
6         for(i=0; i<10; i++)
7         {
8           printf("Hello, world\n");
9         }
10        return 0;

在汇编中进入该程序:

   0x080483b4 <+0>:     push   ebp
   0x080483b5 <+1>:     mov    ebp,esp
   0x080483b7 <+3>:     and    esp,0xfffffff0
   0x080483ba <+6>:     sub    esp,0x20
   0x080483bd <+9>:     mov    DWORD PTR [esp+0x1c],0x0
   0x080483c5 <+17>:    jmp    0x80483d8 <main+36>
   0x080483c7 <+19>:    mov    DWORD PTR [esp],0x80484b0
   0x080483ce <+26>:    call   0x80482f0 <puts@plt>
=> 0x080483d3 <+31>:    add    DWORD PTR [esp+0x1c],0x1
   0x080483d8 <+36>:    cmp    DWORD PTR [esp+0x1c],0x9
   0x080483dd <+41>:    jle    0x80483c7 <main+19>
   0x080483df <+43>:    mov    eax,0x0
   0x080483e4 <+48>:    leave  
   0x080483e5 <+49>:    ret

现在..我了解这个程序的每个部分,直到它:

   0x080483ce <+26>:    call   0x80482f0 <puts@plt>

我不明白的是..如果“Hello, world\n”存储在 0x80484b0,然后该地址存储到 ESP 的地址中,为什么:

0x080483ce <+26>:    call   0x80482f0 <puts@plt>

引用 0x80482f0,而不是 [esp] 或者只是“0x80484b0”来将“Hello, world\n”打印到屏幕上?我使用了 gdb,但我无法弄清楚 0x80482f0 到底引用了什么..任何帮助都会很棒

谢谢(记住,我刚刚开始接触这些东西,所以我是个菜鸟)

另外..为了方便起见,我从 gdb 复制并粘贴了反汇编的 main 函数,如果您需要更多信息,请询问。如果你想为我解释一下这个命令,那就太好了,因为我之前只使用过“int 80h”来将内容打印到屏幕上


0x80482f0是地址puts功能。更准确地说,它指向的条目puts() in the 程序链接表 http://www.iecc.com/linker/linker10.html(PLT) - 基本上只是一堆JMP <some routine in a so-library>s (it's 稍微复杂一点 http://shorestreet.com/why-your-dso-is-slow除此之外,但这对于本次讨论并不重要)。这puts函数在堆栈上查找其参数 - 即,在[esp].

你可能想知道那在哪里puts()调用来自 - 这里的编译器足够聪明,可以看到您在调用中实际上没有使用任何格式字符串参数printf(),并将该调用替换为对(更快一些)的调用puts()。如果您仔细观察,您会发现它还从字符串中删除了换行符,因为puts()在打印给定的字符串后附加一个换行符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

“调用 0x80482f0 ”?只需要澄清 x86 程序集中“hello world”程序中的一行代码 的相关文章

随机推荐