#include <stdint.h>
uint64_t rip;
int main()
{
asm(
"movq %%rip, %0\n" : "=m" (rip)
);
sleep(10);
}
当我编译时,我得到了
cc -m64 rip.c -o rip
/tmp/ccwNbZi1.s: Assembler messages:
/tmp/ccwNbZi1.s:12: Error: suffix or operands invalid for `movq'
make: *** [rip] Error 1
答案 0 :(得分:12)
您无法阅读(E|R)IP
,因为没有x86(/ 64)指令可以直接阅读。
阅读&#34;的唯一方法它是用CALL
指令进行调用的。它将保存堆栈上的返回地址和您可以读取的地址。
更新:在64位模式下,您可以利用RIP
- 相对地址,因此LEA RAX, [RIP]
会在EAX
中为您提供自己的地址。另一种解决方法是在装配中MOV RAX, $
。
答案 1 :(得分:-1)
我能想到在x86_64下获取/设置%rip的唯一方法是使用ptrace()。 以下是从ltrace的来源复制的。
void* addr = ptrace(PTRACE_PEEKUSER, pid, (8 * RIP), 0);
ptrace(PTRACE_POKEUSER, pid, (8 * RIP), addr);
其中RIP是/usr/include/sys/reg.h中定义的宏