push 0x******* retn 的应用

来源:互联网 发布:淘宝购物优惠微信群 编辑:程序博客网 时间:2024/05/01 18:17
转自  http://blog.sina.com.cn/s/blog_679b38460100xhbj.html

在破解的时候,我想在一个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的地方了。


如果你要在被调用过程的中间,只是返回到原来的返回地址,那么你注意好堆栈平衡就可以了。
原创粉丝点击