こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

-広告-

解決済みの質問

バッファオーバーフローで疑問があります。

スタックのバッファオーバーフローで、バッファオーバーフローを起こすことで、変数領域の内容が上書きされ、さらにスタックのその他の領域(サブルーチンの戻りアドレスなど)までも書き換わってしまうとありますが、なぜそんなことが起きるのでしょうか?

私のイメージ的に、スタックの内容が以下のようだとして、

|          |
| 変数領域(B) |
|------------|
| 変数領域(A) |
|------------|
| SFP       |
|------------|
| 戻りアドレス |
|------------|
| 関数の引数  |
|------------|

バッファオーバーフローが起きたとしても上書きされるのは
変数領域A,Bだと思ったのですが、スタックには最大領域でも決まっていてそれおも超えるデータ量の場合は、領域いっぱいまですべて上書くようにでもなっているのでしょうか?

気になって仕方がありません。
どうかよろしくお願いいたします。

投稿日時 - 2013-03-20 22:11:34

QNo.8003467

困ってます

質問者が選んだベストアンサー

図の上が下位アドレス、下が上位アドレス
ということがお分かりでしょうか?
(1)スタックは下位方向に使われる。
 スタックポインタの示すアドレスより小さい
 方は未使用、大きい方が使用済みです。
 スタックを使う度にスタックポインタは減少
 します。
(2)メモリは下位から上位方向に使用される。
 変数領域Aが仮に100バイトあるとすると、
 最初の1バイト目は変数領域Bと境を接する
 所の1バイトです。

つまり、変数領域Aが100バイトだと仮定して、
ここにファイルから101バイトを読み込むと、
何処が壊れるか、もうお分かりですね。
そうです。SFPです。110バイト読み込んだら?
SFPも戻りアドレスも壊れます。

勘違いの原因は図の上下が反対ということです。

投稿日時 - 2013-03-20 23:30:23

お礼

やっとわかりました・・・。
なるほど。メモリにデータを入れる時の開始点はその変数領域の下(上位アドレス)ではなく左上(下位アドレス)から始まって指定バイト書き込んでいくのですね!

かなりすっきりしました!
今日はよく寝れそうです。

ありがとうございます!

投稿日時 - 2013-03-21 00:09:34

ANo.3

このQ&Aは役に立ちましたか?

0人が「このQ&Aが役に立った」と投票しています

-広告-
-広告-

回答(3)

ANo.2

http://www.atmarkit.co.jp/fsecurity/special/110buffer/buffer04.html
変数領域越えて戻りアドレスまで上書きされます。
そしてその戻り先は変数の中に埋め込まれた機械語のプログラムになっていて踏む台になる訳です。

投稿日時 - 2013-03-20 22:32:53

お礼

URLありがとうございます!
読ませていただきましたが、なぜ戻りアドレスまで上書きされているかの記述がなく解決できませんでした。

投稿日時 - 2013-03-21 00:00:45

-広告-

ANo.1

バッファーオーバーランで書き換えられるのは変数領域A,Bとは限りません。
変数領域(B)側が低アドレス、関数の引数側が高アドレスだとして

char A;
char B;

memset(&B, 0, 128);

が、どうなるか考えてみてください。

この辺を読むのもいいかも。
http://www.ipa.go.jp/security/awareness/vendor/programmingv1/b06_01.html

投稿日時 - 2013-03-20 22:32:07

お礼

URLありがとうございます!
読ませていただきましたが、なぜ戻りアドレスまで上書きされているかの記述がなく解決できませんでした。

投稿日時 - 2013-03-21 00:00:26

-広告-
-広告-

あなたにオススメの質問

-広告-
-広告-