1概念
-
ELF。Exucutable and Linkable Format,译为“可执行和可链接的格式”。
它是关于可执行文件、对象代码、共享库和内核导出的一种公共标准文件的格式定义,广泛应用于类unix系统。每个ELF文件由三个部分组成:Program header table、Sectoin header table、Data referred to above。
-
PIC。Position-Independent Code,译为“位置无关代码”。
在计算机系统中,PIC是可以在主存中不同位置执行的目标代码。PIC经常被用在共享库中,这样就能将相同的库代码为每个程序映射到一个位置,不用担心覆盖掉其他程序或共享库。 -
PIE。Position-Independent Executable,译为“位置无关可执行程序”。
它是完全由位置无关代码所组成的可执行二进制文件,有时可称为PIC Executable。它有一个显著的优点,那就是当程序加载时,所有PIE二进制文件以及它所有的依赖都会加载到虚拟内存空间中的随机位置(随机地址),可以有效提高他人通过绝对地址实施"return-to-libc"安全攻击的难度。 -
GOT。Global Offset Table。全局偏移量表。
它是数据字段的地址存储表。它被可执行程序用于查看全局变量的运行时地址,这些变量的地址在编译阶段是未知的。在进程引导阶段,动态链接器会更新GOT。 -
PLT。Procedure Linkage Table。过程链接表
它将位置无关的的函数调用转换为绝对地址。形象的比喻,PLT像蹦床一样,将对共享函数的调用弹向正确的方向。 -
Lasy Loading/Lasy Binding。延迟加载。
在位置无关代码PIC中一般不能包含动态链接库中符号的绝对地址。当运行某个调用动态库函数符号的用户态程序时,用户态程序在编译链接阶段并不知晓该符号的具体位置,只有等到运行阶段,动态加载器将所需要的共享库加载到内存后,才最终确定符号的地址。而在编译阶段所有与位置无关的函数调用都将被保存到ELF文件的过程链接表PLT(Procedure Linkage Table)中。
2 引用
- [1].非常详细的介绍了FPIC的原理,PLT与GOT
- [2].gcc 编译工具(上)— 编译过程和原理浅析
- [3].Return-to-libc attack
- [4].GOT和PLT示例1
- [5].GOT和PLT示例2