如何用NASM汇编基于当前RIP的绝对指针相对调用?
生成RIP相对寻址的Call指令(NASM)
要让NASM生成call qword ptr [rip + 0x540]这类RIP相对寻址的间接调用代码,针对你当前的代码场景,可按以下两种方式实现:
方法1:手动计算RIP偏移量
由于RIP在指令执行时指向当前指令的下一条指令地址(call qword [mem]是5字节指令,执行时RIP = 当前指令地址 + 5),你可以直接通过表达式计算目标地址与RIP的偏移:
BITS 64 DEFAULT REL ORG 0x10000000 abs_addr_of_func_ptr EQU 0x10000600 ... call qword [rip + (abs_addr_of_func_ptr - ($ + 5))]
NASM会自动计算表达式abs_addr_of_func_ptr - ($ + 5)的数值,生成对应的RIP相对偏移指令。
方法2:改用标签定义(更简洁推荐)
如果你的函数指针存储位置用标签而非硬编码EQU定义,开启DEFAULT REL后NASM会自动生成RIP相对寻址:
BITS 64 DEFAULT REL ORG 0x10000000 ; 定义函数指针存储位置 func_ptr: dq 0xXXXXXXXX ; 替换为实际函数指针值 ... call qword [func_ptr]
此时汇编出来的指令会自动采用[rip + 偏移量]的形式,无需手动计算。
内容的提问来源于stack exchange,提问作者SRobertJames
相关产品推荐
相关产品推荐

