假设我有一个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
?
答案 0 :(得分:2)
看起来正确的操作码是48 bf
。我编译以下程序集(使用Intel语法和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