-
-
[原创]ebp并不总是局部变量和参数的参考线
-
2023-12-5 23:40
5822
-
下面是一个函数入口处的部分反汇编代码截取:
1 2 3 4 5 6 7 8 9 10 | .text: 004079C0 ; __unwind { / / __ehhandler$?update@SnakeGame@@UAEXABVTime@sf@@@Z
.text: 004079C0 push ebx
.text: 004079C1 mov ebx, esp
.text: 004079C3 sub esp, 8
.text: 004079C6 and esp, 0FFFFFFF8h
.text: 004079C9 add esp, 4
.text: 004079CC push ebp
.text: 004079CD mov ebp, [ebx + 4 ] ; [ebx + 4 ] - > ret addr
.text: 004079D0 mov [esp + 0Ch + var_8], ebp
.text: 004079D4 mov ebp, esp
|
当eip在.text:004079C0处,esp所指向的是ret addr.
当eip在.text:004079C1处,ebx 所指向的是esp-4.此时:
- ebx+4指向的是ret addr
- ebx+8 指向的是第一个参数
接下来的
1 2 3 4 | .text: 004079C3 sub esp, 8
.text: 004079C6 and esp, 0FFFFFFF8h
.text: 004079C9 add esp, 4
.text: 004079CC push ebp
|
esp实现了向下最近的8的倍数取证。比如12取整就是8,16取整就是16,18取整就是16.因为是针对栈结构地址取整,所以越是往小的方向越安全,因为对于栈结构来讲,越小的地址是没有用过的地址。所以后面的ebp,esp, ebp只能作为局部变量的索引,而对于参数的索引,用ebx比较合适。
总结:对于这个函数来讲,并不是按照套路ebp作为局部变量和函数参数的唯一参考.
阿里云助力开发者!2核2G 3M带宽不限流量!6.18限时价,开
发者可享99元/年,续费同价!
最后于 2023-12-6 08:23
被_THINCT编辑
,原因: