首页 文章

如何在x86中编码相对较短的jmp

提问于
浏览
15

假设我想使用以下操作码进行短跳转:

EB CB或JMP rel8“跳转短路,RIP = RIP 8位位移符号扩展到64位”(其中CB是一个字节有符号值,表示与EIP寄存器中的方向相关的相对偏移)

也许总是偏移量将偏移2,因为此短跳转中的执行时间(参考方向)中的EIP是twobyte指令的基础,但是加数occurs always

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 .

然后我考虑了三种可能性:

  • 是2,因为是执行时间内EIP的后/后值

  • 编码值不是2s分量编码的有符号数 .

  • 这出现在手册中,但我没有看到,因为我很愚蠢

3 回答

  • 16

    无论是's short jump or not, it'总是 destination - source + sizeof(instruction) . 在你的情况下(无条件短跳), sizeof(instruction) 是2.这个加法背后的原因是因为一旦cpu执行了指令获取阶段,指令指针就会指向分支之后的指令 .

  • 18

    跳转短路相对于跳转指令的末尾(长度为两个字节)采用EIP,并采用一个字节操作数,该操作数被符号扩展并添加到EIP .

  • 5

    rel8 相对于下一条指令的内存地址,可以通过创建两个可执行文件并将其拆解来轻松确认:

    @label:
        jmp @label
        nop
    

    这反汇编为(有了ndisasm,它在16位,32位和64位代码中是相同的):

    EBFE jmp short 0x0
    90   nop
    

    然后,另一个可执行

    jmp @label
    @label:
        nop
    
    EB00 jmp short 0x2
    90   nop
    

    因此, rel8 始终相对于 jmp 之后的下一条指令进行编码 . 但是,反汇编程序(至少 ndisasmudcli )显示它相对于 jmp 指令本身 . 这可能会引起一些混乱 .

相关问题