[過去ログ] C言語なら俺に聞け 152 (1002レス)
前次1-
抽出解除 必死チェッカー(本家) (べ) 自ID レス栞 あぼーん

このスレッドは過去ログ倉庫に格納されています。
次スレ検索 歴削→次スレ 栞削→次スレ 過去ログメニュー
リロード規制です。10分ほどで解除するので、他のブラウザへ避難してください。
919: (ワッチョイ b161-JGwf) 2019/08/12(月)23:48 ID:n9pQsVg70(1)調 AAS
>>874
結論的には、ローカル変数はスタック上に確保され、スタックには関数の呼び出し
元へマシン語の ret 文で帰るための「戻りアドレス」や、以前のスタックフレームの
先頭アドレスを保存しておくために、push ebp とした際の関数の呼び出し元の
スタックフレームの ebp の値なども入ってる。
なので、ローカル変数として、TYPE a[10]; のような配列 a を確保して、
a[x] で x の範囲が 9 を超えた場合、その戻りアドレスが壊される確率がとても
高い。

1. 戻りアドレスがへんな値に書き換われば、関数から戻る際に変なアドレスに
 戻ろうとする。するとコード領域以外のデータ領域に戻ろうとしたり、
 ページングされて無い変なページに戻ろうとすることになり、保護例外
 が発生する可能性が高い。またたまたま、そのアドレスに「戻った(実際には
 戻ったわけではなく、変なアドレスに jmp しただけ)」際に、
 新しいアドレスのマシン語が変な命令に解釈されて、高い確率で
 何らかの保護冷害が発生する。

2. 関数の最後で pop ebp を実行してから、元の関数へ戻ると、
 ローカル変数は、mov [ebp+ofs],eax のような形でアクセスされる。
 だから、スタックが変に書き換わっていた場合、ebp が変なアドレスになり、
 [ebp+ofs]のアクセスの部分で保護例外が起きる。
前次1-
スレ情報 赤レス抽出 画像レス抽出 歴の未読スレ AAサムネイル

ぬこの手 ぬこTOP 0.037s