ESP定律脱壳寻找OEP

前言:ESP定律脱壳寻找OEP笔记

ESP定律脱壳的原理

ESP定律脱壳基于堆栈平衡所产生脱壳方法

首先相关的壳程序代码在一开始会使用PUSHAD指令将所有的寄存器入栈,在intel x86cpu中此时其中ESP寄存器中的值是记录着相关寄存器(ESI)的值。

然后我们ESP指向的内存处下一个硬件内存访问断点,壳程序执行完壳代码,此时就是解密完成后,会将之前的PUSHAD指令压入栈的寄存器值出栈以平衡堆栈POPAD,CPU需要访问原ESP记录的值,壳代码解压完程序代码后,最后平衡堆栈时必然要从ESP所指向的内存中读取之前存入的某个寄存器的值,所以必定会触发此断点,此时离真正的OEP也不远了

ESP定律脱壳

首先将壳程序载入OD,看到PUSHAD指令,F8一次,让当前的8个寄存器中的值都压入堆栈中

然后将当前ESP指向的内存处下一个硬件内存访问断点,然后进行F9运行程序,发现直接来到大跳转,原因是执行完壳代码后会将所有的寄存器值出栈以平衡堆栈POPAD,此时CPU需要访问原ESP的记录的值,所以就会触发原来我们断下的硬件断点,OD捕获异常,成功下断,可以看到就来到程序的OEP了

技巧点

如果遇到一个大跳转的地址,然后单步跟到了一个地方,但是跟平常的OEP的机器指令不太像的话,可以看下最初的堆栈平衡的情况

比如当前壳程序在PUSHAD指令的情况,此时的堆栈情况是如下图所示的,此时的栈顶地址是0x12FFC4

那脱完壳之后OEP如下,再看下栈顶的地址,可以发现0x12FFC4,那么可以大概率的确定这是OEP的地方了

posted @ 2019-12-25 14:58  zpchcbd  阅读(487)  评论(0编辑  收藏  举报