x86调用指令有哪些替代方法? 也许类似于推送返回地址然后跳转?
也是他们获取内存中当前位置的命令?
答案 0 :(得分:20)
CALL实际上为你做了这个例子
CALL my_func
会做类似
的事情push ret_address
jmp my_func
并且后续的RET调用只会在某种意义上使用刚刚推送到JMP的地址。是否有特定原因导致您不想使用CALL或者它不适用于您? 对于内存中的当前位置,您可以尝试读取EIP寄存器(无法写入)。
答案 1 :(得分:6)
您只需将dword值和jmp推送到该过程即可。推送将是返回地址:
push return_address (push eax if address in eax)
jmp call_address
如果存在针对该特定呼叫的参数,请记住也推送参数。
你在记忆中的当前位置是什么意思?我想你的意思是当前的指令指针。你不能直接得到它,但你可以使用seh处理程序(结构化异常处理程序)在导致处理异常时获取该值。
答案 2 :(得分:1)
如果我没有混淆的东西,我会说这取决于。你可以看到here有近距离和远距离通话,但我们只考虑近距离通话。还有两种可能性
E8 <offset> # relative
FF <address> # absolute
而FF
表示绝对“跳转”,E8
表示相对于当前eip
。
所以如果你有例如
E8 32 45 ab 6f
表示
call 0x3245ab6f
这将转化为
push %eip
add $0x3245ab6f, %eip
而不是
push %eip
jmp $0x3245ab6f