脱壳实践之寻找OEP——堆栈平衡法

 0x00 前言

  上一篇介绍了壳程序的加载过程以及通过两次内存断点法寻找OEP,这篇我们将利用新的的方法——堆栈平衡法来寻找OEP

0x01 堆栈平衡法原理

  堆栈平衡原理就是利用壳程序在运行前后需要保存和恢复原程序的堆栈环境来实现的。我们可以把壳程序当作一个子程序,调用这个子程序前,肯定需要保存原程序的堆栈环境,子程序调用完毕之后,就需要pop处原堆栈的值从而实现堆栈平衡。通常来说,壳程序使用pushhad/pophad或者pushfd/popfd指令来实现。脱壳时可以实根据堆栈平衡原理对ESP下断(由于esp存储的是栈顶指针),找到OEP

0x02 实例讲解堆栈平衡原理找OEP

1)PE文件RebPE拖入OD,程序停处,如下图:

 我们按F8单步执行一次,得下图:

 上图可知,第一步执行的是pushad操作,就是把各个寄存器的值保存在堆栈中)在寄存器窗口得到保存的值为0019FF64,我们右键在数据窗口跟随,并在该处下硬件断点。如下图:

 

2)F9运行,该程序在刚刚的断点处停止(PS:我们刚刚下的数据断点是ESP寄存器的值,既然要壳程序运行结束要恢复数据就一定会访问这里,恢复完数据即马上就要到了OEP处)。

 3)我们注意到前面已经执行了popad指令,后面两句指令 push 0x401130 retn其实就是相当于jmp 0x401130,即跳转至401130处,这个地址就是OEP 。我们继续F8单步,程序来到此处如下图:

 这个401130就是原程序起始地址。我们将od的分析去掉可以很直观的看出来,如下图:

原文地址:https://www.cnblogs.com/2f28/p/9856350.html