回答編集履歴
1
スタックの動きを追加
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の順に上書きされます。
|