欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

ESP定律

发布时间:2023/12/1 编程问答 45 豆豆
生活随笔 收集整理的这篇文章主要介绍了 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

总结

以上是生活随笔为你收集整理的ESP定律的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。