14

シェルコードをテストするためのこのコードがありますが、理解できないので、誰か説明してもらえますか?

アセンブリ シェルコードのことは忘れて、理解したいのは C コードです。

char shellcode[] = "...";

int main(int argc, char **argv)

{

int (*func)();

func = (int (*)()) shellcode;

(int)(*func)();

}

つまり何もかも、空()とは何か、初心者に説明するように説明してください。

4

2 に答える 2

16
int (*func)();

関数ポインタの宣言です。関数ポインタは基本的に、関数のアドレスを保持する変数です。この場合、 をfunc指す関数の型は、引数を取らず、 を返す関数ですint。次のように、関数のアドレスをこの変数に割り当てることができます。

func = foo;

fooプロトタイプを持つ関数はどこにありますかint foo();

関数がこの変数に割り当てられると、次のfuncように指す関数を呼び出すことができます。

(*func)();

別の構文 (同等) がありますが、これはより明確だと思います。

func();

したがって、fooが に割り当てられた場合func、上記の両方の例では実際に関数 が呼び出されますfoo

値を関数ポインターにキャストすることもできます。コード例では

(int (*)())

引数を取らず、 を返す関数ポインタへのキャストintです。これは、本質的に achar*を関数 pointer に代入することについてコンパイラが文句を言わないようにするためfuncです。

上記のコードには、最後に 1 つのことがあります。が呼び出された後func、結果は (何らかの理由で) にキャストされますint。私が知る限り、このキャストはまったく不要です。だから最後の行

(int)(*func)();

で置き換えることができます

(*func)();
于 2010-05-09T15:15:03.333 に答える
3

int (*func)();は戻り値の型を持つ関数へのポインターの定義でありint、関数ポインターに(アセンブラー バイトコード、CPU が実行する命令)func = (int (*)()) shellcode;へのアドレスを割り当て、引数を渡さずにそのアドレス (アセンブラー命令) で関数を呼び出します。 . たとえば、アセンブラー命令は名前( No Operation) があり、何もしません。他のアセンブラー命令は、実行しているシステムに応じて異なることを行います。shellcode[](int)(*func)();()\x90NOP

于 2010-05-09T14:51:27.173 に答える