具体问题是这样的:
压一个地址入堆栈,然后返回(返回后也就是EIP指向压入的地址处,这样的理解对吧)。
可奇怪的是,返回时,EIP指向的是一句指令的中后面一个字节,那这样计算机如何执行呀?
有以下两种情况,请说说理由。
;以下是反汇编的代码
004680FD 68 7B714600 push 46717B
00468102 40 inc eax
00468103 40 inc eax
00468104 40 inc eax
00468105 C3 retn ;从这里返回
;情况一
;从0045717A处执行?
0046717A 20E3 and bl, ah
0046717C 0B0B or ecx, dword ptr ds:[ebx]
0046717E 0B0B or ecx, dword ptr ds:[ebx]
00467180 50 push eax
00467181 8AE0 mov ah, al
00467183 0E push cs
00467184 0B0B or ecx, dword ptr ds:[ebx]
00467186 0B80 989F020B or eax, dword ptr ds:[eax+B029F98]
0046718C 0B58 9B or ebx, dword ptr ds:[eax-65]
0046718F 9B wait
00467190 9B wait
;情况二
;从0045717B处执行?
0046717B /E3 0B jecxz short 00467188 ; 00467188
0046717D |0B0B or ecx, dword ptr ds:[ebx]
0046717F |0B50 8A or edx, dword ptr ds:[eax-76]
00467182 |E0 0E loopdne short 00467192 ; 00467192
00467184 |0B0B or ecx, dword ptr ds:[ebx]
00467186 |0B80 989F020B or eax, dword ptr ds:[eax+B029F98]
0046718C 0B58 9B or ebx, dword ptr ds:[eax-65]
0046718F 9B wait
00467190 9B wait
;情况三
;从0045717C处执行?
0046717A 20E3 and bl, ah
0046717C 0B0B or ecx, dword ptr ds:[ebx]
0046717E 0B0B or ecx, dword ptr ds:[ebx]
00467180 50 push eax
00467181 8AE0 mov ah, al
00467183 0E push cs
00467184 0B0B or ecx, dword ptr ds:[ebx]
00467186 0B80 989F020B or eax, dword ptr ds:[eax+B029F98]
0046718C 0B58 9B or ebx, dword ptr ds:[eax-65]
0046718F 9B wait
00467190 9B wait
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!