为什么这段代码导致核心转储?

时间:2015-07-16 12:48:47

标签: linux c

我在下面有这段C代码以及我给code[]的任何价值,我得到Segmentation fault (core dump)。你知道为什么会这样吗?

char code[] = "";
int main(int argc, char **argv)
{
  int (*func)();  
  func = (int (*)()) code;  //typecast the array code to be a function pointer
  (int)(*func)();   
}

2 个答案:

答案 0 :(得分:1)

object指针转换为函数指针为undefined behaviour。简单地说,函数指针只能转换为另一个函数指针,而不能转换为对象指针,反之亦然。

请注意,现代操作系统默认保护数据内存段不被执行代码("没有执行",NX),因此您很乐意遇到访问冲突异常。

最后并非最不重要:您很可能必须链接/绑定/重新定位您的代码才能执行有用的操作。

答案 1 :(得分:-1)

您的shellcode可能是只读的,以使其可执行,您需要:

 mprotect((void *)((uint64_t)code & ~4095), 4096, PROT_READ|PROT_EXEC);