为什么这个 x64 堆栈有其他字节并且似乎是相反的顺序?

逆向工程 C 数据库
2021-07-02 14:49:26

我写了下面的小 C 程序,你也可以在截图中看到堆栈。C栈我的问题是双重的:

  1. 为什么在 3 个堆栈字符串之间有一整行其他数据?
  2. 为什么我的第一个堆栈字符串实际上在堆栈顶部?我想如果我连续有 3 个堆栈字符串,那么在 C 程序中首先出现的字符串将位于堆栈底部,而最后一个推送的字符串将位于顶部。
1个回答

为什么在 3 个堆栈字符串之间有一整行其他数据?

首先,在x64Linux 代码中,堆栈应该16在任何函数调用之前字节对齐,因此您可以预期rsp在编译器生成的代码中将如此对齐。

现在,这只是编译器决定将用于项目分配的字节数。在GCC,例如,你可以设置堆栈项目的权力的对齐n2,使用-mpreferred-stack-boundary=n的选项,根据公认的答案

为什么我的第一个堆栈字符串实际上在堆栈顶部?我想如果我连续有 3 个堆栈字符串,那么在 C 程序中首先出现的字符串将位于堆栈底部,而最后一个推送的字符串将位于顶部。

同样,只要生成符合C标准的代码,编译器将决定如何在堆栈上组织局部变量我同意,自然的方法是将参数按声明的顺序放在堆栈上,但如您所见,您不能一般地假设这一点。如果你想强制这个顺序,你可以根据这个答案把它们放在一个结构中