2012-03-22 12 views
15

Cのシェルコード - これはどういう意味ですか?私は本当にこのコードは、それが何をどうするか届かない

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

int main() 
{ 
    int *ret; 
    ret = (int *)&ret + 2; 
    (*ret) = (int)shellcode; 
} 

はさて、私が知っている:

int *ret; 

は、int型のポインタを設定します。 と:

ret = (int *)&ret + 2; 

RETと2バイトのアドレスを設定します(私は思う。)

しかし、私はこれが何を意味するのか取得しない:

(int *)&ret 

私は何&ret手段を知っているが、何でないか(int *)&retを意味します。 shellcodeの値をretに割り当てることによって、シェルコードをどのように実行するのですか?

UPDATE:

(int *)&ret + 2 

と::

&ret + 2 
+3

なぜそんなに多くのdownvotes ...シェルコードはかなり無害に見えます。 – FatalError

答えて

16

ある種のいくつかのマシンコードが含まれていますshellcode 'string' に の違いは何ですか。

は、へのポインタです。

割り当てret = (int *)&ret + 2;は、retを、実際の場所(またはアドレス)から2つのサイズの位置を指します。これはスタック内のアドレスであり、おそらく関数の戻りアドレス(main())がスタックに格納されている場所です。

割り当て*ret = (int)shellcode;は、シェルコードのアドレスをリターンアドレスに割り当てます。したがって、main()関数が終了すると、リターンアドレスはシェルコードになります。シェルコードは、プログラムを正常に終了する代わりに実行します。

キャストはたくさんの罪を隠しています。このコードは、ターゲット環境上でおそらく正当化されているが、必ずしも他の場所にあるとは限りません。 &ret+2(int *)&ret + 2


の違いは何ですか?

主にタイプ。これは以前に言及された多数の罪の一つです。 &retint *の代わりにタイプint **intへのポインタへのポインタ)を持ちますが、そのタイプはretです。実際のマシンではsizeof(int *) == sizeof(int **)なので、数値結果を変更することなく、キャストは単にコンパイラからの不平を吐き出すだけです(間違ったタイプのポインタをretに割り当てることについて)。

関連する問題