【发布时间】:2021-11-05 14:07:23
【问题描述】:
对于一个二进制检测项目,我在 NASM 中编写了一段汇编代码,在运行时将其映射到二进制的地址空间。
块被加载到地址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 相关访问?
【问题讨论】:
标签: assembly x86-64 nasm addressing-mode relative-addressing