RELRO保护

RELRO RELRO(RELocation Read Only) 先从名字上看,翻译一下:重定位只读 只读很好理解,重定位又是什么呢 重定位(RELocation) 在Linux系统安全领域数据可以写的存储区就会是攻击的目标,尤其是 存储函数指针的区域 。 所以在安全防护的角度来说尽量减少可写的存储区域对安全会有极大的好处。 GCC, GNU linker以及Glibc-dynamic linker一起配合实现了一种叫做relro的技术: read only relocation。大概实现就是由linker指定binary的一块经过dynamic linker处理过 relocation之后的区域为 只读 . 设置符号重定向表格为只读或在程序启动时就解析并 绑定所有动态符号 ,从而减少对GOT(Global Offset Table)攻击。RELRO为” Partial RELRO”,说明我们对GOT表具有写权限。 那么GOT表又是干什么的呢? GOT表,PLT表 这涉及到 动态链接 的知识了: 动态链接,是 提高程序空间效率的重要方法 。通过动态链接, 我们可以调用外部共享库中的函数,而不需要将其编译在 可执行文件 中。在运行时动态链接的过程中,PLT表和GOT表起到了至关重要的作用。 GOT: Global Offset Table, 全局偏移表,包含所有需要动态链接的外部函数的地址(在第一次执行后) PLT: Procedure Link Table, 过程链接表 ,包含调用外部函数的 跳转指令 (跳转到GOT表中),以及 初始化外部调用指令 (用于链接器动态绑定dl_runtime_resolve) .plt 段的工作流程: ...

January 29, 2025 · 2 min · 349 words · Chenjx12