首页
社区
课程
招聘
[原创]ebp并不总是局部变量和参数的参考线
2023-12-5 23:40 5822

[原创]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编辑 ,原因:
收藏
免费 2
打赏
分享
最新回复 (5)
雪    币: 2129
活跃值: (4201)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
默NJ 2023-12-6 08:41
2
0
gcc有个编译参数可以使esp不再作为帧指针使用
雪    币: 20015
活跃值: (29561)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-12-6 09:59
3
1
感谢分享
雪    币: 3138
活跃值: (2861)
能力值: ( LV8,RANK:120 )
在线值:
发帖
回帖
粉丝
dayday向上8 2 2023-12-8 11:14
4
0
MSVC编译器有个/OY选项,是否省略帧指针(FPO),只针对编译32位代码有效,64位默认已经不将RBP作为帧指针使用
雪    币: 3639
活跃值: (7970)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-12-8 13:38
5
0
默NJ gcc有个编译参数可以使esp不再作为帧指针使用
谢谢大佬,长见识了。
雪    币: 3639
活跃值: (7970)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
_THINCT 2023-12-8 13:41
6
0
dayday向上8 MSVC编译器有个/OY选项,是否省略帧指针(FPO),只针对编译32位代码有效,64位默认已经不将RBP作为帧指针使用
谢谢大佬,最近也是感悟到需要代码具体分析,记住这种形式上的套路能加快读代码的速度,但是真要搞懂函数的调用堆栈,还是要做到心中清晰的知道栈的情况。比如昨天看一个函数,其实函数只有一个传值参数,却有两个push,因为一个值分两次压栈导致的。所以记这种push来判断函数个数是不可靠的。
游客
登录 | 注册 方可回帖
返回