【问题标题】:What does fs:0x30 provide in Linux?fs:0x30 在 Linux 中提供了什么?
【发布时间】:2021-12-01 12:15:11
【问题描述】:

我试图理解atexit()函数的源代码,但我坚持this (第 409 行 ~ 第 415 行,PTR_DEMANGLE()

我可以理解 inline asm 需要做一个重要的进步

xor    rdx,QWORD PTR fs:0x30

但我并没有真正理解 fs:0x30 的含义

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

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

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

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

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

【问题讨论】:

  • 顺便说一句,我删除了linux-kernel 标签,因为这段代码不是内核的一部分。 (事实上​​,内核使用 fs / gs 的方式与用户空间完全不同。)
  • fs:0x30 紧邻用于-fstack-protector-strong 的标准 fs:0x28 堆栈 cookie,大多数发行版在其 GCC 配置中默认启用。

标签: assembly x86-64 reverse-engineering glibc thread-local-storage


【解决方案1】:

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 比其数字偏移量更能提供信息。

【讨论】:

  • 0x30这个数字没什么特别的意义真的很有帮助,谢谢!!
猜你喜欢
  • 2014-07-09
  • 1970-01-01
  • 2021-10-10
  • 2010-12-02
  • 2013-12-18
  • 2011-08-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多