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

[原创]ebp并不总是局部变量和参数的参考线

2023-12-5 23:40
6683

下面是一个函数入口处的部分反汇编代码截取:

当eip在.text:004079C0处,esp所指向的是ret addr.
当eip在.text:004079C1处,ebx 所指向的是esp-4.此时:

接下来的

esp实现了向下最近的8的倍数取证。比如12取整就是8,16取整就是16,18取整就是16.因为是针对栈结构地址取整,所以越是往小的方向越安全,因为对于栈结构来讲,越小的地址是没有用过的地址。所以后面的ebp,esp, ebp只能作为局部变量的索引,而对于参数的索引,用ebx比较合适。

总结:对于这个函数来讲,并不是按照套路ebp作为局部变量和函数参数的唯一参考.

.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
.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

[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

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