3

質問の前に、これは純粋に課題のためです。安全でないプログラムに不正にアクセスするつもりはありません。

入力文字列のオーバーフローを伴う割り当てがあり、ret命令によって目的のアドレスに送られます。文字列は最大 32 バイトを想定しているため、32 バイトのガベージ、さらに 4 バイトのガベージ、さらにアクセスしたいアドレスの 4 バイトを入力すると、プログラムを操作して間違った関数を呼び出すことになります。32 の後に 4 バイトのガベージを埋める理由は、文字列をオーバーフローしている関数が次のように終了するためです。

8048bc9: e8 3c ff ff ff     call 8048b0a <Gets>
8048bce: b8 01 00 00 00     mov $0x1,%eax
8048bd3: c9                 leave  
8048bd4: c3                 ret

<Gets>文字列を埋めたものです。私が正しく理解していれば、4バイトのガベージが%ebp中にポップされ、その後、基本的に行きたい関数へのジャンプとしてleave4バイトが実行されます。ret

単純な問題を解決するにはこれで十分でしたが、場合によっては、 で目的の場所にジャンプする前に追加のコードを実行する必要がありretます。retこれを行うには十分に理解していません。%eaxある値 (0x12345678 など) に設定すると言いたい場合ret、間違った関数にジャンプする必要がある命令からどのようにこれを行うことができますか?

それが重要な場合、これは32ビットとして実行されています。最初の問題は変更されないアドレスですが、後の問題はアドレスにランダムな値が追加されているため、追加の指示を行う方法を尋ねています。

4

1 に答える 1

0

harold が述べたように、解決策は、return 関数に文字列バッファーの先頭に送ってもらうことでした。

これは、文字列バッファーを 40 バイト (これは 32 ビット x86) でオーバーフローさせることで実行できます。これにより、最初の 32 バイトが文字列バッファーに格納され、4 バイトがleave命令によってポップされ、最後の 4 バイトが命令によって実行されretます。目標は、最後の 4 バイトをリトル エンディアン形式の文字列バッファーのアドレスにすることでした。命令がこれらの 4 バイトを実行した後、ret私のマシンコードは文字列バッファの先頭から実行され始めます。

于 2013-04-16T15:12:02.560 に答える