我在 OSX 平台上使用 x86_64。我已经研究出如何使用 E9 字节代码指令进行近跳转,其中我的相对地址有 4 个字节(与 RIP 合作)
现在我有一个实例,我在一个非常高的地址和我所在的位置分配了一些东西将在同一过程中引用它非常遥远。最终结果是 RIP 和起始地址之间的差异为 5 个字节。(如果我使用相对寻址)。我试图使用 FF 25 + 4 个字节 + 1 个字节,第五个没有被解释为命令的一部分。
确实当我在表中查找数据时x86 架构 mod R/M 字节它指出 FF 25(显然是 RIP+signed dword)。这将解释为什么 1 个字节被丢弃。我试着检查表格,但并没有真正理解它。
所以我的问题是
- 我如何阅读表格以了解如何设置字节码,以便我可以正确地做问题#3?
- JMP /5 使用直接地址还是间接地址(我是否必须将 RIP 作为计算的一部分)?
- 我需要组装哪些字节码才能使 JMP /5 生效(例如:FF ...)
典型的 4 字节跳转 (e9) 代码可能如下所示:(lldb session)
-> 0x100000ebb: 81 7d fc 03 00 00 00 cmpl $0x3, -0x4(%rbp)
0x100000ec2: 0f 85 05 00 00 00 jne 0x100000ecd
0x100000ec8: e9 3b 57 34 12 jmp 0x112346608
0x100000ecd: 48 8d 3d bc 00 00 00 leaq 0xbc(%rip), %rdi