寻找真正的入口(OEP)--广义ESP定律
2007-01-14 16:44:36 来源:WEB开发网核心提示: EAX00000000ECX0012FFB0EDX7FFE0304EBX7FFDF000ESP0012FFC4EBP0012FFF0ESI77F51778ntdll.77F51778EDI77F517E6ntdll.77F517E6EIP004010CCnote-upx.004010CCC
EAX00000000
ECX0012FFB0
EDX7FFE0304
EBX7FFDF000
ESP0012FFC4
EBP0012FFF0
ESI77F51778ntdll.77F51778
EDI77F517E6ntdll.77F517E6
EIP004010CCnote-upx.004010CC
C0 ES002332bit0(FFFFFFFF)
P1 CS001B32bit0(FFFFFFFF)
A0 SS002332bit0(FFFFFFFF)
Z1 DS002332bit0(FFFFFFFF)
S0 FS003832bit7FFDE000(FFF)
T0 GS0000NULL
D0
O0 LastErrERROR_MOD_NOT_FOUND(0000007E)
呵呵~是不是除了EIP不同以外,其他都一模一样啊!
为什么会这样呢?
我们来看看UPX的壳的第一行:
0040EC90n> 60 pushad //****注意这里*****
0040EC91 BE15B04000 movesi,note-upx.0040B015
PUSHAD就是把所有寄存器压栈!我们在到壳的最后看看:
0040EE0F 61 popad //****注意这里*****
0040EE10 -E9B722FFFF jmpnote-upx.004010CC //JMP到OEP
POP就是将所有寄存器出栈!
而当我们PUSHAD的时候,ESP将寄存器压入了0012FFC0--0012FFA4的堆栈中!如下:
0012FFA4 77F517E6 返回到ntdll.77F517E6来自ntdll.77F78C4E //EDI
0012FFA8 77F51778 返回到ntdll.77F51778来自ntdll.77F517B5 //ESI
0012FFAC 0012FFF0 //EBP
0012FFB0 0012FFC4 //ESP
0012FFB4 7FFDF000 //EBX
0012FFB8 7FFE0304 //EDX
0012FFBC 0012FFB0 //ECX
0012FFC0 00000000 //EAX
所以这个时候,在教程上面就告诉我们对ESP的0012FFA4下硬件访问断点。也就是说当程序要访问这些堆栈,从而恢复原来寄存器的值,准备跳向苦苦寻觅的OEP的时候,OD帮助我们中断下来。
更多精彩
赞助商链接