为什么这个shellcode会导致分段错误?

时间:2016-01-09 01:58:18

标签: c shellcode

当我运行以下代码时:

#include <stdio.h>
#include <string.h>

char code[] = "\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05";

int main()
{
    printf("len:%d bytes\n", strlen(code));
    (*(void(*)()) code)();
    return 0;
}

使用gcc编译器,我首先使用

编译
 gcc program.c -o program

当我跑步时,我遇到了分段错误。接下来,我尝试使用

进行编译
gcc -fno-stack-protector -z execstack -o test test.c

这有效,我得到了外壳。我想知道为什么我需要在编译它时才能传递这些命令。我的目标是让它工作而不必传递这些命令。我怎样才能实现这一目标?

1 个答案:

答案 0 :(得分:4)

静态存储中的可写数据(例如code数组)通常最终位于.data部分,该部分通常标记为“不可执行”。将数组标记为const,以便它最终在.rodata resp。 .text并且可以执行。

相关问题