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

What does fs:0x30 provide in Linux?

我正在尝试了解 atexit() function,but I stuck on this 的源代码 (第409行~第415行,PTR_DEMANGLE())

我能理解内联 asm 需要做一个重要的进步

xor    rdx,QWORD PTR fs:0x30

但我并没有真正理解 fs:0x30 对

的意义

所以我搜索了google但只得到了Windows上的fs:0x30的意思,它与PEB

相关

我也试过直接搜索PTR_DEMANGLE()函数,找到了this,但是没用

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

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

顺便说一句,英语不是我的第一语言,这个post可能有一些语法或拼写错误,请原谅,非常感谢!

fs 段寄存器在 x86-64 Linux 中用于指向线程本地存储。请参阅 How are the fs/gs registers used in Linux AMD64? 因此,此指令将 rdx 寄存器与线程本地存储块中偏移量 0x30 处找到的值进行异或运算。

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

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