【问题标题】:Segmentation fault .data分段错误.data
【发布时间】:2015-03-24 10:26:35
【问题描述】:

我有一个关于“分段错误”问题的小问题,但我可以找到任何答案。

我可以在 gcc 编译时停用堆栈保护,选项 [-fno-stack-protector] -z execstack:

GNU_STACK 0x0000000000000000  **RWE**    10
-->
GNU_STACK 0x0000000000000000  **RW**     10

但是:对我来说,.data 部分不是GNU_STACK 部分! (我错了吗?)

所以,我不明白为什么在一种情况下我可以执行 .data 部分中的 shellcode,而在另一种情况下却不能!

如果有帮助的话:

JC@ubuntu:~$ cat testShellcode2.c

    char bytecode[] = "\x48\x31\xc0\x48\x31\xff\x48\x31\xf6\x48\x31\xd2\x52\xeb\x15\x48\x8b\x3c\x24\x48\x89\xe6\xb0\x3b\x0f\x05\x48\x31\xc0\x48\x31\xff\xb0\x3c\x0f\x05\xe8\xe6\xff\xff\xff\x2f\x62\x69\x6e\x2f\x73\x68";

    int main(){
        int (*ret)() ;
        ret = (int(*)()) bytecode;
        ret();
    }


JC@ubuntu:~$ cp testShellcode2.c testShellcode3.c

JC@ubuntu:~$ gcc -fno-stack-protector -z execstack testShellcode2.c -o testShellcode2

JC@ubuntu:~$ gcc testShellcode3.c -o testShellcode3

JC@ubuntu:~$ ./testShellcode2
$ exit

JC@ubuntu:~$ ./testShellcode3
Segmentation fault (core dumped)

JC@ubuntu:~$ readelf -a testShellcode2 > elf2

JC@ubuntu:~$ readelf -a testShellcode3 > elf3

JC@ubuntu:~$ diff elf2 elf3

                  0x0000000000000000 0x0000000000000000  RWE    10

                  0x0000000000000000 0x0000000000000000  RW     10

【问题讨论】:

  • 在这两种情况下,字节码字符串都在 .data 段中。
  • 请注意,-z execstack 是一个链接器标志,并且所描述的行为是特定于 Linux 的。可能您想用linux 替换gcc 标签。

标签: gcc segmentation-fault stack elf


【解决方案1】:

这其实是个有趣的问题,详细解答here

简而言之,在较旧的 ix86 处理器上,任何可读内存也是可执行的,当 Linux 内核检测到您的可执行文件“不需要现代安全保护”时,它会为您提供这种行为。

【讨论】:

  • 这确实是 Linux 特有的行为。在具有可执行堆栈的 FreeBSD 上,不会影响默认内存保护,.data 仍然不可执行。
猜你喜欢
  • 2016-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
相关资源
最近更新 更多