原理:壳代码在一开始会使用PUSHAD指令将所有的寄存器入栈,此时ESP所指向的内存记录着某一个寄存器的值。然后我们ESP指向的内存处下一个硬件内存访问断点,执行完壳代码后会将所有的寄存器值出栈以平衡堆栈POPAD,CPU需要访问原ESP记录的值,壳代码解压完程序代码后,最后平衡堆栈时必然要从ESP所指向的内存中读取之前存入的某个寄存器的值,所以必定会触发此断点,此时离真正的OEP也不远了
0x01 直接加载入OD,F8一次,让当前的寄存器中的值都压入堆栈
0x02 然后将当前ESP指向的内存处下一个硬件内存访问断点,然后进行F9运行程序,发现直接来到大跳转,原因是执行完壳代码后会将所有的寄存器值出栈以平衡堆栈POPAD,此时CPU需要访问原ESP的记录的值,所以就会触发原来我们断下的硬件断点,OD捕获异常,成功下断,F8成功来到OEP