0

我正在开发一个使用内联汇编来执行跳远的程序。据我了解,我需要做的就是将 FP 和 PC 替换为保存的 FP 和 PC。使用程序集,我可以更改帧指针 (%ebp),但我无法对 PC 执行此操作。

int jump(int x)
{
  int oldFP = getebp();  //the FP of the calling function
  int oldPC = getebp()+4;  //the PC of the calling function

  ljump();  //uses assembly to change FP (works) but can't figure out PC

  return x;
}

ljump()的是

ljump: # return stack frame pointer FP 
       movl  savedFP, %ebp
       ret

我之前尝试更改 PC 一直在使用跳转,但是我通常会遇到分段错误。

任何输入将不胜感激。

4

1 回答 1

1

如果您希望您的代码在某个预定义的地址上继续,您可以在您的 asm 代码(伪代码)中这样做:

push myNewAddress
ret

或者,如果您喜欢不同的方式,请使用寄存器:

mov  eax, myNewAddress
jmp eax

您不能直接使用指令修改 PC,因为它始终是当前指令所在的位置。但是,您应该意识到这可能会导致内存泄漏或其他副作用,因为堆栈可能没有得到正确处理。

于 2014-02-07T18:38:57.110 回答