由于EIP寄存器无法直接访问,要获得EIP的值,就只有绕着弯儿、变着法子把她弄到手,主要原理:call调用时会把下一条指令的地址push入栈,以供子函数返回,直接从堆栈中就能拿到EIP的值了。
执行完以下代码后,eax = 401487。 其中“C324048B”对应于“mov eax,dword ptr ss:[esp];retn ”
00401480 68 C304248B push C324048B
00401485 FFD4 call esp
00401487 83C4 04 add esp,4 ; 调整堆栈
也可用下面的代码,更易理解不过安全性较差
00401480 68 C3000000 push 0C3
00401485 FFD4 call esp
00401487 58 pop eax ; 调整堆栈
00401488 8B4424 F8