EIP 寄存器 指向CPU下一次要执行的程序地址。
指令 | 注释 | 用法 |
---|---|---|
JMP | 修改EIP的值 | JMP r/m/imm |
CALL | 修改EIP的值,入栈CALL指令下一行的程序地址 | CALL r/m/imm |
RET | 出栈CALL指令入栈的程序地址到EIP | RET |
JMP 指令:jmp相当于 mov eip,r/m/imm
由下图可见,不支持直接mov eip的值(Intel并没有提供mov eip支持)。
mov eip,imm
//EIP改变 程序跳转到空白(堆栈外的地址)
JMP 1
jmp 1 结果
jmp 0044335A
jmp eax
jmp dword ptr ds:[0x0012FFCC]
jmp 0044335A
CALL 指令:
CALL 0044335C 结果
- 修改EIP的值
- call指令下面一行指令的地址存入堆栈
- esp地址减4
(2、3步骤相当于 PUSH CALL指令下面一行指令的地址)
注:CALL指令在DTDebug中按F7执行。
CALL 0044335C
MOV EAX,0044335C
CALL EAX
MOV DWORD PTR DS:[0012FFC8],0044335C
CALL DWORD PTR DS:[0012FFC8]
//1
//自定义实现CALL
jmp 0044335C
push 00443355
//2 解释push
jmp 0044335C
mov 0012ffC0 00443355
sub esp,4
思考:
还可以怎么实现CALL指令功能?
RET 指令:
RET
- ESP加4
- EIP重新指向栈顶指向指令地址
//
RETN
//1
jmp dword ptr ds:[esp]
add esp,4
思考:
如何自定义实现RETN?
网友评论