【发布时间】:2012-03-05 23:37:09
【问题描述】:
我正在编写一个模拟器,我需要将机器代码直接写入内存,然后跳转到(调用)它。我用 mmap 分配内存,然后将代码写入它。除了“ret”或“nop”指令段错误之外的任何内容。我知道 mmap 返回时不会出错,并且我已经在一个示例中隔离了这个问题,以说明这个问题。
#include <stdio.h>
#include <sys/mman.h>
#include <stdint.h>
int main()
{
uint8_t *data = mmap(NULL, 3 * sizeof(uint8_t), PROT_EXEC|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0), *p;
p = data;
if(data) {
*p++ = 0xb8; //mov $1, %eax
*p++ = 0x01;
*p++ = 0xC3; //ret
} else
perror("mmap");
uint8_t (*fp)();
fp = (void*) (data);
printf("%u\n",(uint8_t) fp());
return 0;
}
这个例子产生了问题。帮忙?
编辑:我应该提到我在 Linux 2.6、x86 上。
【问题讨论】:
-
你确定你的操作码是正确的吗? mov %1, eax 至少占用 5 个字节,立即数占用 4 个字节。
-
在许多系统上,
PROT_EXEC不允许使用PROT_WRITE。你需要先使内存读/写,然后使用mprotect将权限更改为读/执行。
标签: c assembly x86 segmentation-fault mmap