"call 0x80482f0 <puts@plt>" ?只需要澄清 x86 汇编中'hello world'程序中的一行代码



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

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

我正在阅读Hacking: The art of Exploitation 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, worldn");
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, worldn"存储在0x80484b0,然后该地址存储在ESP的地址中,为什么:
0x080483ce <+26>:    call   0x80482f0 <puts@plt>

指0x80482f0,而不是[esp]或只是"0x80484b0"打印"Hello, worldn"到屏幕上?我使用了GDB,我无法弄清楚0x80482f0到底引用了什么。任何帮助都将是伟大的

谢谢(请记住,我刚刚开始使用这些东西,所以我是一个新手)

也. .为了方便,我从GDB中复制并粘贴了拆解的main函数,如果您需要更多信息,请询问。如果你愿意为我解释一下这个命令,那就太好了,因为我只使用了"int 80h"来打印

之前的内容到屏幕上

0x80482f0puts函数的地址。更准确地说,它指向程序链接器表(PLT)中puts()的条目—基本上只是一堆JMP <some routine in a so-library>(比这更复杂一些,但这对于本讨论并不重要)。puts函数在堆栈上查找它的参数,即在[esp]处。

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

最新更新