web-dev-qa-db-ja.com

スタックが実行可能でないときにフォーム環境変数を実行する

奇妙なことが起こった。 Egg = NOPs +シェルコードを作成しました。次に、Eggのアドレスを取得します。 enter image description here

バッファオーバーフローを起こしてそれにジャンプし、シェルを取得しました(シェルのアドレスは2番目のパラメータです)。スタックが実行可能でない場合、これはどのように可能ですか? enter image description here

2
user2779060

これは、スタック内で何も実行していないためです。問題のバイナリがないので、ここで何が起こっているのかを推測しようとします。

最初の_print "A"*268 + '\x68\x96\x04\x08'_では、おそらく_0x08049668_を指すポインタを上書きしています。このアドレスは、printf()exit()のように後で呼び出される関数の場合はおそらく GOTエントリ です。

次に、2番目の引数で、ポインターが指している値を指定します。つまり、そのGOTエントリ(_0x08049668_)をシェルコードアドレス(_0xbffff891_)で上書きします。

したがって、プログラムがその共有ライブラリ関数(exit()printf()whatever()、...)を呼び出すと、代わりにシェルコードが呼び出されます。上書きされました。

このプロセスでは、コードはスタックに配置されません。スタック内のポインタが上書きされます。それで全部です。次に、その上書きされたポインタを使用して、共有ライブラリ関数のアドレスをシェルコードアドレスで上書きします。

1
zuazo