質問の前に、これは純粋に課題のためです。安全でないプログラムに不正にアクセスするつもりはありません。
入力文字列のオーバーフローを伴う割り当てがあり、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
中にポップされ、その後、基本的に行きたい関数へのジャンプとしてleave
4バイトが実行されます。ret
単純な問題を解決するにはこれで十分でしたが、場合によっては、 で目的の場所にジャンプする前に追加のコードを実行する必要がありret
ます。ret
これを行うには十分に理解していません。%eax
ある値 (0x12345678 など) に設定すると言いたい場合ret
、間違った関数にジャンプする必要がある命令からどのようにこれを行うことができますか?
それが重要な場合、これは32ビットとして実行されています。最初の問題は変更されないアドレスですが、後の問題はアドレスにランダムな値が追加されているため、追加の指示を行う方法を尋ねています。