【发布时间】:2012-03-07 00:02:58
【问题描述】:
在运行时,如何获取寄存器 fs 中的值并计算“call *fs:0x334”中目标函数的地址?我可以使用哪种 x86 程序集?
【问题讨论】:
-
通常选择器(如
fs)有一个值,后面的部分是该值的偏移量。
标签: assembly linux-kernel x86 x86-64
在运行时,如何获取寄存器 fs 中的值并计算“call *fs:0x334”中目标函数的地址?我可以使用哪种 x86 程序集?
【问题讨论】:
fs)有一个值,后面的部分是该值的偏移量。
标签: assembly linux-kernel x86 x86-64
call *fs:0x334中的目标函数地址是fs:0x334中存储的值。
所以,如果你想知道那个地址是什么,你可以加载它。
例如mov rax, [fs:0x334] (nasm) 或 mov %fs:0x334, %rax (gas)。
您不需要知道fs 本身指向什么(这也一样:它指向描述符表中的一个条目,您可能有或可能没有读取权限,它指向一个线性地址,可以通过任何其他段选择器访问,也可以不访问)。
在 x86-64 Linux 上,内核和 glibc 合作以确保 fs 始终指向当前运行线程的线程本地存储区域。 (在 32 位 x86 Linux 上,gs 用于此目的。)
【讨论】: