1. 项目概述
这是一个关于CTF(Capture The Flag)二进制漏洞利用的实战案例,来自3DSCTF 2016比赛中的一道题目"not_the_same"。这道题考察的是基础的栈溢出漏洞利用技术,通过逆向分析和ROP(Return-Oriented Programming)链构造,最终实现从程序中提取flag。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 逆向分析与漏洞定位
2.1 初步文件检查
首先我们需要对题目提供的二进制文件进行初步检查。原文件名较长,可以重命名为更简洁的名称如"not_same"方便操作。使用file命令查看文件基本信息:
bash复制$ file not_same
not_same: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=..., not stripped
这是一个32位的ELF可执行文件,动态链接且未去除符号表(not stripped),这意味着函数名等符号信息仍然保留,这对逆向分析很有帮助。
2.2 IDA静态分析
使用IDA Pro打开文件进行静态分析。查看main函数时发现一个关键特征:函数没有进行标准的栈帧建立(即没有push ebp; mov ebp, esp这样的序言)。这种非标准函数开头在漏洞利用中值得注意,因为它可能影响栈布局。
在main函数中可以看到明显的gets函数调用:
c复制char buf[0x2d];
gets(buf);
gets函数是典型的危险函数,它不检查输入长度,可以导致缓冲区溢出。这里buf的大小是0x2d(45)字节,任何超过这个长度的输入都会覆盖栈上的其他数据。
2.3 关键函数发现
通过符号表找到一个名为get_secret的函数,其功能是读取flag内容到全局变量fl4g中。查看其反汇编代码:
asm复制mov dword ptr [esp], offset filename ; "flag.txt"
call _fopen
mov [esp+4], e
