mmap相关分段故障

时间:2012-03-05 23:37:09

标签: c assembly x86 segmentation-fault mmap

我正在编写一个模拟器,我需要将机器代码直接写入内存,然后跳转到(调用)它。我用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上。

1 个答案:

答案 0 :(得分:5)

您的操作码不正确,这有效:

if(data) {
    *p++ = 0xb8; //mov $1, %eax
    *p++ = 0x01;
    *p++ = 0x00;
    *p++ = 0x00;
    *p++ = 0x00;
    *p++ = 0xC3; //ret
}

0xb8将32位立即移入eax,因此您必须指定所有4个字节。