Linux系统中fs:0x30的作用是什么?PTR_DEMANGLE宏相关疑问
关于
PTR_DEMANGLE宏及Linux x86_64下fs:0x30的含义 1 fs:0x30的具体作用
x86_64架构的Linux系统中,fs段寄存器默认指向当前进程的**线程本地存储(TLS)**段,fs:0x30这个固定偏移地址存储的是每个进程启动时由内核随机生成的指针加密密钥(pointer guard)。
你看到的xor rdx,QWORD PTR fs:0x30是PTR_DEMANGLE宏的核心逻辑:glibc为了防范函数指针被恶意篡改,会在存储atexit回调这类敏感指针前,用PTR_MANGLE宏将原始指针和这个随机密钥做异或加密;取出使用时再用PTR_DEMANGLE做一次异或解密(同一个值异或两次即可还原原始数据)。如果指针被篡改,解密后会变成非法地址,触发程序崩溃,大幅提升漏洞利用的门槛。
注意不要和Windows系统的规则混淆:你搜索到的fs:0x30对应PEB的结论仅适用于32位Windows,x86_64 Windows使用gs寄存器存储线程相关结构,和Linux的fs段用法完全不互通。
2 这类段偏移的查询参考
这类偏移不属于ELF标准的通用规定,是Linux x86_64平台的特定ABI实现约定,你可以查询《System V AMD64 Architecture Processor Supplement》(业内常简称x86_64 SysV ABI文档),里面明确约定了TLS段固定偏移的用途。这类架构强相关的实现细节,也可以直接查阅对应架构的glibc sysdeps头文件定义。
内容的提问来源于stack exchange,提问作者KSroido
相关产品推荐
相关产品推荐

