fs:0x30 在 Linux 中提供什么?

KSr*_*ido 4 assembly glibc reverse-engineering x86-64 thread-local-storage

我试图理解atexit()函数的源代码,但我坚持这一点 (第 409 行〜第 415 行,PTR_DEMANGLE()

我可以理解内联汇编需要取得重大进展

xor    rdx,QWORD PTR fs:0x30
Run Code Online (Sandbox Code Playgroud)

但我真的不明白 fs:0x30 的含义是什么

所以我搜索了google但只得到了Windows上fs:0x30的含义,这与PEB相关

我还尝试搜索PTR_DEMANGLE()函数,并找到了这个,但没有帮助

这也给我提出了一个新问题:

比如说,我需要知道 fs:0xXX 的用法,这是很少使用的。我应该直接参考哪本手册?ELF标准文件?

顺便说一句,英语不是我的母语,这篇文章可能有一些语法或拼写错误,请原谅我,非常感谢!

Nat*_*dge 6

x86-64 Linux 中使用段寄存器fs来指向线程本地存储。请参阅Linux AMD64 中如何使用 fs/gs 寄存器?因此,该指令将使用rdx线程本地存储块中偏移 0x30 处找到的值对寄存器进行异或。

该代码是 glibc 中指针加密机制的一部分,有助于强化针对某些漏洞的攻击。https://sourceware.org/glibc/wiki/PointerEncryption有一些解释。at 的值fs:0x30是一个简单“加密”算法的“密钥”;指针在存储时与该值进行异或(然后旋转),并在从内存中检索时再次旋转并进行异或,从而恢复原始指针。

0x30这个数字没有什么特别的意义;它恰好是存储该值的偏移量。你可以在内联汇编中看到这个数字来自offsetof (tcbhead_t, pointer_guard);因此基地址处的存储fs被布置为tcbhead_t结构体,并且考虑到它包含的其他成员,该pointer_guard成员最终位于 offset 处0x30pointer_guard因此,查看成员的名称比其数字偏移量更能提供信息。