gpt4 book ai didi

c - "Segmentation fault"同时执行动态 malloc 代码

转载 作者:太空宇宙 更新时间:2023-11-04 03:01:03 25 4
gpt4 key购买 nike

我在 x86_64 上写了一个示例代码,尝试动态执行 malloc 代码。有一个

Program received signal SIGSEGV, Segmentation fault. 0x0000000000601010 in ?? ()

0x0000000000601010 是 bin 的位置,谁能告诉我为什么?谢谢!!

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
#include <sys/mman.h>
volatile int sum(int a,int b)
{
return a+b;
}

int main(int argc, char **argv)
{
char* bin = NULL;
unsigned int len = 0;
int ret = 0;
/*code_str is the compiled code for function sum.*/
char code_str[] ={0x55,0x48,0x89,0xe5,0x89,0x7d,0xfc,0x89,
0x75,0xf8,0x8b,0x45,0xf8,0x03,0x45,0xfc,0xc9,0xc3};
len = sizeof(code_str)/sizeof(char);
bin = (char*)malloc(len);
memcpy(bin,code_str,len);
mprotect(bin,len , PROT_EXEC | PROT_READ | PROT_WRITE);
asm volatile ("mov $0x2,%%esi \n\t"
"mov $0x8,%%edi \n\t"
"mov %1,%%rbx \n\t"
"call *%%rbx "
:"=a"(ret)
:"g"(bin)
:"%rbx","%esi","%edi");

printf("sum:%d\n",ret);
return 0;
}

最佳答案

切勿在不检查系统函数返回的情况下使用此类技巧。我的 mprotect 手册页特别指出:

   POSIX  says  that  the  behavior of mprotect() is unspecified if it
is applied to a region of memory that was not obtained via mmap(2).

所以不要对 malloced 缓冲区执行此操作。

还有:

  • 缓冲区大小只是 sizeof(code_str),没有理由除以 sizeof(char)(保证为 1,但事实并非如此)不要让它正确)。
  • 无需强制转换 malloc 的返回值(如果您将其更改为 mmap)。
  • code_str 的正确类型是 unsigned char 而不是 char

关于c - "Segmentation fault"同时执行动态 malloc 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11814367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com