teratail header banner
teratail header banner
質問するログイン新規登録

回答編集履歴

1

スタックの動きを追加

2019/05/07 15:12

投稿

pepperleaf
pepperleaf

スコア6385

answer CHANGED
@@ -1,2 +1,21 @@
1
1
  セキュリティ云々じゃなくて、単に、バッファーオーバーフローが発生して、スタックの内容が壊されている。その結果、EIPより、先に、ESPが壊されただけじゃないですか?
2
- アセンブラの先頭から、スタックの動きを追えば、分かると思います。(ちと、面倒ですが)
2
+ アセンブラの先頭から、スタックの動きを追えば、分かると思います。(ちと、面倒ですが)
3
+
4
+ [追記]
5
+ ざっとですが、スタックの中身を追ってみました。
6
+ ```
7
+ スタックなので、負方向に延びます。一応、[ 00] が スタックの先頭ですが、
8
+ <+4> のところで、16バイト単位の調整が行われているの位置は正確ではありません。
9
+ [-40]: eax (printf()用) <+45>
10
+ [-3C]: eax (printf()用) <+38>
11
+ [-31 : -38]: ? <+29>
12
+ [-11 : -30]: local[32] (local[0]: [-30],,,local[31]: [-11] <+15>
13
+ [-10]: ecx (ESP+4)<+14> <+113> の popで ecxにセットされる値
14
+ <+116> でこの値から、呼び出し時のespを復元し、retしている
15
+ [-0C]: ebx <+13> <+114> の popで ebxにセットされる値
16
+ [-08]: ebp <+10> <+115> の popで ebpにセットされる値
17
+ [-04]: DWORD PTR [ecx-0x4](本来の戻りアドレス) <+7>
18
+ --- (16 byte境界に合わせる) : <+4>
19
+ [ 00]: EIP (戻りアドレス) <-- main()の呼び出し時
20
+ ```
21
+ ローカル変数 `local[32]` に 32バイト以上の書き込みを行うと、関数の終了時に、ecx, ebx, ebpの順に上書きされます。