You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Partial与Full RELRO的差异及ELF中Full RELRO的检测方法

Partial 与 Full RELRO:GOT保护差异及ELF检测方法

核心差异:GOT保护的实际区别

RELRO(Relocation Read-Only)是一种安全机制,通过将重定位相关内存段设为只读来防范GOT篡改攻击。Partial和Full RELRO的核心区别体现在绑定时机和GOT的只读覆盖范围:

  • Partial RELRO(编译参数:-Wl,-z,relro,-z,lazy):

    • 采用延迟绑定(lazy binding)机制,函数首次被调用时才完成重定位操作。
    • 虽然readelf显示GNU_RELRO段覆盖了.got和.got.plt,但.got.plt的前3个特殊条目(指向_DYNAMIC、链接器内部管理结构等)会被动态链接器保留为可写状态,用于支持延迟绑定的运行时管理——这部分是GOT劫持攻击的潜在突破口。
    • 程序启动速度更快,因为重定位工作被延迟到实际函数调用时执行。
  • Full RELRO(编译参数:-Wl,-z,relro,-z,now):

    • 采用立即绑定(immediate binding)机制,所有重定位操作在程序启动阶段就全部完成。
    • 整个GOT区域(包括.got和.got.plt的所有条目)都被GNU_RELRO段覆盖,且程序加载后会被内核标记为完全只读,彻底阻断GOT篡改的可能。
    • 程序启动速度略有下降,但安全防护强度更高。

你观察到两者的GNU_RELRO段都覆盖GOT,是编译阶段的段布局特征,但运行时的权限差异才是关键——Partial RELRO会保留.got.plt的小部分可写区域,而Full RELRO则实现了GOT的完全只读保护。

解析ELF检测Full RELRO的方法

要在你的ELF解析库中实现Full RELRO检测,需要同时验证两个核心条件:

1. 检查是否存在PT_GNU_RELRO程序段

遍历ELF的Program Headers(程序头),查找p_type为PT_GNU_RELRO的段。这是RELRO机制生效的基础,Partial和Full RELRO都会包含这个段。

2. 检查动态段中的BIND_NOW标志

遍历动态段(PT_DYNAMIC类型程序头指向的动态条目),查找以下标志:

  • 在DT_FLAGS条目中,检查是否包含DF_BIND_NOW(数值为0x1)。
  • 若使用新标志格式,检查DT_FLAGS_1条目中是否包含DF_1_NOW(数值为0x800)。

只有同时满足「存在PT_GNU_RELRO段」和「设置了BIND_NOW标志」的ELF文件,才属于Full RELRO。若仅存在PT_GNU_RELRO段但无BIND_NOW标志,则为Partial RELRO。

验证示例

你可以用以下命令快速验证动态段的标志差异:

# 查看Full RELRO程序的动态标志
readelf -d full | grep -E '(BIND_NOW|FLAGS)'

# 查看Partial RELRO程序的动态标志
readelf -d partial | grep -E '(BIND_NOW|FLAGS)'

Full RELRO的输出会明确包含BIND_NOW字段,而Partial RELRO则不会。

内容的提问来源于stack exchange,提问作者Daniel Walker

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.14 13:44:56