ESP定律原理详解

0x00 前言

闲着也是闲着,在逆向某软件时深入了解了下ESP定律,然后就想写个文章记录并分享下。

ESP定律又称堆栈平衡定律,是应用频率最高的脱壳方法之一 ,不论是新手还是老手都经常用到。据我所知,ESP定律是一位外国大牛发现的,但目前已无从考证(未找到相关资料)。

0x01 前置知识

栈(stack)是内存中分配的一段空间。

向一个栈插入新元素又称作入(push)放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈(pop),它把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

call

相当于高级语言中的函数调用。当执行call指令时,进行两步操作:将下一条的指令的地址压入栈中,再跳转到该地址处。相当于:

push ipjmp near ptr 地址

ret && retf

与call指令相对应,将当前的ESP寄存器中指向的地址出栈,然后跳转到这个地址。相当于:

pop ip#ret
pop IPpop CS#retf

0x02 操作示例

这是我写的一个带壳的32位小程序,用来当做esp定律应用的一个示例。这是一个比较机械的方法,但可以对esp定律有一个感性的认识。

首先用Exeinfo Pe查壳,发现是nspack壳。

接下来用od载入程序,单步步入后,如箭头所示发现ESP寄存器变红。

此时单击右键选中该寄存器进行数据窗口跟随。然后选中数据窗口任意字符下硬件断点(byte,word,dword均可)

f9运行后,f8连续单步步过找到OEP( 程序的入口点 )。选中该地址单击右键选中用OllyDump脱壳调试进程,然后进行脱壳(如果发现程序不能打开,可以试试勾选重建输入表)。

接着用Exeinfo Pe查壳,壳已经被去掉了。

0x03 原理详解

首先,壳实质上是一个子程序,它在程序运行时首先取得控制权并对程序进行压缩。同时隐藏程序真正的OEP。大多数病毒就是基于此原理,从而防止被杀毒软件扫描。

壳的类型:

· 解压->运行· 解压->运行->解压.->运行· 解压 decoder|encoded code->decode ->exc· Run the virtual machine

而脱壳的目的就是找到真正的OEP(入口点)。

而我们所讲到的ESP定律的本质是堆栈平衡,具体如下:

让我们看下加了壳的这个小程序的入口的各个寄存器的情况

EAX 00000000
ECX 004E820D offset r1.<ModuleEntryPoint>
EDX 004E820D offset r1.<ModuleEntryPoint>
EBX 0036C000
ESP 0072FF74
EBP 0072FF80
ESI 004E820D offset r1.<ModuleEntryPoint>
EDI 004E820D offset r1.<ModuleEntryPoint>
EIP 004E820D r1.<ModuleEntryPoint>

然后是到OEP时各寄存器的情况

EAX 0072FFCC
ECX 004E820D offset r1.<ModuleEntryPoint>
EDX 004E820D offset r1.<ModuleEntryPoint>
EBX 0036A000
ESP 0072FF74
EBP 0072FF80
ESI 004E820D offset r1.<ModuleEntryPoint>
EDI 004E820D offset r1.<ModuleEntryPoint>
EIP 00401500 r1.00401500

我们发现只有EIP和EAX寄存器的数值发生了变化,而EAX保存的是OEP的地址,这是什么原因呢?

由于在程序自解密或者自解压过程中, 多数壳会先将当前寄存器状态压栈, 如使用pushad, 而在解压结束后, 会将之前的寄存器值出栈, 如使用popad. 因此在寄存器出栈时, 往往程序代码被恢复, 此时硬件断点触发(这就是我们要下硬件断点的原因),然后在程序当前位置, 只需要一些单步操作, 就会到达正确的OEP位置。

0x04 适用范围

我自己总结了一个比较小白的方法,那就是载入程序后只有esp寄存器内容发生变化,那么这个程序多半可以用ESP定律(如有错误多谢指正)。

几乎全部的压缩壳, 一些早期的加密壳 (这是在网上收集到的资料总结的,经过我自己的实践,基本准确)。

0x05 总结

以上就是我对ESP定律的理解,如有错误,请轻喷 ^-^ ,我也还只一只刚迈入二进制世界的菜鸟,希望我这篇文章对刚入门的小白有所帮助>_<

最后再加一句找OEP不是最难的,最难的还是修复。如果对OEP的识别有所疑惑可以问我也可以在网上收集相关资料,还是比较多的。

利用ESP定律进行脱壳


(0)

相关推荐

  • CPU 指令

    表白:黑白圣堂血天使,天剑鬼刀阿修罗.  讲解对象:/CPU 指令 作者:融水公子 rsgz 汇编教程 汇编教程 http://www.rsgz.top/post/91.html 我们通过函数来理解一 ...

  • 九阳电磁炉电路图及电路原理详解(图文)

    关于九阳电磁炉的电路图,九阳电磁炉整个电路的组成部分有哪些,九阳JYC-21CS21电磁炉电源电路的工作原理是怎么样的,电磁炉是应用电磁感应原理对食品进行加热的,一起来了解下. 九阳电磁炉的电路图 一 ...

  • 九阳电磁炉电路图及电路原理详解(2)

    九阳电磁炉电路图及电路原理详解(第2页) 三.九阳电磁炉的电路原理 电磁炉是应用电磁感应原理对食品进行加热的. 电磁炉的炉面是耐热陶瓷板,交变电流通过陶瓷板下方的线圈产生磁场,磁场内的磁力线穿过铁锅. ...

  • 过程能力指数Cp与Cpk计算原理详解

    [爆赞公开课]CQI-9热处理系统评估(第四版)公开课,2021年5月开课 [公开课]IATF16949:2016汽车工业内审员精品课程,5.15-5.16 GD&T培训苏州第24期,5.15 ...

  • ASIO4ALL,linkpro,studio one跳线原理详解与操作步骤

    1.1需要的软件: 1.ASIO4ALL:将板载声卡的WDM驱动转化为ASIO驱动 点亮同一声卡驱动下的麦克风和扬声器 2.Linkpro:调用ASIO驱动,创建N个虚拟的扬声器和虚拟的麦克风及音频通 ...

  • 好文分享:ext文件系统机制原理详解

    原文:https://www.cnblogs.com/f-ck-need-u/p/7016077.html作者:骏马金龙 文章有些长,但是作者总结的非常好,能学到很多技术细节知识.请大家耐心阅读. 将 ...

  • 水平电池技术原理详解

    1980年,美国军方为水平电池研究立项,开启了铅酸电池革命的序幕. 易德维能源科技有限公司攻克核心技术,成为世界上唯一批量生产商品化水平电池的制造商. 旭派水平电池,打破了铅酸电池一百六十多年的传统制 ...

  • 硬盘的读写原理详解

    作者 |hguisu 来源|https://reurl.cc/V3kAV6 硬盘的种类主要是SCSI .IDE .以及现在流行的SATA等:任何一种硬盘的生产都要一定的标准:随着相应的标准的升级,硬盘 ...

  • Buck电路工作原理详解

    Buck电路工作原理详解

  • 双稳态触发器的工作原理详解

    双稳态触发器是脉冲和数字电路中常用的基本触发器之一.双稳态触发器的特点是具有两个稳定的状态,并且在外加触发信号的作用下,可以由一种稳定状态转换为另一种稳定状态.在没有外加触发信号时,现有状态将一直保持 ...