寻找真正的入口(OEP)--广义ESP定律

豆豆网   技术应用频道   2007年01月14日  【字号: 收藏本文

本文详细介绍寻找真正的入口(OEP)--广义ESP定律

  1.前言

  略……

  2.准备知识

  在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识。

  1.call

  这个命令是访问子程序的一个汇编基本指令。也许你说,这个我早就知道了!别急请继续看完。

  call真正的意义是什么呢?我们可以这样来理解:1.向堆栈中压入下一行程序的地址;2.JMP到call的子程序地址处。例如:

00401029  . E8DA240A00  call004A3508
0040102E  . 5A      popedx

  在执行了00401029以后,程序会将0040102E压入堆栈,然后JMP到004A3508地址处!

  2.RET

  与call对应的就是RET了。对于RET我们可以这样来理解:1.将当前的ESP中指向的地址出栈;2.JMP到这个地址。

  这个就完成了一次调用子程序的过程。在这里关键的地方是:如果我们要返回父程序,则当我们在堆栈中进行堆栈的操作的时候,一定要保证在RET这条指令之前,ESP指向的是我们压入栈中的地址。这也就是著名的“堆栈平衡”原理!

  3.狭义ESP定律

  ESP定律的原理就是“堆栈平衡”原理。

  让我们来到程序的入口处看看吧!

  1.这个是加了UPX壳的入口时各个寄存器的值!

EAX00000000
ECX0012FFB0
EDX7FFE0304
EBX7FFDF000
ESP0012FFC4
EBP0012FFF0
ESI77F51778ntdll.77F51778
EDI77F517E6ntdll.77F517E6
EIP0040EC90note-upx.<ModuleEntryPoint>
C0 ES002332bit0(FFFFFFFF)
P1 CS001B32bit0(FFFFFFFF)
A0 SS002332bit0(FFFFFFFF)
Z0 DS002332bit0(FFFFFFFF)
S1 FS003832bit7FFDE000(FFF)
T0 GS0000NULL
D0
O0 LastErrERROR_MOD_NOT_FOUND(0000007E)

  2.这个是UPX壳JMP到OEP后的寄存器的值!

来源:poptown.gamewan.com    作者:Lenus    责编:豆豆技术应用

正在加载评论...