2013-02-07 51 views
1

我坐在英特尔MacOSX 10.6上,并在引擎盖下使用GCC 4.2.1。我试图做的是分配一个缓冲区,用机器指令填充它并运行它。所有在一个单一的程序。在运行时生成机器指令的Hello世界代码?

例如,

typedef unsigned char byte_t; 

int main(int argc, char** argv) { 
    byte_t* code = new byte_t[3]; 
    code[0] = 0x90; // NOP 
    code[1] = 0xC9; // LEAVE - tried also without this. 
    code[2] = 0xCB; // RET far - tried also 0xC3, the near return. 
    ((void (*)(void)) code)(); 
    return 0; 
} 

失败消息总线错误。我在这里做错了什么?

+1

某种执行预防。出于安全原因,您的'code'字节数组所在的内存部分被标记为不可执行。 – us2012

+0

除了@unwind提到的主要问题之外,删除'LEAVE',它用于清理堆栈帧,并且如果没有帧设置,将会破坏'EBP'&'ESP',并且您想使用'RETN '(操作码0xC3)而不是'RETF'。 – Necrolis

+0

在StackOverflow上有一些自我修改的代码问题,其中一些具有工作示例。你在这里要做的是执行数据而不是代码,所以操作系统自然会阻止你这样做。 –

回答

5

对于代码执行,内存不被视为“安全”,因此操作系统会阻止它。

调查使用mmap()来分配内存,并使用PROT_EXEC要求内存可执行。

相关问题