回答編集履歴

1

スタックの動きを追加

2019/05/07 15:12

投稿

pepperleaf
pepperleaf

スコア6383

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