2

私はコンピュータ セキュリティの基礎を学んでおり、私が書いたシェルコードを実行しようとしています。ここに記載されている手順に従いました

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 の出力を ac ファイルにコピーしました。

test.c:

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

しかし、これはセグメンテーション違反を引き起こします。現在、これは Arch Linux のセキュリティ対策 (?) によるものにすぎません。では、どうすればこれを機能させることができますか?

4

2 に答える 2

7

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

これを回避するには、mmap()またはmprotect()ページを割り当てたり変更したりして、PROT_EXEC権限を付与します。

于 2011-09-15T14:35:26.663 に答える
0

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

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

古いスタイルのシェルコードの記述は、セキュリティ対策のため、新しいシステムでは機能しません。また、おそらくスタック保護をオフにしてコンパイルする必要があります。

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

これは、私が 3.2.0.3 カーネル x86_64 でテストした exit システム コールを使用する完全に機能する例です。

 #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! 
于 2013-01-26T07:04:08.040 に答える