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
比其数字偏移量更能提供信息。
我正在尝试了解 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
比其数字偏移量更能提供信息。