これらのコード行の説明を手伝ってくれる人はいますか?
char code[] = "paste your shellcode here";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) code;
(int)(*func)();
}
ここにあるコードは、データの任意のスライスへの関数ポインターを作成して呼び出す方法の例です。
非常に単純な意味で、通常はエスケープされた 16 進値として、バイナリ シェルコード ペイロードが貼り付けられるバイト配列 (char []) を割り当てます。
この行 はint (*func)();
、整数を返す関数ポインタを宣言しています。ほとんどのコードでは、何らかの整数ベースの終了コードが EAX で返されるため、これは一般的なことです。
この行はfunc = (int (*)()) code;
、バイト配列コードを関数ポインターにキャストし、以前に定義された関数ポインターである「func」に割り当てます。
この行(int)(*func)();
は実際にシェルコードを呼び出し、実行をバイト配列の最初のメモリ位置に転送します。
このコードは実際には非常に便利です。システムの悪用に使用されるとは思わないでしょう。代わりに、このコードは、開発中にシェルコードをテスト、デバッグ、または実験するために使用されます。これを使用すると、テストしようとしているシェルコードを貼り付けて実行することができます。これにより、シェルコードを非常にシンプルに保つことができ、完全なスタンドアロン実行可能ファイルの一般的な要件をすべて除外しながら、悪用する脆弱性を特定する必要なくシェルコードをテストできます。このようにして、実際のコードを悪用しようとしたときに発生するさまざまな問題に気を取られることなく、コードが機能するかどうかを知ることができます。
「ここにシェルコードを貼り付けてください」とググってみましたか?返される最初の2 番目の結果 (この質問が最初の LOL であるため) は、Corelan Team の Exploit writing tutorial part 9: Introduction to Win32 shellcodingで、すべてが説明されています。
簡単に言えば、シェルコードをテストするための小さなユーティリティ C アプリケーションにすぎません。このシェルコードは、チュートリアルの次の部分で同じ目的で使用されます。残りはチュートリアルで説明されています。