避免使用 .data 段

LuH*_*ell 0 c assembly gcc shellcode

有没有办法避免编译后的代码使用 .data 段?是否可以编写 C 代码并使用编译器选项强制所有内容都在 .text 中?我问的原因是因为我想将另一个程序的汇编代码放在堆栈中并从那里运行代码。所以如果这个程序正在使用数据段,它将不起作用。

Bre*_*dan 5

有没有办法避免编译后的代码使用 .data 段?

有多种方法 - 编写根本不使用数据的代码;使用编译器特定的扩展(例如__attribute__((section("name")))GCC 中的“ ”),编写一个链接描述文件,使输入文件.data.rodata部分中的所有内容都被推入输出文件的.text部分;有一个全新的部分叫做.myDatanot called .data,等等。

是否可以编写 C 代码并使用编译器选项强制所有内容都在 .text 中?

是的,如果您想花费数年时间编写自己的编译器等,一切皆有可能。

问题是这与权限有关。现代 CPU 允许操作系统说“此内存区域不可执行”或“此内存区域不可修改”,并由硬件强制执行以捕获错误并避免安全灾难。部分是您如何告诉操作系统权限应该是什么(例如,可执行和只读.text,不可执行和只读.rodata,不可执行和可修改.data)。通过打破它,你最终会得到比必要更糟糕的东西(检测错误的机会减少,安全灾难的机会增加)。

它还可能导致 CPU 出现性能问题(“L1 指令缓存”的一半浪费了缓存数据,“L1 数据缓存”的一半浪费了缓存指令,CPU 认为这是自修改代码,因为您在同一缓存行中写入了某些内容或与说明相同的页面)。

我问的原因是因为我想将另一个程序的汇编代码放在堆栈中并从那里运行代码。

通常堆栈是“不可执行的”,所以它可能会崩溃。要解决此问题,您可能需要特殊代码来更改堆栈使用的内存区域的权限,但是如果您可以修改其他程序来执行此操作,那么您也可以修改其他程序以直接包含程序集并避免需要愚蠢的废话。