次のようなコードは、シェルコードを「テスト」、つまり実行できるはずです。
char shellcode[] = "...";
int main(int argc, char **argv)
{
int (*func)();
func = (int (*)()) shellcode;
(int)(*func)();
}
ただし、これらの例を使用しようとすると、シェルコードの最初の命令でセグメンテーション違反を受け取るため、コードが実行可能ではないメモリで実行されているように見えることがわかります。
代わりにシェルコード宣言を a に変更すると#define
、シェルコードを実行できます。ただし、シェルコードは、独自のメモリに書き込もうとすると停止します (このシェルコードは、スタック上で実行されることを前提としています)。
だから私の質問は、実行可能(明らかに)および書き込み可能なメモリを想定しているシェルコードをテストする最も簡単で信頼できる方法は何ですか?コードをスタックまたはヒープに割り当ててそこにジャンプしようとすると、NX ビット保護に遭遇し、再び失敗します。明らかにNXビットを無効にすることができましたが、このテストを行うためのより良い方法はありませんか?