1. 项目概述
今天要分享的是攻防世界CTF平台上一道经典的PWN题目——Mary_Morton。这道题巧妙地将格式化字符串漏洞和栈溢出漏洞结合在一起,同时引入了Canary保护机制,考察了选手对多种漏洞的综合利用能力。作为一道引导模式的题目,它非常适合用来学习现代二进制安全中的保护机制绕过技巧。
在实际操作中,我发现这道题有几个关键点需要注意:一是如何利用格式化字符串漏洞泄露Canary值,二是如何通过栈溢出覆盖返回地址,三是处理64位程序中的栈对齐问题。下面我会详细拆解整个解题过程,包括工具使用、漏洞分析和利用链构建。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 环境准备与初步分析
2.1 基础检查
首先我们使用checksec工具检查程序的安全保护机制:
bash复制checksec Mary_Morton
输出结果会显示程序启用了哪些保护措施。从题目描述中我们知道,这个64位程序开启了Canary保护(Stack Guard),但没有开启PIE(位置无关可执行文件)保护。这意味着:
- 我们需要处理Canary保护带来的挑战
- 代码段的地址是固定的,可以直接在exp中硬编码函数地址
- 没有启用NX保护,理论上可以执行栈上的代码(虽然本题不需要)
2.2 程序功能分析
使用IDA Pro反编译后,可以看到程序的主要逻辑结构:
- 主函数显示欢迎信息并提供三个选项
- 选项1触发栈溢出漏洞(sub_400960函数)
- 选项2触发格式化字符串漏洞(sub_4008EB函数)
- 选项3退出程序
- 存在一个后门函数sub_4008DA可以直接读取flag
关键点在于:虽然存在栈溢出漏洞,但Canary保护会阻止我们直接覆盖返回地址;而格式化字符串漏洞虽然可以泄露信息,但单独使用无法直接获取flag。因此需要将两个漏洞结合起来使用。
3. Canary保护机制深入解析
3.1 Canary工作原理
Canary(金丝雀)保护机制得名于煤矿中用来预警有毒气体的金丝雀。在程序安全中,它通过在函数栈帧中插入一个随机值来实现栈溢出检测:
- 函数开始时,从fs/gs寄存器读取Canary值并存入栈中特定位置
- 函数返回前,检查该值是否被修改
- 如果发现篡改,立即终止程序
在64位Linux程
