1. 项目背景与核心挑战
pwn1_sctf_2016是网络安全竞赛中经典的二进制漏洞利用挑战题,源自2016年SCTF(Seccon CTF)赛事。这道题目考察选手对栈溢出漏洞的利用能力,特别针对格式化字符串漏洞和缓冲区溢出两种常见漏洞类型的组合利用。我在实际解题过程中发现,这道题完美展现了早期CTF赛事中"教学级"题目的设计思路——通过可控的漏洞场景,让学习者理解内存操作的基本原理。
这道题目的ELF可执行文件包含以下典型特征:
- 32位架构编译的程序
- 未启用栈保护(Canary)和地址随机化(ASLR)
- 存在明显的gets()函数调用导致的栈溢出漏洞
- 程序中隐藏着关键的后门函数
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆向分析与漏洞定位
2.1 基础逆向工程
使用IDA Pro进行静态分析时,首先注意到main函数的以下关键代码片段:
c复制char s[32];
gets(s);
printf(s);
这段代码存在两个明显问题:
- 使用不安全的gets()函数,不检查输入长度
- 直接使用用户输入作为printf的格式化字符串
通过checksec检查防护机制:
bash复制checksec --file=pwn1_sctf_2016
结果显示:
- RELRO: Partial
- Stack: No canary found
- NX: NX enabled
- PIE: No PIE
2.2 漏洞利用路径规划
结合逆向结果,制定双重利用策略:
- 首先利用格式化字符串漏洞泄露内存信息
- 然后通过栈溢出覆盖返回地址
- 最终跳转到后门函数get_flag
3. 漏洞利用实战过程
3.1 格式化字符串漏洞利用
通过输入特定格式的字符串测试漏洞:
python复制from pwn import *
p = process('./pwn1_sctf_2016')
p.sendline('%p.'*10)
print(p.recv())
观察输出可以获取栈上的数据,包括:
- 程序基地址
- libc地址
- 栈地址
关键发现:通过%n参数可以向指定地址写入数据,这为后续利用奠定基础。
3.2 栈溢出漏洞构造
确定溢出偏移量的经典方法:
p复制
