在.text部分中定义只读数据的原因是什么?

Vic*_*voy 4 c++ assembly

我正在学习汇编和低级编程,并阅读有关它.据说我们可以将任何数据放在elf文件的.text部分中,但当然我们不能因为页面/段的不同权限而改变它.但是没有告诉那里,因为在.text部分内部有数据的原因是什么.许多C++程序员也告诉我g ++编译器

static const char DATA[] = "SOME DATA";
Run Code Online (Sandbox Code Playgroud)

也在.text部分内.我想知道,为什么不将这些数据放在.rodata部分,目的是什么?如果使用.text,那么.rodata中应该存储什么?

主要问题是在长模式下的这种行为.

fuz*_*fuz 9

传统上,只读数据放在文本部分中有两个原因:

  • 文本部分不可写,因此内存保护可以捕获对只读数据的意外写入,并使程序崩溃
  • 使用内存管理单元(MMU),同一进程的多个实例可以共享文本部分的一个副本(因为它保证在程序的所有实例中都相同),从而节省内存

在ELF目标上,该方案进行了一些修改.只读数据现在放在新的.rodata部分,就像.text部分一样,除了它也无法执行,防止某些攻击向量.优势仍然存在.

  • 在编译器输出中似乎确实有一个 `r--` 映射以及 `rx`(文本)和 `rw-`(数据)映射,这些映射是将代码高尔夫 hack 扔到一个文件中。但是字符串字面量与 `main` 处于同一映射中,因此它是可执行的。(我设置了一个断点并单步执行)。哦,我认为那是另一回事;页面的前 4 个字节是 `127 '\177' 69 'E' 76 'L' 70 'F'`,所以它可能是一些元数据。IDK 如果他们可以将 .rodata 放入此段。 (2认同)
  • 更新:最近版本的 `ld` 改为将 `.rodata` 链接到它自己的不可执行的 ELF 段,因此 `const char code[] = { 0xc3 };` 在转换为函数指针时不再起作用,没有`-zexecstack`。它确实*用于*“只是工作”将机器代码放入常量数组或字符串文字中。 (2认同)

归档时间:

查看次数:

341 次

最近记录:

7 年,4 月 前