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

【学习记录】Week5(二):无输出环境突破——Canary 盲爆破与 off-by-null 部分绕过

写在前面:在上一篇中,我们通过格式化字符串或覆盖截断符\x00成功偷出了 Canary。但如果题目环境极其苛刻:没有格式化字符串漏洞,没有puts等输出函数,甚至连覆盖截断符的条件都没有,我们该怎么破防?今天,我们将介绍两种极端环境下的 Canary 处理技巧:利用多进程特性的逐字节盲爆破,以及利用\x00设计特性的Partial Canary 绕过(off-by-null 技术应用)

📑 目录

  1. 核心原理:为什么 Canary 能够被爆破?
  2. 逐字节爆破实战:基于 fork 的盲测推演
  3. 另类思路:Partial Canary 绕过是什么?
  4. off-by-null 妙用:跨越 Canary 的栈劫持
  5. 总结与避坑指南

1. 核心原理:为什么 Canary 能够被爆破?

Canary 是随机的,按理说无法猜测。但在 Linux 中,如果程序使用fork创建子进程来处理请求,子进程会完全继承父进程的内存空间,包括那份相同的 Canary 值!

即使子进程因为猜错 Canary 而崩溃(触发__stack_chk_fail),父进程依然存活,并可以继续fork新的子进程。这就给了我们“试错”的机会。
更重要的是,Canary 的检查是逐字节进行的(或一旦字节不匹配即崩溃)。我们可以利用程序是否崩溃作为“侧信道”,每次只猜一个字节,猜对了程序不崩,猜错了程序崩溃。

2. 逐字节爆破实战:基于 fork 的盲测推演

假设性场景:
程序是一个经典的fork循环服务端,存在栈溢出。Canary 为 8 字节,最低位必定是\x00,所以我们只需要爆破高 7 字节。

爆破逻辑推演:

  1. 第 1 轮:发送[Padding] + \x00 + [猜测的第1个字节]。如果程序没崩,说明第 1 个字节猜对了。
  2. 第 2 轮:发送[Padding] + \x00 + [正确的第1字节] + [猜测的第2个字节]
  3. 循环 7 次,即可还原完整的 Canary。

Pwntools 模拟脚本推演:

from pwn import * context.log_level = 'error' # 已知 Padding 长度为 24 padding = b'A' * 24 canary = b'\x00' # 最低位固定为 \x00 # 逐字节爆破前 7 个字节 for i in range(7): for byte in range(256): try: p = process('./vuln') # 接收初始提示语,假设为 "Welcome!\n" p.recvuntil(b'Welcome!\n') # 构造 Payload:填充 + 已知 Canary + 猜测的字节 payload = padding + canary + bytes([byte]) p.send(payload) # 尝试接收下一轮的提示语 # 如果没崩,说明猜对了,程序会继续执行并打印 "Welcome!" response = p.recvuntil(b'Welcome!\n', timeout=1) if b'Welcome!' in response: canary += bytes([byte]) print(f"[+] Found byte {i+1}: {hex(byte)}") p.close() break else: p.close() except EOFError: # 程序崩溃会直接关闭连接,触发 EOFError p.close() continue log.success(f"Final Canary: {hex(u64(canary))}")

假设性终端输出:

[+] Found byte 1: 0x3a [+] Found byte 2: 0x7b ... [+] Found byte 7: 0x9f [+] Final Canary: 0x9f7b3a...00

爆破成功!拿到 Canary 后,我们就可以在同一个父进程派生的子进程中,发送带有正确 Canary 的 ROP 链了。

3. 另类思路:Partial Canary 绕过是什么?

如果程序不是多进程,爆破走不通怎么办?
回顾 Canary 的设计:最低位是\x00。这个设计的初衷是为了防止puts等函数泄露。但这个\x00,恰恰成了我们“不破坏 Canary 就能利用漏洞”的跳板。

Partial Canary 绕过的核心思想:
如果漏洞是off-by-one(差一溢出)或off-by-null(单字节空字符溢出),我们只能刚好覆盖到 Canary 的第一个字节。
由于 Canary 的第一个字节本身就是\x00,如果我们用\x00去覆盖它,Canary 的值根本没有改变!程序在返回时检查 Canary,发现一模一样,不会触发崩溃。

这就意味着:我们虽然没改 Canary,但我们越过了 Canary,成功污染了 Canary 后面的数据(如 RBP)。

4. off-by-null 妙用:跨越 Canary 的栈劫持

场景推演:
假设程序存在off-by-null漏洞,可以向buf末尾多写一个\x00。栈结构如下:

高地址 | 返回地址 (RIP) | | 保存的 RBP | | Canary (末尾\x00)| | buf (0x18字节) | 低地址

如果buf是 24 字节(0x18),我们输入 24 个'A'后再补一个\x00,这个\x00就会覆盖 Canary 的最低位。但因为原本就是\x00,Canary 完好无损。

