【问题标题】:Linux's security measures against executing shellcodeLinux 针对执行 shellcode 的安全措施
【发布时间】:2011-09-15 13:52:21
【问题描述】:

我正在学习计算机安全的基础知识,并且正在尝试执行我编写的一些 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 支持。
  • 将链接替换为指向 google 文档的“更安全”链接。你能确认它是同一份文件吗?另一个链接使用 adobe reader 9.1.0 冻结了 PC
  • @awoodland 是的!我当然对 NX 位一无所知。对于任何想要映射 exec 权限(使用 mmap)的人,说明如下:thexploit.com/tag/shellcode
  • @sehe 我无法打开您发布的链接。我已经把它恢复到原来的样子了。也许是 Adob​​e?
  • @Ram:嗯,嗯。还有什么。请发出警告?我认为发布具有 DoS 潜力的文档是不可接受的。尤其是关于 shellcode 漏洞利用的帖子。

标签: linux-kernel x86-64 archlinux shellcode


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    您也可以使用#define 来定义您的shellcode。这样预处理器会将代码直接插入到main中

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

    由于安全措施的原因,旧式的 shellcode 编写方式不适用于新系统。 您可能还必须在关闭堆栈保护的情况下进行编译:

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

    这是一个完整的示例,它使用了我在 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! 
    

    【讨论】:

    • 感谢您致力于改进档案。虽然我无法验证,但您的回答是有道理的。谢谢。
    猜你喜欢
    • 2015-05-01
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2018-02-24
    • 2014-05-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多