“呼叫 0x80482f0 <puts@plt>”?只需要澄清 x86 汇编中“hello world”程序中的一行代码
Posted
技术标签:
【中文标题】“呼叫 0x80482f0 <puts@plt>”?只需要澄清 x86 汇编中“hello world”程序中的一行代码【英文标题】:"call 0x80482f0 <puts@plt>"? Just need clarification of one line of code in a 'hello world' program in x86 assembly 【发布时间】:2011-10-02 05:52:35 【问题描述】:“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, 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”将内容打印到屏幕上
【问题讨论】:
【参考方案1】:0x80482f0
是puts
函数的地址。更准确地说,它指向program linker table (PLT) 中puts()
的条目——基本上只是一堆JMP <some routine in a so-library>
s(它比a little more complex 更重要,但这对于本次讨论并不重要)。 puts
函数在堆栈上查找它的参数 - 即在 [esp]
。
您可能想知道 puts()
调用来自哪里 - 这里的编译器足够聪明,可以看到您在调用 printf()
时实际上没有使用任何格式字符串参数,并将该调用替换为调用到(稍微快一点)puts()
。如果你仔细观察,你会发现它还从你的字符串中删除了换行符,因为puts()
在打印给定的字符串后附加了一个换行符。
【讨论】:
谢谢!现在说得通了,哈哈。我只是希望这本书会这么说。感谢您提供的额外信息,我将来可能需要向您寻求建议。 非常有帮助!想知道为什么在程序集中调用 puts。谢谢!!以上是关于“呼叫 0x80482f0 <puts@plt>”?只需要澄清 x86 汇编中“hello world”程序中的一行代码的主要内容,如果未能解决你的问题,请参考以下文章