コンピュータを悪用するために バッファ オーバーフローはどのように使用されますか?
スタックやヒープのオーバーフローを引き起こすだけで、どうやって任意のコードを実行できるのでしょうか?
プログラム メモリの一部が上書きされてはならないことは理解していますが、これがどのようにして独自のコードを実行することにつながるのかわかりません。また、サードパーティの悪意のあるコードは、ターゲット プロセッサのアセンブリ言語で記述されている必要がありますか?
コンピュータを悪用するために バッファ オーバーフローはどのように使用されますか?
スタックやヒープのオーバーフローを引き起こすだけで、どうやって任意のコードを実行できるのでしょうか?
プログラム メモリの一部が上書きされてはならないことは理解していますが、これがどのようにして独自のコードを実行することにつながるのかわかりません。また、サードパーティの悪意のあるコードは、ターゲット プロセッサのアセンブリ言語で記述されている必要がありますか?
これは、この主題に関する最も広く知られているドキュメントです:楽しみと利益のためにスタックを破壊する
ただし、「スタック オーバーフロー」はバッファ オーバーフローとは関係ありません。スタック オーバーフローは通常、クラッシュ (DoS) 以外には悪用できない不正なコードの単なるエラー ケースです。
編集:ヒープオーバーフローについても尋ねました。これは、この主題に関する優れたドキュメントです: http://www.w00w00.org/files/articles/heaptut.txt
サブルーチンにジャンプすると、スタックにはデータと戻りアドレスの両方が含まれます。戻りアドレスがあるスタックに特定のアドレスを置くことができれば、CPU を特定のメモリ位置、つまり独自のコードを配置する場所に強制的にジャンプさせることができます。それはバッファオーバーフローのためです。ヒープ オーバーフローは少し異なり、悪用するのはより困難です。
スタック オーバーフローは、スタック スペースが不足していることを示しているだけです (通常、特にカーネルではより制限されています)。
通りにある2軒の家を想像してみてください。1つはあなたの友人の家で、もう1つは3ドア下の彼の邪悪な妄想的な隣人の家です。邪悪な妄想的な隣人は決して出入りせず、彼の場所はしっかりと閉じ込められています。
さて、あなたの友達はとても信頼できる友達です。彼はあなたに何でも彼の代わりに保管させてくれます。そして、一つの壁から始めて、次々と箱を置きます。実際、彼はとても良い友達なので、壁にぶつかったかどうかを確認せずに、箱を次々と置き続け、空中を進み、最後に通りにある他の2軒の家を通り抜けて入ります。邪悪なパラノイドの隣人の家。しかし、あなたの友人は、彼があなたを好きだから(そして彼は少し素朴なので)あなたがそうしないと信じています。
ですから、あなたはあなたの信頼できる友人を利用することによって、邪悪な妄想的な隣人の家に何かを入れる機会があります。
次の用語を置き換えると、バッファオーバーフロー攻撃に類似していることがわかります。
これが成功するのは、誰かがメモリの安全な領域がどこにあるか、そして問題のプログラムに引数として何を渡さなければならないか、それが最終的に安全な領域にあることを理解して、望ましい効果を得る場合だけです。(データであろうと、悪用者のコードを実行させるコードであろうと)
サブルーチンを呼び出すとき、事実上すべての最新のプロセッサは、ローカル データ (スタック) と同じ領域に戻りアドレスをプッシュします。変数の上限をチェックしないルーチン (特に strcpy 関数) では、命令アドレスのリダイレクト (バッファー オーバーフロー) が発生する可能性があります。
void make(char *me)
{
char sandwich[4]; // local data, this is in stack. the buffer for data is too small
strcpy(sandwich, me);
puts(sandwich);
// implicit "return;" the return instruction(RET on Intel) instructs the processor to implicitly pop an address from stack then resume execution on that address
}
void main()
{
// calling a subroutine (CALL on Intel) implicitly instructs the processor to push the next instruction's address(getchar line) on stack before jumping to make.
make("Love Not War");
getchar();
puts("This will not execute. The address to next instruction(getchar) gets overwritten with Not War");
}
「また、サードパーティの悪意のあるコードは、ターゲット プロセッサのアセンブリ言語で記述されている必要がありますか?」 はい
スタック オーバーフローは、正常に実行されているプログラムから発生する可能性があります。たとえば、終了条件を見落としている再帰ルーチン (自分自身を呼び出す関数) などです。スタック領域は、スタック上の多数のローカル変数と戻りアドレスでいっぱいになります。
通常のアプローチは、悪意のあるコードをメモリのどこかに置くことです。次に、バッファ オーバーフローを作成します。ここでの魔法は、単にオーバーフローさせることではなく、既に述べたように、プログラム メモリの特定の部分が上書きされることです。スタックには変数だけでなく、関数がリターン アドレスと呼ばれる場合も含まれているため、これを悪意のあるコードのアドレスで上書きしようとします。バッファ オーバーフローが発生した関数が呼び出し元に戻るとき、関数は元の呼び出し元に戻るのではなく、悪意のあるサブルーチンに戻ります。現在実行されているコードは通常、呼び出し元のコードの特権を持っているため、悪意のあるコードよりも高い権限を持つコードでこのオーバーフローを見つけて作成しようとします (そうでない場合は、悪意のあるルーチンを直接呼び出すことでそれを行うことができます)。