1. 漏洞环境与背景解析
Pwn69是CTFshow平台上一道经典的栈溢出挑战题,考察选手对x86架构下栈溢出漏洞的利用能力。题目运行在Ubuntu 18.04环境,使用gcc编译时未开启栈保护(-fno-stack-protector)和地址随机化(ASLR关闭),这种配置在CTF比赛中非常典型,便于初学者理解内存布局。
这道题的核心漏洞点在于gets()函数的使用——这个早已被标记为危险的库函数会无限制地读取用户输入,直到遇到换行符或EOF为止。在反编译代码中我们可以看到,程序定义了一个固定长度的字符数组作为缓冲区,但gets()调用时完全没有进行长度检查,这就为栈溢出创造了条件。
注意:现代Linux发行版默认会开启多种保护机制(如NX、ASLR、Canary等),但CTF题目通常会关闭这些保护以便教学。实际漏洞利用时需要根据具体情况调整策略。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 二进制文件初步分析
2.1 基础信息检查
首先用checksec工具查看文件保护机制:
bash复制checksec pwn69
输出结果显示:
code复制Arch: i386-32-little
RELRO: Partial RELRO
Stack: No canary found
NX: NX disabled
PIE: No PIE (0x8048000)
关键信息解读:
- 32位架构(i386):意味着函数参数通过栈传递
- 无栈保护(No canary):可以直接覆盖返回地址
- NX disabled:栈内存可执行,可以部署shellcode
- 无地址随机化(No PIE):代码段地址固定
2.2 反编译核心逻辑
使用Ghidra或IDA分析main函数,关键代码如下:
c复制void vulnerable_function() {
char buffer[64];
gets(buffer);
}
int main() {
vulnerable_function();
return 0;
}
从伪代码可见:
- 定义64字节的字符数组
- 直接调用gets()读取输入
- 无任何长度检查或保护措施
通过gdb调试可以确认,在32位系统中,buffer起
