1

对于一个二进制检测项目,我在 NASM 中编写了一段汇编代码,它在运行时被映射到二进制的地址空间。

块在 address 被加载instrument_addr,并且需要在 address 访问数据instrument_addr+data_offset,其中data_offset是一些固定的 31 位数字。由于 ASLR,我不知道instrument_addr编译时的值。

由于我不知道我的检测代码的绝对地址,但我的数据的相对偏移量,我想使用 RIP 相对寻址:

; Example for data_offset = 0x1000
0:  48 8b 05 f9 0f 00 00    mov    rax, QWORD PTR [rip+0xff9]    # 1000

然而,最直接的方法

; This is offset 0 of my assembly file
instrument:
    mov rax, qword [rel 0x1000]

只会导致:

$ nasm -f elf64 -o instrument.o instrument.asm
instrument.asm:3: warning: absolute address can not be RIP-relative [-w+other]

[absolute 0x1000]与虚拟标签一起使用会产生相同的警告。

如何强制 NASM 生成对某个固定偏移量的 RIP 相关访问?

4

2 回答 2

3

您要查找的语法是[rel $+0x1000]相对于当前位置的偏移量,或[rel instrument+0x1000]相对于标签的偏移量。在您的问题的示例中,这些恰好是相同的,因为这mov是标签之后的第一件事,但如果两者之间有任何东西,它们会有所不同。

于 2021-11-05T14:24:07.283 回答
2

Nasm 将您的代码解释为“使用 rip-relative 寻址访问地址 0x1000”,因此它失败了。你可以做的是使用$符号指定一个相对地址,它代表当前指令的地址:

mov rax, qword [rel $+0x1000]
于 2021-11-05T14:23:06.333 回答