我有一个 ELF 二进制文件,在入口函数中,前两条指令是:
XOR EBP, EBP
POP ESI
我很好奇在 ELF 和 PE 二进制文件(以及其他可能的情况下)的入口函数开始时堆栈的状态是什么。我原以为它是空的,但大概有东西要pop编辑。
我有一个 ELF 二进制文件,在入口函数中,前两条指令是:
XOR EBP, EBP
POP ESI
我很好奇在 ELF 和 PE 二进制文件(以及其他可能的情况下)的入口函数开始时堆栈的状态是什么。我原以为它是空的,但大概有东西要pop编辑。
在_start函数中argc,argv和envp包含在堆栈中。
一个良好的阅读,这是Linux x86的程序启动或-如何赫克我们去main()?
当您运行程序时,shell 或 gui 会调用
execve()执行 linux 系统调用execve()。如果您想了解更多信息,execve()则只需man execve从 shell 中键入即可。它将来自所有系统调用所在的 man 的第 2 部分。总而言之,它会为您建立一个堆栈,并将其压入argc、argv、 和envp。文件描述 0、1 和 2 (stdin,stdout,stderr) 留给 shell 设置它们的任何内容。加载器为您设置重定位做了很多工作,正如我们稍后将看到的,调用您的预初始化器。一切准备就绪后,通过调用将控制权交给您的程序_start()。
System V Intel386 Architecture ABI Supplement 中描述了 32 位 Linux 可执行文件入口点的堆栈布局。
它看起来像下面这样:
因此,pop edi将argc值复制到 edi以下代码中,可能会argv为该main函数构建数组。