假设我想要使用EB操作码进行短跳转,
Intel手册中的相关条目:
jmp rel8
表示短跳转Intel手册中的相关条目:
EB CB 或 JMP rel8
"短跳转,RIP = RIP + 8位位移符号扩展到64位"
(其中CB是一个有符号的字节,表示与EIP寄存器中方向相关的相对偏移量)
在这个短跳转中,可能总是偏移会是 offset+2 ,因为执行时间中的EIP(参考方向)是双字节指令的基础,但加数总是发生
eb 30
=jmp 0x00000032 (+30)
eb e2
=jmp 0xffffffe4 (-30)
那么,EIP可以故意保持相同的方向,因为fe + 2是00或EIP。
eb fe
=jmp 0x00000000
我发现令人惊讶的是,overoffset发生了分叉,尽管数字是负数。但在Intel手册中没有提到(也许因为有3000页)。
Intel® 64 and IA-32 Architectures Software Developer’s Manual: Vol. 2A 3-423
近跳转的跳转范围从当前的EIP值开始限制为-128到+127。
然后我考虑了三种可能性:
- 因为在执行时EIP的后/未来值,所以加上了+2。
- 编码值不是二进制补码表示的有符号数。
- 这出现在手册中,但我没看到,因为我很蠢。
destination - source - sizeof(instruction)
。 - byxordst - end_of_jmp
。 - Peter Cordes