2011-09-15 11 views
1

私はコンピュータセキュリティの基礎を学んでおり、私が書いたシェルコードを実行しようとしています。私は私の一時停止プログラムが動作するようになったので、ここでシェルコード実行に対するLinuxのセキュリティ対策

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 
$ 

を与えられた手順に従って、私はCファイルにobjdumpの出力をコピーしました。

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 9.1.0 – sehe

+0

@awoodlandを使ってPCを凍らせました。私は確かにNXのビットについて何も知らなかった。 exec権限(mmapを使用して)をマップする人は、http://thexploit.com/tag/shellcode/ – Ram

答えて

6

sが存在するページは、実行権限でマップされていません。 x86_64を使用しているので、ハードウェアにNXサポートがあることは間違いありません。デフォルトでは、コードとデータは非常に別々のページにあり、データには実行権限がありません。

mmap()またはmprotect()のいずれかを使用して、PROT_EXEC権限を持つページを割り当てるか変更することができます。

0

#defineを使用してシェルコードを定義することもできます。このようにして、プリプロセッサはコードを直接メインに挿入します。

セキュリティ対策のために、より新しいスタイルのシェルコードは動作しません。 あなたはまた、おそらくスタック保護を使用してコンパイルする必要がありますオフ:ここ

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; 
    } 

シェルコードは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

関連する問題