assembly 如何为堆栈上的静态数组分配内存?

vojdkbi0  于 2023-10-19  发布在  其他
关注(0)|答案(1)|浏览(100)

我开始深入研究漏洞利用,使用内存等,并遇到了同样的问题。无论在哪里,内存都是按照变量在函数中声明的顺序分配给变量的,但在我的例子中,这绝对没有影响,即。在任何选项中指向数组第一个元素的指针都保持在一个位置。下面是一个示例:我有一个C代码

#include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    void myFunction() {
        char x[20];
        int a =1;
        int b= 2;
        int c = 3;
        int d = 4;
    }
    int main(int argc, char *argv[]) {
        myFunction();
    }

我编译并调试它,并输出数组x的地址值:enter image description here然后我编辑代码并在初始化d变量后声明数组:

#include <stdio.h>
  #include <stdlib.h>
  #include <string.h>
  void myFunction() {
     int a =1;`your text`
     int b= 2;
     int c = 3;
     int d = 4;
     char x[20];
  }
  int main(int argc, char *argv[]) {
     myFunction();
  }

我做的操作和上一个例子一样:enter image description here
正如你所看到的,数组在堆栈上的位置没有任何变化,你能解释一下为什么会发生这种情况吗?

kuarbcqp

kuarbcqp1#

如何为堆栈上的静态数组分配内存?
程序中定义的对象都不是静态的。它们都有自动存储时间,而不是静态的。静态对象不存储在堆栈中。
无论在哪里,内存都是按照函数内声明的顺序分配给变量的,...
这不是到处都写的,而且一般来说也不是真的。任何消息来源说这是错误的。在某些有限的情况下,例如在没有优化的情况下进行编译,这可能部分正确,但一般情况下并不正确。
正如你所看到的,数组在堆栈上的位置没有任何变化,你能解释一下为什么会发生这种情况吗?
布局器通常根据对齐要求(以及其他因素)对对象进行分组,以减少它们所需的空间总量。在本例中,编译器将所有int对象(可能有四字节对齐要求)置于first1,并将char数组(有一字节对齐要求)置于它们之后。无论定义出现的顺序如何,对位置的选择保持不变。

脚注

1这并不意味着按时间顺序排在第一位。在这种情况下,编译器似乎是在较低的地址上组织更严格对齐的对象,因此在地址顺序上是第一个,而不是在堆栈增长的方向上是第一个。可以做出其他设计选择,例如将更严格对齐的对象放在更高的地址。

相关问题