retn 指令理解

在破解的时候,我想在一个call的头部直接返回,如何判断到底是使用retn、retn 4还是retn 0C......
是看call头部的代码吗??
我知道的只是retn xx的结果是在ESP上+xx,可似乎有时候我都用retn也没什么关系,这是为什么?

UD]Arthas
2008-04-19, 16:24:43
使用retn,
因为你说的是在call的头部返回,也就是被调用过程的第一条指令处返回(我没有曲解你的意思吧)。
这是还没有分配局部变量,也没有往堆栈中压入数值,那么esp指令指向的依然是call指令的返回地址,所以你直接返回就可以了,使用retn

xxxxxxx1 call xxxxxx10
xxxxxxx5

当执行call指令时,系统会把xxxxxxx5作为返回地址压入堆栈
而在被调用过程完成它的工作后,retn指令就是读取堆栈顶部的地址,然后返回到哪里
所以,通常情况下,在被调用过程里,分配了多少局部变量,也就是形如
add esp -xx
或着
sub esp xx
这就是在分配局部变量
最后过程最后也会释放多少
但是有时程序故意要修改返回地址让程序返回到另一个地方,最简单的就是这样
push xxxxxx20
retn
这样由于修改了堆栈数据,retn指令是只管读出堆栈顶部的值作为返回地址,我们就返回
到了xxxxxx20的地方了。


如果你要在被调用过程的中间,只是返回到原来的返回地址,那么你注意好堆栈平衡就可以了。
  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值