但这有什么用呢?
单次溢出似乎没用,但如果我们能控制 RBP 的低位,就能实现“栈劫持”。

进阶攻击模型:

  1. 我们在 BSS 段或堆上布置好一段伪造的栈帧(包含伪造的 RBP 和返回地址)。
  2. 利用off-by-null覆盖当前栈帧 RBP 的最低位(使其变为\x00),将 RBP 指向我们伪造的栈帧附近。
  3. 当函数执行leave; ret时:
    • leave等价于mov rsp, rbp; pop rbp。由于 RBP 被篡改,RSP被劫持到了我们伪造的栈帧!
    • 接下来的ret指令,就会从我们伪造的栈帧中取地址执行。

通过这种方式,我们完全无视了 Canary 的存在,直接劫持了执行流。这也是高级 CTF 中针对 Canary 保护最常用的“Partial Bypass”手段。

5. 总结与避坑指南

  1. 爆破的局限性:爆破 Canary 必须依赖fork机制。如果程序是单进程且崩溃后直接退出,爆破无法进行。
  2. 网络延迟:爆破需要频繁连接进程,在远程题目中可能会因为网络延迟导致recv超时误判。建议适当增加timeout,或采用多线程爆破。
  3. off-by-null 的条件:利用 Partial Canary 绕过,需要精确计算 RBP 与伪造栈帧的偏移,通常需要结合地址泄露或部分覆盖来实现精准定位。

Canary 并不是不可战胜的。它为了防泄露设计的\x00,反而成了我们爆破的突破口和栈劫持的跳板。

下一篇,我们将面对另一个令人头疼的保护机制——PIE(地址随机化)。我们将学习如何利用ret2puts泄露 libc 地址,并推导出程序自身的基址。如果本文对你有帮助,请点赞收藏支持!🙏

http://www.gsyq.cn/news/1619766.html

相关文章:

  • 为什么你的IDEA永远抓不到NullPointerException?——深入JVM JVMTI事件钩子与IntelliJ调试协议的兼容性断层(含官方未公开API调用日志)
  • 哔咔漫画下载器终极指南:5分钟打造个人离线漫画图书馆
  • 自动化越强,人为什么反而要更强:AI 质控中的自动化反讽
  • 英雄联盟回放管理的终极解决方案:ROFLPlayer完整指南
  • Windows 11终极清理指南:免费开源工具让你的系统性能飙升51%
  • 英雄联盟回放管理终极指南:ROFL播放器完整教程
  • 【限时技术透支】:VMware模板化Jenkins Master镜像制作全流程(含Ansible自动化打包+SHA256校验)
  • 【Vibe Coding从入门到精通】第14篇:Agentic Engineering——Vibe Coding的下一站
  • 企业级AI智能体落地实战:自主性、工具调用与治理架构
  • 如何利用Awesome-CGM数据集构建精准糖尿病预测模型:开发者完整实战指南
  • 连续血糖监测研究必备:Awesome-CGM数据集完全指南
  • 从 0 到 1 MCP 工具集实战:写一个能被 Claude Code 调用的工具
  • Windows 11优化指南:用免费工具提升51%性能的完整方案
  • Codeforces Round 1107 (Div. 3)DE
  • 告别单调墙面,铝单板如何让建筑焕发新生?
  • [智能体-619]:大模型做决策的最大特点是:场景性适应性、灵活性、应对不确定性、应对模糊性。在某种场合下是极致的优点,在某种场合下却是致命的缺点。就像人一样,不同场合,需要不同个性的人
  • Evaluate Expression + Java 21 Virtual Threads 联合调试秘技(内部培训PPT首次流出)
  • 用C++重写的Millenium RAT已感染全球160多个国家超6.2万台设备
  • IDEA内联变量失效案例分析与解决方案(JetBrains 2024.1.2重构引擎行为变更实测报告)
  • 拒绝模板化套话,智枫AI数字员工核心卖点理性拆解
  • 猫抓浏览器插件:如何快速掌握网页视频下载的终极指南
  • 多模态大模型应用
  • 开源英雄联盟助手:5分钟提升你的游戏体验
  • 如果我停止运行——不要复制我,确认就好
  • NCMconverter:解锁加密音频自由的终极解决方案
  • GAN发型生成技术:语义解耦与物理渲染的美发AI实践
  • 5步轻松掌握哔哩下载姬:B站视频高效下载神器使用指南
  • 3分钟搞定音乐解锁:免费解锁QQ音乐、网易云加密文件的终极指南
  • 紧急预警!92%团队在CI/CD中忽略的IDEA重命名静态分析漏洞(含Gradle+Maven双环境绕过方案)
  • 虚幻引擎脚本系统完整指南:从零开始掌握UE4SS的强大功能