- ベストアンサー
スタックのバッファオーバーフローについて
- スタックのバッファオーバーフローによって、変数領域の内容が上書きされ、さらに他の領域(サブルーチンの戻りアドレスなど)も書き換わることがあるのはなぜでしょうか?
- バッファオーバーフローが起きると、スタックに最大領域を超えるデータが書き込まれ、変数領域だけでなく他の領域も上書きされる可能性があります。
- スタックのバッファオーバーフローは、領域いっぱいまでデータが書き込まれることで起きます。バッファオーバーフローによってデータが上書きされる仕組みについて詳しく知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
図の上が下位アドレス、下が上位アドレス ということがお分かりでしょうか? (1)スタックは下位方向に使われる。 スタックポインタの示すアドレスより小さい 方は未使用、大きい方が使用済みです。 スタックを使う度にスタックポインタは減少 します。 (2)メモリは下位から上位方向に使用される。 変数領域Aが仮に100バイトあるとすると、 最初の1バイト目は変数領域Bと境を接する 所の1バイトです。 つまり、変数領域Aが100バイトだと仮定して、 ここにファイルから101バイトを読み込むと、 何処が壊れるか、もうお分かりですね。 そうです。SFPです。110バイト読み込んだら? SFPも戻りアドレスも壊れます。 勘違いの原因は図の上下が反対ということです。
その他の回答 (2)
- yama1718
- ベストアンサー率41% (670/1618)
http://www.atmarkit.co.jp/fsecurity/special/110buffer/buffer04.html 変数領域越えて戻りアドレスまで上書きされます。 そしてその戻り先は変数の中に埋め込まれた機械語のプログラムになっていて踏む台になる訳です。
お礼
URLありがとうございます! 読ませていただきましたが、なぜ戻りアドレスまで上書きされているかの記述がなく解決できませんでした。
- wormhole
- ベストアンサー率28% (1626/5665)
バッファーオーバーランで書き換えられるのは変数領域A,Bとは限りません。 変数領域(B)側が低アドレス、関数の引数側が高アドレスだとして char A; char B; memset(&B, 0, 128); が、どうなるか考えてみてください。 この辺を読むのもいいかも。 http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_01.html
お礼
URLありがとうございます! 読ませていただきましたが、なぜ戻りアドレスまで上書きされているかの記述がなく解決できませんでした。
お礼
やっとわかりました・・・。 なるほど。メモリにデータを入れる時の開始点はその変数領域の下(上位アドレス)ではなく左上(下位アドレス)から始まって指定バイト書き込んでいくのですね! かなりすっきりしました! 今日はよく寝れそうです。 ありがとうございます!