寻找真正的入口(OEP)--广义ESP定律
2007-01-14 16:44:36 来源:WEB开发网核心提示:1.前言略……2.准备知识在我们开始讨论ESP定律之前,我先给你讲解一下一些简单的汇编知识,寻找真正的入口(OEP)--广义ESP定律,1.call这个命令是访问子程序的一个汇编基本指令,也许你说,一定要保证在RET这条指令之前,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后的寄存器的值!
更多精彩
赞助商链接