ESP定律

当程序载入OD之后 

004AC460 > $  60            pushad;程序停在这里 F8 指向pushad指令

pushad是把寄存器中数据入栈 栈中数据如下:

0012FFA4   7C930208   |EDI  <-- ESP指向栈顶

0012FFA8   FFFFFFFF |ESI

0012FFAC   0012FFF0 |EBP

0012FFB0   0012FFC4 |ESP

0012FFB4   7FFDE000 |EBX

0012FFB8   7C92E4F4   |EDX  

0012FFBC   0012FFB0 |ECX

0012FFC0   00000000 |EAX

此时ESP指向栈顶 地址为0012FFA4 ,脱壳从这里开始-.-~

来到数据段即内存地址0012FFA4 在这下断点 硬件访问 - word

然后F9  -- 这里就能找到OEP

那么我的理解就是 汇编指令之前前先把各个寄存器保存起来,然后执行壳的操作比如解压,

等壳的工作完成之后需要恢复各个寄存器的值 ,我们在栈中已经设置了一个断点,所以当程序访问栈中数据(popad,我们在0012FFA4 下断点是EDI的值,当程序恢复EDI寄存器)时就被我们给断了下来 ,当然并不是断在pop EDI指令上,而是断在popad的下一条指令,因为popad是一步到位恢复寄存器的。

然后在寻找OEP,一般是jmp大跳 然后就看到了期待已久的55机器码了 dump-.-~

可以理解为壳的执行是一个子程序 ,子程序运行前都要保持寄存器,完事之后恢复寄存器,返回主程序

我们在恢复寄存器的地方下断点,然后   ...

以上就是我对ESP定律的理解,虽然还未成功脱的一壳,但是各大网站论坛都在谈论ESP之威武,据说可脱所以压缩壳,所以大概找了些文章看看,ESP定律就是利用堆栈平衡找到程序结束继而找到OEP

以上为个人理解,为了不误人子弟,有错误大神请指出 

 

popad:相当于

push EAX

push ECX

push EDX

push EBX

push ESP

push EBP

push ESI

push EDI

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值