残情·离天 发表于 2015-9-30 21:34

新手看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

青霄 发表于 2015-9-30 21:40

上次看一个教程有提到这个东西,感谢分享,收藏了

幻觉 发表于 2015-9-30 23:05

感谢分享

www52pojiecn 发表于 2015-11-5 22:25

不错!谢谢

liang234066665 发表于 2015-11-5 22:34

不错,讲的挺详细。学习了

掂软心内 发表于 2015-11-6 18:55

LZ辛苦,感谢分享~

海水天天蓝 发表于 2015-11-27 22:29

楼主辛苦,学习了
页: [1]
查看完整版本: 新手看ESP定律