首页
社区
课程
招聘
[旧帖] [求助]关于call指令与C语言中函数调用的问题 0.00雪花
发表于: 2012-9-13 22:09 1405

[旧帖] [求助]关于call指令与C语言中函数调用的问题 0.00雪花

2012-9-13 22:09
1405
之前看讲溢出的书,说c程序调用的时候是先从右向左将参数入栈,然后是返回地址,最后将EBP入栈。
可是刚才在论坛里看帖子,讲retn指令,说是返回的时候直接就pop eip了,也就是说调用之前没有将EBP入栈吗? 是不是因为 retn 与retf 不同的原因?

之前学OD的时候就是一个地方执行了retn指令后马上出错,不知道该怎么调了……然后从网上查也没找到讲retn比较详细的文章。

P.S.1.现在push/pop eip,ebp的时候都是入栈四个字节吧?也就是esp要-/+ 4 对不对?

P.S.2.呃,这个问题好像是个很基础的问题,不过就因为太基础了所以反而找不到合适的答案,所以大牛们体谅下则个~

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (3)
雪    币: 2105
活跃值: (424)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
retn 就是从栈顶pop返回地址 然后跳转  跟EBP什么的 没啥关系

你说的
push ebp
mov ebp, esp
...
pop ebp
retn
这个只是编译器生成的函数头,也可以不生成这样的
2012-9-14 11:44
0
雪    币: 285
活跃值: (16)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
3
在32位系统里,参数一般都是32位的,也就是4字节,函数返回时有好多种对堆栈 和 输入参数进行相应调整,比如 函数的 ret 改为ret 4(一个参数),或者 退出函数后 用add esp,4 指令,另外,对ebp的调整,最常规的手段就是在ret 前加上 enter指令,也就是 相当于pop ebp指令,当然,当前栈要正好指向当时push ebp的那个地址。
2012-9-14 14:38
0
雪    币: 323
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
哦,我懂了,那是编译器如何解释成汇编代码的问题。
但是单纯的retn就是pop 当前栈顶数据到eip的功能。
2012-9-15 11:18
0
游客
登录 | 注册 方可回帖
返回
//