假设我有一个malloc
-ed 变量,我想将其地址移动到 %rdi
,所有这些都是从 C 生成操作码的。它应该看起来像这样:
unsigned char op_1[] = { 0x48, 0x8B, 0x3C, 0x25 }; //movq
unsigned char *a = malloc(1); // Let's asume a is now at 0x1234567812345678
unsigned char *bytecode = malloc(sizeof(op_1) + sizeof(void *)); // 12 bytes
memcpy(bytecode, op_1, sizeof(op_1)); // 4 bytes
memcpy(bytecode + sizeof(op_1), &a, sizeof(void *)); // 8 bytes
这应该将bytecode
的内容留给:48 8B 3C 25 78 56 34 12 78 56 34 12
.无论如何,这是无效的字节码,因为(如果我没有误读文档(48 8B 3C 25
后跟 4 个字节作为地址。
我的问题是我应该如何将一个 8 字节长的地址移动到%rdi
?
看起来正确的操作码是48 bf
.我编译以下程序集(使用英特尔语法和nasm
(:
BITS 64
mov rdi, 0x1234567812345678
然后我通过objdump -d -w -Mintel
传递结果:
0000000000000000 <.text>:
0: 48 bf 78 56 34 12 78 56 34 12 movabs rdi,0x1234567812345678
操作码48 bf
由 REX 组成。W 前缀48
用于指定 64 位操作数、操作码b8 +
rd io
和寄存器选择器RDI
(111
(:
MOV r64, imm64
: 将imm64
移至r64