[英]mmap related segmentation fault
我正在编写一个仿真器,我需要将机器代码直接写到内存中,然后跳转到(调用)它。 我使用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上。
您的操作码不正确,可以正常工作:
if(data) {
*p++ = 0xb8; //mov $1, %eax
*p++ = 0x01;
*p++ = 0x00;
*p++ = 0x00;
*p++ = 0x00;
*p++ = 0xC3; //ret
}
0xb8正在将32位立即数移入eax,因此您必须指定所有4个字节。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.