CTF 夺旗赛这几年在国内的热度肉眼可见地涨,尤其是高校和刚入行的安全新人,几乎把 CTF 当成入门安全的第一块敲门砖。但真上手之后你会发现,网上教程要么是零散的 WriteUp,要么是直接甩一堆工具让你自己悟,中间那条"从零到能独立解题"的路,几乎没人给你铺完整。这篇内容就是冲着这个缺口来的——把 CTF 从基础概念到 Web、盲注、逆向、Pwn 四大方向的解题思路,按一个新手真正能跟下来的顺序讲清楚。不管你是刚听说 CTF 想试试水,还是打过几场线上赛但总卡在签到题之后,这篇都能给你一套能直接照着练的路径。
1. 先搞清楚 CTF 到底在考什么
1.1 夺旗赛的本质:不是黑客炫技,是解题竞赛
很多人第一次听到"夺旗赛"这名字,脑子里浮现的是电影里那种黑进系统、满屏绿色代码的画面。实际上 CTF(Capture The Flag)的本质非常朴素:出题人把一段隐藏信息(flag)藏在一个精心构造的题目环境里,你要用技术手段把它找出来,提交到平台换积分。flag 通常长这样:flag{xxxxx}或者ctfshow{xxxxx},格式由平台规定。
它和真实渗透最大的区别在于:CTF 是可控环境下的解题,真实渗透是不可控环境下的对抗。CTF 题目里的漏洞是出题人故意留的,路径是设计好的,你不需要考虑"打进去会不会违法"这种问题。这也是为什么它特别适合新手——你可以在一个完全合法的沙箱里,把各种漏洞原理摸透。
从题型上分,主流方向有这么几类:
| 方向 | 英文 | 核心考察 | 典型题目 |
|---|---|---|---|
| Web | Web | 网站漏洞利用 | SQL注入、文件包含、命令执行 |
| 逆向 | Reverse | 程序逻辑分析 | 反编译、算法还原 |
| Pwn | Pwn | 二进制漏洞利用 | 栈溢出、格式化字符串 |
| 杂项 | Misc | 综合信息处理 | 隐写、编码、流量分析 |
| 密码学 | Crypto | 密码算法破解 | RSA、古典密码 |
新手最容易上手的其实是 Misc 和 Web,因为这两块对底层要求低,反馈快。逆向和 Pwn 需要你有一定的汇编、C 语言、操作系统基础,门槛明显高一截。但反过来说,逆向和 Pwn 的分数通常也更高,因为能解的人少。
1.2 新手第一个月该练什么,不该碰什么
我带过不少刚入门的朋友,最常见的错误就是"什么都想学"。今天看 Web 觉得有意思,明天看逆向觉得酷,结果一个月下来哪个方向都是半吊子。我的建议非常明确:第一个月只碰 Misc 和 Web 基础,逆向和 Pwn 先放着。
原因很简单。Misc 里的编码转换、隐写、流量分析,能让你快速建立"信息可能藏在任何地方"的直觉;Web 基础里的 SQL 注入、文件包含,能让你理解"程序是怎么被绕过的"。这两块练熟了,你对"漏洞"这个概念会有实感。而逆向和 Pwn,如果你连 C 语言的指针都没搞明白,看汇编就是看天书,纯属浪费时间。
具体练什么?我列一个我实际带人用过的清单:
- 第一周:编码类题目。Base64、URL 编码、十六进制、摩斯密码、凯撒密码,这些在"随波逐流"这类编码工具里都能一键处理,但你要手动搞懂每种编码的原理,而不是无脑点按钮。
- 第二周:隐写类题目。图片隐写(LSB、EXIF)、压缩包伪加密、文件头修复。这类题目在青少年 CTF、CTF Show 的入门区一抓一大把。
- 第三周:Web 基础。先搞懂 HTTP 协议,再练 SQL 注入的手工注入,别一上来就用 sqlmap。
- 第四周:综合刷题。找一场往期的入门赛,限时三小时,模拟真实比赛节奏。
提示:不要一上来就追求"解出难题"。新手阶段最重要的是建立正反馈,签到题解出来也是解出来,先把信心攒起来。
1.3 环境准备:一台干净的虚拟机比什么都重要
CTF 练习过程中你会下载大量来路不明的文件、运行各种工具,强烈建议在虚拟机里操作。这不是危言耸听,有些题目附件本身就可能带点"惊喜",你在宿主机上跑,出了问题哭都来不及。
我的环境配置是这样的:
- 虚拟机软件:VMware 或 VirtualBox 都行,看个人习惯。
- 系统:Kali Linux 是首选,因为它预装了绝大多数 CTF 工具。但我不建议新手直接用 Kali 当主力,因为工具太多反而不知道用哪个。可以先装个 Ubuntu,需要什么工具自己装,装的过程就是学习的过程。
- 快照:装好系统第一件事就是打快照。之后每次做危险操作前再打一个,出问题直接回滚,比修复快得多。
工具方面,新手阶段必备的就这几个:
# 编码转换 pip install pycryptodome # 图片隐写 apt install steghide binwalk exiftool # Web 抓包 # Burp Suite 社区版,官网下载 # 逆向基础 apt install gdb radare2工具不在多,在于你知不知道它解决什么问题。我见过有人装了几十个工具,结果遇到题目还是不知道从哪下手,这就是典型的"工具收集癖"。
2. Web 方向:从看懂一个请求开始
2.1 HTTP 协议不熟,Web 题永远做不明白
Web 题的所有漏洞,本质上都是"你发的请求和服务器预期的请求不一致"。所以你必须先搞清楚一个正常的 HTTP 请求长什么样。
用 Burp Suite 抓一个最简单的登录请求,你会看到类似这样的东西:
POST /login.php HTTP/1.1 Host: target.com Content-Type: application/x-www-form-urlencoded Cookie: PHPSESSID=abc123 username=admin&password=123456这里面每一行都有意义。POST是方法,/login.php是路径,Host是目标主机,Cookie是身份凭证,最后一行是提交的数据。Web 题里常见的操作就是改这些东西:把GET改成POST、在 Cookie 里塞点东西、在参数里加个单引号看看报不报错。
我建议新手做一件事:每做一道 Web 题,都先把完整的请求和响应抄一遍。抄着抄着你就对协议有感觉了。这比看十篇协议讲解都管用。
2.2 SQL 注入:手工注入是必修课,sqlmap 是选修课
SQL 注入是 Web 题里出现频率最高的考点之一。原理说穿了很简单:程序把用户输入直接拼进了 SQL 语句,导致你可以通过构造特殊输入改变 SQL 的语义。
举个最经典的例子。假设后台查询是这样的:
$sql = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";如果你在用户名里输入admin' --,拼接后的语句就变成:
SELECT * FROM users WHERE username = 'admin' -- ' AND password = 'xxx'--是 SQL 注释符,后面的密码判断直接被注释掉了,你就能以 admin 身份登录。
新手做注入题,我强烈建议先手工,再工具。手工注入的完整流程是这样的:
- 判断注入点:在参数后面加单引号
',看是否报错;加and 1=1和and 1=2,看页面是否不同。 - 判断字段数:用
order by 1、order by 2逐个试,直到报错,就知道有几个字段。 - 判断回显位:用
union select 1,2,3看哪几个数字会显示在页面上。 - 爆库爆表:把回显位替换成
database()、group_concat(table_name)等函数,逐步拿到数据。
这个过程听起来繁琐,但每一步都在训练你对 SQL 的理解。等你手工能盲注出数据了,再用 sqlmap,你才知道它在干什么,而不是把它当黑盒。
注意:盲注是 SQL 注入里比较特殊的一类,页面不回显数据也不报错,你只能通过"真/假"或者"时间延迟"来判断。这类题目手工做非常耗时,通常需要写脚本。Python 的 requests 库配合二分法是标准解法。
2.3 命令执行与文件包含:最容易被忽视的两个高频考点
命令执行(RCE)和文件包含(LFI)是 Web 题里另外两个大头。命令执行的典型场景是程序调用了系统命令,比如ping一个地址,而你没有过滤输入,就能用;、|、&&这些符号拼接额外命令。
比如题目里有个功能是"输入 IP 查询信息",后台执行的是:
ping -c 1 $ip你输入127.0.0.1; cat /flag,实际执行的就变成:
ping -c 1 127.0.0.1; cat /flagflag 就直接出来了。热词里提到的"ctf命令执行passthru"就是这个套路,passthru是 PHP 里执行系统命令并直接输出结果的函数,遇到它基本就是命令执行题。
文件包含则是程序用include、require这类函数加载文件,而文件名可控。你可以用../../etc/passwd读取系统文件,或者配合 PHP 伪协议php://filter读取源码。这类题目的关键是先读源码,再找利用点,因为源码里往往藏着过滤规则和 flag 位置。
这两个考点我单独拎出来讲,是因为它们特别容易被新手忽略。很多人一看到 Web 题就想着 SQL 注入,结果题目其实是命令执行,白白浪费时间。
3. 逆向与 Pwn:门槛高,但值得啃
3.1 逆向入门:从看懂一个简单程序的逻辑开始
逆向(Reverse)的核心任务是:给你一个编译好的程序,你通过分析它的汇编代码,还原出它的逻辑,找到 flag 或者找到能通过验证的输入。
新手学逆向,最大的障碍是汇编。但我要告诉你一个好消息:入门级逆向题,你不需要精通汇编。你只需要认识几个关键指令,配合反编译工具,就能看懂大部分逻辑。
必备工具就两个:
- IDA Pro:逆向界的标杆,免费版够用。它的 F5 反编译功能能把汇编转成接近 C 的伪代码,极大降低阅读难度。
- Ghidra:NSA 开源的逆向工具,功能不输 IDA,完全免费。
入门逆向题的典型套路是这样的:程序让你输入一个字符串,然后逐字符和某个值比较,全对就输出 flag。你用 IDA 打开,找到比较逻辑,把那个值读出来就行。热词里的"polar ctf keyboard2.0"、"ctf 符号密码"这类题目,基本都是这个模式。
我建议的练习路径:
- 先做"输入密码,正确就通过"的题目,熟悉 IDA 的基本操作。
- 再做带简单加密的题目,比如输入经过异或、移位后比较。
- 最后做需要写脚本还原算法的题目。
每一步都不要跳。逆向是个积累活,你见过的模式越多,解题越快。
3.2 Pwn 入门:栈溢出是绕不过去的第一关
Pwn 是 CTF 里技术含量最高、也最劝退的方向。它的核心是利用二进制程序的漏洞,控制程序的执行流。入门 Pwn 的第一课永远是栈溢出。
栈溢出的原理:程序在栈上分配了一块缓冲区,但没有检查输入长度,你输入超长数据就能覆盖栈上的返回地址,从而控制程序跳转。听起来抽象,用个例子说明:
void vulnerable() { char buf[16]; gets(buf); // gets 不检查长度,危险 }buf只有 16 字节,但你输入 100 字节,多出来的就会覆盖栈上的其他数据,包括函数返回地址。如果你把返回地址覆盖成某个函数的地址,函数返回时就会跳到那里执行。
Pwn 入门需要掌握的东西:
- 汇编基础:至少能看懂函数调用、栈操作。
- 调试工具:gdb 配合 pwndbg 插件,是标配。
- Python 脚本:pwntools 库是 Pwn 题的必备,用来和远程服务交互。
from pwn import * p = remote('target.com', 9999) payload = b'A' * 16 + p64(0xdeadbeef) p.sendline(payload) p.interactive()上面这段就是最基础的 Pwn 脚本框架。b'A' * 16是填充缓冲区,p64(0xdeadbeef)是覆盖返回地址。实际题目里,这个地址通常是某个后门函数或者system("/bin/sh")的地址。
Pwn 的学习曲线很陡,但一旦入门,你会发现它是最有"黑客感"的方向。我的建议是:先把栈溢出吃透,再碰堆漏洞。堆(heap)相关的漏洞利用复杂度是栈的好几倍,新手直接上堆,基本就是劝退。
3.3 逆向和 Pwn 的共通基础:别跳过 C 语言和操作系统
我见过太多人想直接学逆向和 Pwn,结果卡在"看不懂指针"、"不知道栈和堆的区别"上。这两个方向的地基是 C 语言和操作系统,你跳不过去。
具体要掌握到什么程度:
- C 语言:指针、数组、结构体、函数调用约定,这些必须熟。不用会写复杂程序,但要能看懂。
- 操作系统:进程的内存布局(代码段、数据段、堆、栈)、虚拟内存、系统调用。
- 汇编:x86-64 的常用指令,能看懂函数序言和尾声。
这些基础打牢了,逆向和 Pwn 的学习速度会快很多。反过来,基础不牢,你就是在沙子上盖楼。
4. 实战节奏:怎么把练习转化成比赛能力
4.1 刷题平台怎么选,题怎么刷
国内免费的 CTF 练习平台不少,CTF Show、青少年 CTF、BUUCTF 都是常见的选择。我的建议是主攻一个平台,别到处撒网。每个平台的题目风格不同,你在一个平台上刷到一定量,才能形成对题型的手感。
刷题的正确姿势不是"做完就过",而是:
- 做完写 WriteUp:把解题思路、用到的工具、踩的坑都记下来。写的过程就是复盘。
- 定期回看:一周后回头看自己写的 WriteUp,如果看不懂了,说明当时没真懂。
- 同类题归纳:把同一类型的题目放一起对比,找出通用解法。
热词里提到的"ctf 盖房子"、"ctf 拯救芙莉莲"这类题目,往往是 Misc 里的趣味题,考察的是信息搜集和脑洞。这类题目没有固定套路,靠的是经验积累。
4.2 比赛中的时间分配和心态管理
线上赛通常是 24 到 48 小时,题目按难度分档。新手最容易犯的错是死磕一道题。我的经验是:
- 开赛后先花 15 分钟把所有题目过一遍,标记出有思路的。
- 优先做签到题和简单题,把能拿的分先拿到。
- 一道题卡超过 40 分钟没进展,果断换题,回头再看。
- 善用队伍的协作,Web 手、逆向手、Pwn 手各司其职。
心态上,新手参加比赛不要盯着排名。你的目标是"比上一场多解一道题",这就够了。CTF 是个长期积累的过程,急不来。
4.3 从解题到出题:检验自己是否真懂
当你刷了一定量的题目后,我强烈建议你尝试自己出一道题。出题的过程会逼你把一个漏洞的每个细节都想清楚:环境怎么搭、flag 藏哪、怎么防止非预期解。
出题是检验学习成果最好的方式。你能出一道别人解不出来的题,说明你对这个知识点是真的通了。而且出题还能锻炼你的环境搭建能力,这对以后做安全研究也有帮助。
5. 那些没人告诉你但很重要的细节
5.1 工具用得好,不如原理懂得透
CTF 圈子里有个现象:很多人工具用得飞起,但问他原理就说不清楚。这种"工具人"在简单题上没问题,一遇到变形题就抓瞎。
我举个真实的例子。有次比赛遇到一道 SQL 注入题,常规的union select被过滤了,很多人直接放弃。但如果你懂原理,就知道可以用布尔盲注、时间盲注、报错注入等多种方式绕过。工具是死的,原理是活的。
所以我的建议是:每学一个工具,都要搞懂它背后的原理。用 sqlmap 之前,先手工注入一遍;用 IDA 之前,先试着用 gdb 看汇编。这个过程慢,但扎实。
5.2 编码和隐写:Misc 题的半壁江山
Misc 题里,编码和隐写占了很大比例。热词里的"ctf 二维码"、"ctf 符号密码"、"随波逐流 ctf 编码工具"都指向这块。
常见的编码类型和识别方法:
| 编码类型 | 特征 | 工具 |
|---|---|---|
| Base64 | 结尾常有 =,字符集 A-Za-z0-9+/ | 在线工具、Python |
| URL 编码 | %XX 形式 | 浏览器、Python |
| 十六进制 | 0-9A-F 组成 | xxd、Python |
| 摩斯密码 | 点和划 | 在线工具 |
| 凯撒密码 | 字母位移 | 暴力枚举 |
隐写方面,图片隐写最常见。LSB 隐写是把信息藏在像素的最低有效位,用 Stegsolve 可以直观看到;EXIF 隐写是把信息藏在图片元数据里,用 exiftool 一读就出来;文件尾附加是把信息藏在图片文件末尾,用 binwalk 或十六进制编辑器能看到。
这些技巧听起来简单,但比赛时能不能快速反应过来,靠的就是平时的积累。
5.3 别忽视流量分析和内存取证
流量分析(pcap)和内存取证是 Misc 里比较进阶的考点,但出现频率不低。热词里的"pcap ctf python"就是指用 Python 处理 pcap 文件。
流量分析题通常给你一个抓包文件,flag 藏在某个请求里。用 Wireshark 打开,按协议过滤,追踪 TCP 流,往往就能找到。进阶一点的会涉及文件提取,比如从 HTTP 流量里还原出传输的文件。
内存取证则是给你一个内存镜像,让你从中提取信息。工具主要是 Volatility,可以列出进程、提取文件、查找关键字。这类题目对操作系统知识要求较高,新手可以先了解,不用急着深入。
5.4 关于 AI 辅助解题的理性看待
最近"ai ctf"、"部署智能体做 ctf 题目"这些词很热。AI 确实能辅助解题,比如帮你识别编码、生成脚本框架、解释汇编代码。但我要泼盆冷水:AI 目前还替代不了你对原理的理解。
AI 能帮你快速处理重复性工作,但遇到需要创造性思维的题目,还是得靠人。而且过度依赖 AI,你的基本功会退化。我的建议是把 AI 当助手,不是当拐杖。用它来加速,不用它来替代思考。
6. 给不同阶段练习者的具体建议
6.1 纯新手:先建立"解题感"再谈技术深度
如果你完全没接触过 CTF,第一步不是学技术,是建立解题感。什么叫解题感?就是拿到一道题,你知道从哪下手,知道信息可能藏在哪里。
建立解题感最快的方式是刷签到题。每个平台的签到题都是给新手准备的,难度低、反馈快。你连续做十道签到题,对 CTF 的节奏就有感觉了。
这个阶段不要追求技术深度,不要想着"我要学 SQL 注入",而是"我要把这道题解出来"。解题过程中遇到什么学什么,这种学习方式效率最高。
6.2 有基础但卡瓶颈:回头补底层知识
如果你已经能解一些题,但总是卡在某些类型上,问题往往出在底层知识。比如 Web 题卡在协议细节,逆向题卡在汇编,Pwn 题卡在内存布局。
这时候正确的做法是停下来补基础,而不是继续刷题。刷题只能巩固你已经会的,补基础才能突破瓶颈。具体补什么,前面几节都讲了,这里不重复。
6.3 想打比赛:模拟赛是最好的训练
准备打比赛的最好方式就是打模拟赛。找一场往期的比赛,按真实规则限时做,做完复盘。模拟赛能暴露你的所有问题:时间分配、工具熟练度、心态管理。
我建议每周至少打一场模拟赛,坚持一个月,你的比赛能力会有明显提升。打完记得写复盘,记录每道题的时间消耗和卡点。
6.4 长期发展:找到自己的主攻方向
CTF 打到最后,每个人都会有自己的主攻方向。有人专攻 Web,有人专攻 Pwn,有人专攻 Crypto。找到自己的方向,深耕下去,比什么都懂一点但都不精要强。
怎么找方向?看你在哪个方向做题最顺手、最有成就感。兴趣是最好的老师,也是你能坚持下去的动力。
CTF 这条路,入门容易精通难。但只要你按正确的路径走,每一步都踩实,半年时间足够你从一个纯新手变成能独立解中等难度题目的选手。我见过太多人因为路径不对,走了半年弯路还在原地打转。希望这篇内容能帮你少走点弯路,把时间花在真正有用的地方。