2011-09-15 178 views
1

我正在学习计算机安全的基础知识,我试图执行一些我编写的shellcode。我跟着Linux的安全措施反对执行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(?)的安全措施。那么我怎么才能使这个工作?

+1

可能的页面's'住在没有被映射与执行权限?既然你是x86_64,你肯定有NX硬件支持。 – Flexo

+0

通过“安全”链接替换为Google文档的链接。你能证实它是同一份文件吗?其他链接冻结使用Adobe Reader的PC 9.1.0 – sehe

+0

@awoodland正确的你!我当然不知道有关NX位的信息。对于任何想要映射exec权限的人(使用mmap),说明如下:http://thexploit.com/tag/shellcode/ – Ram

回答

6

居住在页面s未映射执行权限。由于您使用的是x86_64,因此您肯定有NX硬件支持。默认情况下,这些日子代码和数据存在于非常分离的页面中,数据没有执行权限。

您可以通过mmap()mprotect()来解决此问题,以分配或更改页面以获得PROT_EXEC权限。

0

你也可以使用#define来定义你的shellcode。通过这种方式,预处理器会直接将代码插入到主

#define SHELLCODE "\x31\xc0\xb0\x1d\xcd\x80" 
    int main() 
    { 
    (*(void(*)())SHELLCODE)(); 
    } 

写的shellcode上,因为安全措施新系统不起作用的老式。 您还可能有堆栈保护编译关闭:

gcc -z execstack -fno-stack-protector shellcode.c -o shellcode 

下面是一个使用exit系统调用,我已经在3.2.0.3内核x86_64的测试工作的完整示例:

#include<stdio.h> 

#define SHELLCODE "\x48\xc7\xc0\x3c\x00\x00\x00\x48\xc7\xc7\xe7\x03\x00\x00\x0f\05" 

    main() 
    { 
    int (*function)(); 

    // cast shellcode as a function 
    function = (int(*)())SHELLCODE; 

    // execute shellcode function 
    (int)(*function)(); 
    return 0; 
    } 

shellcode使用64位寄存器,所以它不适用于32位机器。 要验证代码工作,你可以用strace的测试:

strace shellcode 
execve("./shellcode", ["shellcode"], [/* 38 vars */]) = 0 
.... 
munmap(0x7ffff7fd5000, 144436)   = 0 
_exit(999)  <---- we passed 999 to exit, our shellcode works! 
+0

我很感谢你致力于改进档案。虽然我无法验证,但您的答案是有道理的。谢谢。 – Ram