X86-64 Instruction Encoding
General Overview
x86-64 instruction最多15字节,include:
- Legacy prefixes(1-4 bytes 非必须)
- Opcode with prefixes(1-4 bytes 必须)
- ModR/M(1 byte 必须)
- SIB(1 byte scale index base 必须)
- Displacement(1,2,4 or 8 bytes 非必须)
- Immediate(1,2,4 or 8 bytes 非必须)
Legacy Prefixes
Opcode
x86-64 instruction定义了许多操作码和编码方式,取决于指令本身及其功能
Legacy opcodes
Legacy (and x87) opcodes consist of, in this order:
- mandatory prefix;
- REX prefix;
- opcode.
Encoding

- W 为1时表示64位,为0时取默认值(大多数但并非所有指令都是 32 位)
- R MODRM.reg 字段的扩展
- X SIB.index 字段的扩展
- B MODRM.rm 字段或 SIB.base 字段的扩展
opcode
opcode可以是1,2,3个字节
- <op>
- 0x0F <op>
- 0x0F 0x38 <op>
- 0x0F 0x3A <op>
ModR/M and SIB bytes
ModR/M 和 SIB 字节用于对一条指令的操作数(最多两个)进行编码,每个操作数都是直接寄存器或有效内存地址。
ModR/M
全称:Mode-Register/Memory

- MODRM.mod 该字段为b11时采用直接寻址方式,否则为间接寻址
- MODRM.reg 有两种情况
- A 3-bit opcode extension 由某些指令使用,但除了将该指令与其他指令区分开来之外没有其他含义。
- A 3-bit register reference 可用作指令的源或目标(取决于指令),引用的寄存器取决于指令的操作数大小和指令本身。REX.R、VEX.~R 或 XOP.~R 字段可以将此字段从 1 个最高有效位扩展为总共 4 位。
- MODRM.rm 指定直接或间接寄存器操作数,可选地带有位移,REX.B,VEX.B或XOP.B字段可以将此字段从1个最高有效位扩展至总共4位。
SIB

实战运用
0x49最低位为1拓展了MODRM.rm,0x00选取寄存器r8,0x48最低为为0,0x03选取寄存器rbx

以ptrace读取寄存器的值后模拟执行

参考文章:
https://wiki.osdev.org/X86-64_Instruction_Encoding#32/64-bit_addressing_2
https://blog.csdn.net/JimFire/article/details/112652145

浙公网安备 33010602011771号