[過去ログ] 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