新手看ESP定律
楼主是新的不能再新的人,最近空闲了一些开始看官方培训视频。看了xiaomo的视频前两集,对ESP定律很感兴趣,于是搜了一些资料,希望能了解ESP定律的原理。实例解释用的就是官方培训第一课的UPX壳的程序。有任何不对的地方,还请各位大牛多多指点,新人求罩。第一次发帖,不符合规则的地方还版主大大请告诉我。
1. ESP是什么
ESP(Extended stack pointer)是指向当前栈的栈顶
EBP(Extended base pointer )指向系统栈最上面一个栈(当前栈)的底部。
2. ESP定律的原理
“堆栈平衡原理”
a. 基础知识:
PUSHAD: 依次把EAX,ECX,EDX,EBX,ESP,EBP,ESI,EDI等压入栈中
POPAD: 把栈中的值依次弹到EDI,ESI,EBP,ESP,EBX,EDX,ECX,EAX等寄存器中,栈需要状态还原。
OEP(Original Entry Point)程序的入口点
b. 实例解释
初始ESP:0012FFC4
执行完PUSHAD后的ESP:0012FFA4指向栈顶,此时寄存器的值被存放在0012FFC0~0012FFA4中,图片上用红圈圈出来了。
设置硬件访问断点,目的是实现在访问同一内存时,截获中断。我们希望在POPAD的时候截获中断,此时应当处于POPAD命令后,OEP之前。
然后再单步执行到ESP:0012FFC4的OEP,就可以脱壳了。
P.S. 硬件断点和内存断点的区别()
内存访问:你下断后OD把你下断的内存设置为不可访问,这样你下访问断点就异常,就被OD捕获.
内存写入:下这个断后OD把内存设置为不可写.然后捕获写入时产生的异常.
硬件断点:硬件断点是利用CPU中的DRx寄存器来设置的.硬件断点最多能同时设置4个
3. ESP定律的适用范围()
几乎全部的压缩壳,部分加密壳。只要是在JMP到OEP后,ESP=0012FFC4的壳,理论上我们都可以使用
一般可以认为:
1、在命令行下断hr esp-4(此时的ESP就是OD载入后当前显示的值)
2、hr ESP(关键标志下一行代码所指示的ESP值(单步通过))
参考:
http://bbs.pediy.com/archive/index.php?t-125305.html
http://www.52pojie.cn/thread-294844-1-1.html
http://blog.chinaunix.net/uid-20776863-id-121973.html
http://www.52pojie.cn/thread-14335-1-1.html
上次看一个教程有提到这个东西,感谢分享,收藏了 感谢分享 不错!谢谢 不错,讲的挺详细。学习了 LZ辛苦,感谢分享~ 楼主辛苦,学习了
页:
[1]