> 今天分享一下以前写过的笔记关一ELF文件的安全保护机制 ``` pwndbg> checksec File: /home/cz/pwn/stack Arch: i386 RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x8048000) Stripped: No ``` 这是使用 `pwndbg` 中的 `checksec` 命令对 ELF 文件安全属性的检查结果。下面是每个字段的含义和解析: --- ### **1. 输出字段解析** | **字段** | **含义** | **检查结果** | |-----------|----------------------------------------------------------------------------------------------|-------------------------| | **File** | 被检查的文件路径。 | `/home/cz/pwn/stack` | | **Arch** | 文件的架构类型,例如 `i386`(32位)或 `x86_64`(64位)。 | `i386` | | **RELRO** | **Relocation Read-Only**,重定位表的保护级别(Partial 或 Full)。 | `Partial RELRO` | | **Stack** | **堆栈金丝雀保护(Stack Canary)**,用于检测缓冲区溢出是否覆盖返回地址。 | `No canary found` | | **NX** | **No eXecute 位**,数据段(如栈和堆)是否被标记为不可执行。 | `NX enabled` | | **PIE** | **位置无关可执行(Position Independent Executable)**,是否启用了地址随机化(ASLR)。 | `No PIE (0x8048000)` | | **Stripped** | 文件是否去除了符号表。如果去掉符号表,调试和反编译会更加困难。 | `No`(未去掉符号表) | --- ### **2. 结果详细解读** #### **RELRO: Partial RELRO** - 启用了部分 RELRO 保护。 - 部分 `GOT` 表(全局偏移量表)被标记为只读,防止部分重定位攻击。 - 但未启用 `NOW` 标志(Full RELRO),意味着在程序运行时,`GOT` 表的重定位仍然可能被覆盖,存在一定的安全风险。 #### **Stack: No canary found** - **未启用堆栈保护(Stack Canary)。** - 如果程序中存在缓冲区溢出漏洞,攻击者可以直接覆盖返回地址或其他关键数据,执行恶意代码。 - 堆栈金丝雀可以在溢出发生时检测异常,但这里没有启用。 #### **NX: NX enabled** - 启用了 **NX(No eXecute)** 位,数据段(如栈、堆)被标记为不可执行。 - 攻击者无法直接在栈上执行 Shellcode,有效防止简单的代码注入攻击。 - 如果攻击者尝试在栈上执行代码,程序会触发段错误。 #### **PIE: No PIE (0x8048000)** - **未启用位置无关可执行(PIE)。** - 程序的加载地址是固定的(基址为 `0x8048000`)。 - 攻击者可以预测内存布局(例如代码段地址),更加容易实施基于地址的攻击(如 ROP 攻击)。 #### **Stripped: No** - **未去掉符号表。** - 程序仍然保留调试信息(如函数名、变量名等符号)。 - 这对攻击者有利,因为符号信息可以帮助快速定位和分析程序中的漏洞。