段错误.data
Segmentation fault .data
我有一个关于 "segmentation-fault" issue 的小问题,但我可以找到任何答案。
我可以在 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
这个问题其实很有趣,并提供了详细的答案here。
简而言之,在较旧的 ix86 处理器上,任何可读内存也是可执行的,并且 Linux 内核在检测到您的可执行文件 "doesn't want modern security protections".
我有一个关于 "segmentation-fault" issue 的小问题,但我可以找到任何答案。
我可以在 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
这个问题其实很有趣,并提供了详细的答案here。
简而言之,在较旧的 ix86 处理器上,任何可读内存也是可执行的,并且 Linux 内核在检测到您的可执行文件 "doesn't want modern security protections".