ESP定律原理是什么

  

ESP定律原理是什么,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。

0 x00前言

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

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

0 x01前置知识


栈(栈)是内存中分配的一段空间。向一个栈插入新元素又称作入(推)放到栈顶元素的上面,使之成为新的栈顶元素;从一个栈删除元素又称作出栈(流行),它把栈顶元素删除掉,使其相邻的元素成为新的栈顶元素。

 ESP定律原理是什么

调用

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

 push  ip 
  jmp  near  ptr 地址

ret,,retf

与调用指令相对应,将当前的ESP寄存器中指向的地址出栈,然后跳转到这个地址。相当于:
 pop  ip
  # ret
  pop 知识产权
  pop 计算机科学
  # retf 

0 x02操作示例

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

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

 esp定律原理是什么

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

 esp定律原理是什么

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

 esp定律原理是什么

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

 esp定律原理是什么

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

 esp定律原理是什么

0 x03原理详解

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

壳的类型:

 ?,解压→运行
  ?,解压→运行→解压。→运行
  ?,解压,译码器| encoded 代码→decode →exc
  ?,Run 从而,virtual 机

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

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

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

 EAX  00000000
  ECX  004 e820d  offset  r1。你们ModuleEntryPoint>
  EDX  004 e820d  offset  r1。你们ModuleEntryPoint>
  EBX  0036 c000
  ESP  0072 ff74
  EBP  0072 ff80
  ESI  004 e820d  offset  r1。你们ModuleEntryPoint>
  EDI  004 e820d  offset  r1。你们ModuleEntryPoint>
  EIP  004 e820d  r1。你们;ModuleEntryPoint> 

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

 EAX  0072年的黑暗
  ECX  004 e820d  offset  r1。你们ModuleEntryPoint>
  EDX  004 e820d  offset  r1。你们ModuleEntryPoint>
  EBX  0036 a000
  ESP  0072 ff74
  EBP  0072 ff80
  ESI  004 e820d  offset  r1。你们ModuleEntryPoint>
  EDI  004 e820d  offset  r1。你们ModuleEntryPoint>
  EIP  00401500, r1.00401500 

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

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

ESP定律原理是什么