【发布时间】:2019-02-19 22:01:02
【问题描述】:
我正在开发这个 c 程序。我在 64 位 x64 linux 上用 gcc 编译它:
#include <stdio.h>
char buffer[]={0x90,0x90,0xC3};
int main(int argc, char *argv[])
{
void (*fct)();
fct=buffer;
fct();
return 0;
}
0x90 操作码是 NOP
0xC3 操作码为 RET
我想知道我应该怎么做才能运行这个程序。运行时出现段错误...
谢谢
【问题讨论】:
-
.data部分可能无法执行。使用const char buffer将其放入.rodata部分,即(因为它作为文本段的一部分链接)。 -
谢谢,但它不起作用
-
const char buffer[] = {...};对我有用,无论是否优化:godbolt.org/z/0lMuL9。我在我的桌面上运行它,它没有出错就退出了。你做了什么不同的事情导致它不起作用? -
更新:最近的
ld版本将.rodata放在不可执行的页面中,大概是为了减少数据作为ROP / Spectre gadgets 的暴露。
标签: assembly memory-management x86 reverse-engineering