2

mainのリターンアドレスを上書きして、exit(0)呼び出しのこの単純なオペコードを実行しようとしています。問題は、セグメンテーション違反が発生していることです。

#include <stdio.h>

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

void main()
{
      int *ret;

      ret = (int *)&ret + 2; // +2 to get to the return address on the stack

      (*ret) = (int)shellcode;   

}

実行結果はセグメンテーションエラーになります。

[user1@fedo BOF]$ gcc -o ExitShellCode ExitShellCode.c

[user1@fedo BOF]$ ./ExitShellCode

Segmentation fault (core dumped)

これはshellcode.aのObjdumpです。

[user1@fedo BOF]$ objdump -d exitShellcodeaAss

exitShellcodeaAss:     file format elf32-i386


Disassembly of section .text:

08048054 <_start>:
 8048054:       bb 14 00 00 00          mov    $0x14,%ebx
 8048059:       b8 01 00 00 00          mov    $0x1,%eax
 804805e:       cd 80                   int    $0x80

私が使用しているシステム

fedora Linux 3.1.2-1.fc16.i686 
ASLR is disabled.
Debugging with GDB.
gcc version 4.6.2
4

5 に答える 5

2

うーん、この質問に答えるには遅すぎるかもしれませんが、受動的な構文エラーである可能性があります。シェルコードの形式が正しくないようです。つまり、次のようになります。

char shellcode[]= "/0xbb/0x14/0x00/0x00/0x00"
                  "/0xb8/0x01/0x00/0x00/0x00"
                  "/0xcd/0x80";

次と同じではありません:

char shellcode[]= "\xbb\x14\x00\x00\x00"
                  "\xb8\x01\x00\x00\x00"
                  "\xcd\x80";

この修正はこの問題の解決には役立ちませんが、NX bitStack Randomizationなどのカーネル保護メカニズムを無効にしてみましたか?

于 2012-10-18T18:59:01.957 に答える
0

このシナリオのように、バッファを次のような関数にキャストすることで、シェルコードを実行することもできます。

(*(int(*)()) shellcode)();
于 2012-07-30T13:05:08.973 に答える
0

他の2つの質問に基づいて、つまり、スタック上のリターンアドレスを決定する方法は? およびC: 関数 (mac) のアドレスを返します。正しいアドレスを上書きしていないと確信しています。これは基本的に、リターンアドレスがあなたがした方法で決定できるというあなたの仮定が原因です。しかし、最初の質問 ( 1 )への回答が述べているように、これは当てはまりません。

したがって:

  1. アドレスが本当に正しいかどうかを確認する
  2. 組み込みの GCC 機能を使用したくない場合は、正しいリターン アドレスを特定する方法を見つけてください。
于 2011-12-15T14:09:11.387 に答える