繁体   English   中英

mmap相关分割错误

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM