【问题标题】:How to understand the output of objdump, about indirect jmp?如何理解objdump的输出,关于间接jmp?
【发布时间】:2015-05-06 11:50:31
【问题描述】:

当objdump -S my_program时,通常可以看到如下间接jmp指令,一般用于switch/case跳转表:

ffffffff802e04d3: ff 24 d5 38 2e 10 81 jmpq *-0x7eefd1c8(,%rdx,8)

地址-0x7eefd1c8怎么理解?这意味着表的基地址是0xffffffff802e04d3 - 0x7eefd1c8

另外,我怎样才能从ff 24 d5 38 2e 10 81 获得-0x7eefd1c8

【问题讨论】:

标签: linux kernel reverse-engineering x86-64 disassembly


【解决方案1】:

解码问题

比你还要看Intel Development Manuals

  • ff 是 JMP 操作码(近跳,绝对间接)[1]
  • 24 是一个 ModR/M 字节 [2] 这意味着 SIB 字节在它之后(JMP 操作码只有一个操作数,因此忽略寄存器字段)李>
  • d5 是一个 SIB 字节 [2],这意味着 disp32 紧随其后,Scale = 8Index = %rdx(在 32 位模式下,索引应该是 @ 987654327@) 没有基地。
  • 38 2e 10 81 是一个 4 字节的 disp32 操作数。如果将其编码为双字,您将得到0x81102e38,注意最高位设置为1。这是一个符号位,表示值以 Two's Complement Encoding [3] 编码。

从二进制补码转换得到我们期望的数字:

>>> print hex(0x81102e38 - (1 << 32))
-0x7eefd1c8 

当处理器以 64 位模式执行该指令时,它从 0xffffffff81102e38 + (%rdx * 8) 读取 8 个字节(原始数字经过符号扩展)并将该四字放入 %rip [4]。

参考手册:

  1. 第 2A 卷,第 3.2 节说明 (A-M),第 3-440 页
  2. 第 2 卷,第 2.1.5 节 ModR/M 和 SIB 字节的寻址模式编码,第 2-6..2-7 页
  3. 第 1 卷,第 4.2.1.2 节有符号整数,第 4-4 页
  4. 第 2 卷,第 2.2.1.3 节位移,第 2-11 页

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多