入口函数中栈的状态是什么?

逆向工程 小精灵 入口点
2021-06-22 19:40:02

我有一个 ELF 二进制文件,在入口函数中,前两条指令是:

XOR EBP, EBP
POP ESI

我很好奇在 ELF 和 PE 二进制文件(以及其他可能的情况下)的入口函数开始时堆栈的状态是什么。我原以为它是空的,但大概有东西要pop编辑。

2个回答

_start函数中argcargvenvp包含在堆栈中。

一个良好的阅读,这是Linux x86的程序启动或-如何赫克我们去main()

当您运行程序时,shell 或 gui 会调用execve()执行 linux 系统调用execve()如果您想了解更多信息,execve()则只需man execve从 shell 中键入即可它将来自所有系统调用所在的 man 的第 2 部分。总而言之,它会为您建立一个堆栈,并将其压入argcargv、 和envp文件描述 0、1 和 2 ( stdin, stdout, stderr) 留给 shell 设置它们的任何内容。加载器为您设置重定位做了很多工作,正如我们稍后将看到的,调用您的预初始化器。一切准备就绪后,通过调用将控制权交给您的程序_start()

System V Intel386 Architecture ABI Supplement 中描述了 32 位 Linux 可执行文件入口点的堆栈布局

它看起来像下面这样:

初始进程堆栈布局

因此,pop ediargc复制edi以下代码中,可能会argv为该main函数构建数组