use*_*569 16 x86 assembly x86-64
假设我想使用以下操作码进行短跳转:
EB CB 或 JMP rel8
"跳转,RIP = RIP + 8位位移符号扩展到64位"
(其中CB是一个字节有符号值,表示与EIP寄存器中的方向有关的相对偏移量)
也许总是偏移量将偏移+ 2,因为此短跳转中的执行时间(参考方向)中的EIP是twobyte指令的基础,但加数始终发生
eb 30 = jmp 0x00000032(+30)
eb e2 = jmp 0xffffffe4(-30)
那么EIP可以是故意相同的方向,因为fe + 2是00或EIP.
eb fe = jmp 0x00000000
我发现令人惊讶的是,虽然数字是负数,但是过度偏移也会出现分叉.但在英特尔,我发现没有提及(可能因为3000页).
英特尔®64和IA-32架构软件开发人员手册:Vol.2A 3-423
近跳跃,其中跳跃范围从当前 EIP值限制为-128到+127 .
然后我考虑了三种可能性:
Jos*_*phH 18
不管它是否是短跳,它总是如此destination - (source + sizeof(instruction)).在你的情况下(无条件短跳),dst - end_of_jmp是2.这个加法背后的原因是因为一旦cpu执行了指令获取阶段,指令指针将指向分支后面的指令.
nrz*_*nrz 16
它rel8是相对于下一条指令的内存地址,可以通过创建两个可执行文件并反汇编它们来轻松确认:
@label:
jmp @label
nop
Run Code Online (Sandbox Code Playgroud)
这反汇编为(有了ndisasm,它在16位,32位和64位代码中是相同的):
EBFE jmp short 0x0
90 nop
Run Code Online (Sandbox Code Playgroud)
然后,另一个可执行
jmp @label
@label:
nop
EB00 jmp short 0x2
90 nop
Run Code Online (Sandbox Code Playgroud)
因此,rel8始终相对于下一条指令进行编码jmp.然而,反汇编程序(至少ndisasm和udcli)表示它与jmp指令本身有关.这可能会引起一些混乱.
| 归档时间: |
|
| 查看次数: |
28251 次 |
| 最近记录: |