gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 20:07:24 24 4
gpt4 key购买 nike

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

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

它的工作方式与带偏移量的 E8 指令类似吗?如果不是,如何找到调用指向的地址?以及该调用的返回地址?

最佳答案

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

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

与普通call(即操作码e8)指令的区别在于,这是一个间接函数调用,其中我们调用的地址是从内存中加载而不是在那里指定。这由星号 (*) 表示。 call foo 相当于call *foo,就像mov $foo,%eax 相当于mov foo,%eax

关于assembly - 需要帮助理解 FF 间接调用指令 x86,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43820744/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com