如何在NASM中强制生成指向固定偏移的RIP相对寻址访问指令
NASM生成指定固定偏移的RIP相对寻址指令的方法
报错
absolute address can not be RIP-relative的核心原因是:直接写[rel 0x1000]时,NASM会将0x1000识别为绝对内存地址,而非相对于插桩代码基址的偏移,自然无法生成合法的RIP相对寻址指令。
方法1:基于代码段起始标签计算(最稳妥)
直接将目标地址声明为相对于代码段起始标签instrument的偏移,NASM会自动计算RIP所需的立即数偏移,不需要手动计算指令长度:
; This is offset 0 of my assembly file instrument: mov rax, qword [rel (instrument + 0x1000)]
如果要适配不同的data_offset,可以用equ定义常量,修改更方便:
data_offset equ 0x1000 instrument: mov rax, qword [rel (instrument + data_offset)]
方法2:基于段起始符$$计算
如果不想硬编码标签名,可以用NASM内置的$$关键字,代表当前段的起始地址(和示例中的instrument地址完全一致):
instrument: mov rax, qword [rel ($$ + 0x1000)]
效果验证
用上述代码执行编译命令nasm -f elf64 -o instrument.o instrument.asm后,反汇编可以得到你需要的目标指令:
0: 48 8b 05 f9 0f 00 00 mov rax, QWORD PTR [rip+0xff9] # 0x1000
内容的提问来源于stack exchange,提问作者janw
相关产品推荐
相关产品推荐

