我正在学习计算机安全性的基础知识,并试图执行一些我编写的shellcode。我按照这里给出的步骤

http://dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf

http://webcache.googleusercontent.com/search?q=cache:O3uJcNhsksAJ:dl.packetstormsecurity.net/papers/shellcode/own-shellcode.pdf+own+shellcode&cd=1&hl=nl&ct=clnk&gl=nl

$ cat pause.s
xor %eax,%eax
mov $29,%al
int $0x80
$ as -o pause.o pause.s
$ ld -o pause pause.o
ld: warning: cannot find entry symbol _start; defaulting to <<some address here>>
$ ./pause
^C
$ objdump -d ./pause
pause:     file format elf64-x86_64
Disassembly of section .text:
      08048054 <.text>:
      8048054: 31 c0     xor    %eax,%eax
      8048056: b0 1d     mov    $0x1d,%al
      8048058: cd 80     int    $0x8
$


由于我有了暂停程序,所以我将objdump输出复制到了c文件中。

test.c:

int main()
{
    char s[] = "\x31\xc0\xb0\x1d\xcd\x80";
    (*(void(*)())s)();
}


但这会产生段错误。现在,这只能归因于Arch Linux(?)的安全措施。那么我怎样才能使它工作呢?

最佳答案

s所在的页面未映射到执行权限。由于您使用的是x86_64,因此您肯定在硬件方面获得了NX支持。默认情况下,这些天的代码和数据位于非常独立的页面中,数据没有执行权限。

您可以使用mmap()mprotect()解决此问题,以分配或更改页面以具有PROT_EXEC权限。

关于linux-kernel - Linux针对执行Shellcode的安全措施,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/7431986/

10-11 22:53