需要帮助理解 FF 间接调用指令 x86

The*_*ion 4 x86 assembly intel

我正在尝试重新编码一个简单的 ftrace,但我无法理解像这样的 FF 间接调用:

ff 15 76 0b 20 00       callq  *0x200b76(%rip)        # 600ff0 <__libc_start_main@GLIBC_2.2.5>
Run Code Online (Sandbox Code Playgroud)

它是否像带有偏移量的 E8 指令一样工作?如果没有,如何找到呼叫指向的地址?那个电话的返回地址?

fuz*_*fuz 6

该指令callq *0x200b76(%rip)执行以下操作:

  1. 加载从一个64位字rip + 0x200b76,其中rip指令指针。根据评论,这应该是地址,0x600ff0但如果您的代码被重新定位,它可能会有所不同。
  2. 将下一条指令的地址压入堆栈作为返回地址。
  3. 跳转到我们在第一步中读取的数据的值。

与普通call(即 opcode e8)指令的不同之处在于,这是一个间接函数调用,我们调用的地址是从内存加载而不是在内存中指定的。这由星号 ( *) 表示。call foocall *foo喜欢mov $foo,%eaxmov foo,%eax