mmap相关分段故障

xor*_*ema 0 c x86 assembly mmap 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;
}
Run Code Online (Sandbox Code Playgroud)

那个例子产生了问题.救命?

编辑:我应该提到我在Linux 2.6,x86上.

Tob*_*gel 5

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

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

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