奇妙なことが起こった。 Egg = NOPs +シェルコードを作成しました。次に、Eggのアドレスを取得します。
バッファオーバーフローを起こしてそれにジャンプし、シェルを取得しました(シェルのアドレスは2番目のパラメータです)。スタックが実行可能でない場合、これはどのように可能ですか?
これは、スタック内で何も実行していないためです。問題のバイナリがないので、ここで何が起こっているのかを推測しようとします。
最初の_print "A"*268 + '\x68\x96\x04\x08'
_では、おそらく_0x08049668
_を指すポインタを上書きしています。このアドレスは、printf()
やexit()
のように後で呼び出される関数の場合はおそらく GOTエントリ です。
次に、2番目の引数で、ポインターが指している値を指定します。つまり、そのGOTエントリ(_0x08049668
_)をシェルコードアドレス(_0xbffff891
_)で上書きします。
したがって、プログラムがその共有ライブラリ関数(exit()
、printf()
、whatever()
、...)を呼び出すと、代わりにシェルコードが呼び出されます。上書きされました。
このプロセスでは、コードはスタックに配置されません。スタック内のポインタが上書きされます。それで全部です。次に、その上書きされたポインタを使用して、共有ライブラリ関数のアドレスをシェルコードアドレスで上書きします。