强制 RIP 相对访问 NASM 中的固定偏移量
Force RIP-relative access to fixed offset in NASM
对于二进制检测项目,我在 NASM 中编写了一大块汇编代码,它在运行时被映射到二进制地址 space。
块在地址 instrument_addr
加载,需要访问地址 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 相对访问?
Nasm 将您的代码解释为“使用相对 rip 寻址的访问地址 0x1000”,因此它失败了。你可以做的是使用$
符号指定一个相对地址,它代表当前指令的地址:
mov rax, qword [rel $+0x1000]
您要查找的语法是 [rel $+0x1000]
表示距当前位置的偏移量,或 [rel instrument+0x1000]
表示距标签的偏移量。在你的问题的例子中,那些恰好是相同的,因为 mov
是标签之后的第一件事,但如果两者之间有任何东西,它们就会不同。
对于二进制检测项目,我在 NASM 中编写了一大块汇编代码,它在运行时被映射到二进制地址 space。
块在地址 instrument_addr
加载,需要访问地址 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 相对访问?
Nasm 将您的代码解释为“使用相对 rip 寻址的访问地址 0x1000”,因此它失败了。你可以做的是使用$
符号指定一个相对地址,它代表当前指令的地址:
mov rax, qword [rel $+0x1000]
您要查找的语法是 [rel $+0x1000]
表示距当前位置的偏移量,或 [rel instrument+0x1000]
表示距标签的偏移量。在你的问题的例子中,那些恰好是相同的,因为 mov
是标签之后的第一件事,但如果两者之间有任何东西,它们就会不同。