【发布时间】:2020-04-24 11:15:33
【问题描述】:
在 64 位 C 程序中,使用 glibc、pthreads 等(没有什么特别的),在当前内核和 glibc 版本上覆盖 GS 寄存器而不恢复它是否安全?我知道 pthreads/glibc 使用 FS 寄存器作为线程本地存储块指针,所以弄乱它会破坏任何使用 TLS 的东西,但我不确定 GS
如果不是,保存该值,覆盖它,然后恢复该值是安全的,只要覆盖时的用户态代码不执行 X(X 是什么)?
【问题讨论】:
-
是的,但您可能需要
arch_prctl(ARCH_SET_GS, foo); -
@Jester - 通常,也许是的 - 但在这里我想用它作为一个肮脏的黑客来检测中断(如here 所述重置 fs 和 gs),作为分析其他内容的一部分,因此需要避免系统调用(我假设
arch_prtrl在幕后使用)。
标签: linux assembly pthreads x86-64 memory-segmentation