如果你在搜索引擎里敲下“CTF入门”这四个字,大概率会看到一堆名词扑面而来:杂项、Web、逆向、Pwn、Crypto、AWD、动态靶场、flag、Payload……说实话,我当年刚接触CTF的时候,也完全是一头雾水。但现在回头看,CTF(Capture The Flag,夺旗赛)其实并没有那么玄乎,它本质上就是一种“安全攻防的实战演练”,出题人把漏洞和谜题藏在题目里,参赛者需要像侦探一样去发现线索、利用漏洞,最终找到一串特定格式的“flag”字符串来得分。
这篇文章不是面向大神的进阶心得,而是给你一个可以直接照着练的零基础入坑指南。我会把CTF的比赛形式、六个主流方向、常用工具、各方向的典型题型和解题套路,以及我踩过的各种坑,全部摊开来讲。不管你是学生、转行求职者,还是单纯对安全技术好奇,只要按着这篇文章的路子走,至少能在下一次比赛中看懂题目、写出第一道题的flag。
1. CTF到底在比什么:赛制、方向与零基础定位
1.1 三种主流赛制,先搞清楚你在打哪种比赛
CTF比赛最常见的赛制有三种,理解它们决定了你的备战策略。
第一种是解题模式(Jeopardy),也是大多数线上赛采用的赛制。主办方把题目分成Web、Misc、Crypto、Reverse、Pwn等类别,每道题对应不同分值,选手通过解题获取flag并提交得分。这种赛制适合入门,你可以按自己的节奏挑擅长的方向做,不擅长就直接跳过。
第二种是攻防模式(AWD,Attack With Defense),常见于线下赛。每个队伍会分配一个或多个同样的靶机,你需要一边修复自己靶机上的漏洞,一边攻击其他队伍的靶机拿flag。这种模式非常考验综合能力和临场反应,对新手不太友好,但最能逼你成长。
第三种是混合模式,就是前两者的结合,常见于大型赛事。我的建议是:零基础阶段先主攻解题模式,把基础题型的套路摸熟,再去碰AWD。
1.2 六个主流方向,横向对比一下
CTF的题目方向可以分成以下几类,我用一个表格把所有关键信息整理出来,方便你对照着自己选。
| 方向 | 考察重点 | 典型题型 | 新手友好度 | 核心工具 |
|---|---|---|---|---|
| Misc 杂项 | 信息收集、隐写、编码、流量分析 | 图片隐写、压缩包伪加密、流量包找flag、音频分析 | 最高 | StegSolve、Wireshark、binwalk、010 Editor |
| Web 网络攻防 | 漏洞利用、PHP代码审计、SQL注入、文件包含 | 命令执行、git泄露、文件上传、登录绕过 | 较高 | Burp Suite、dirsearch、GitHack、浏览器开发者工具 |
| Crypto 密码学 | 古典密码、现代密码、编码识别 | 凯撒、栅栏、RSA、AES、哈希 | 中等 | CyberChef、OpenSSL、Python脚本 |
| Reverse 逆向工程 | 汇编、反编译、算法还原 | 简单字符串提取、序列号分析、加壳脱壳 | 较低 | IDA Pro、Ghidra、x64dbg |
| Pwn 二进制漏洞利用 | 栈溢出、堆利用、格式化字符串 | 控制RIP、ROP链、shellcode | 低 | pwntools、checksec、gdb、objdump |
| Mobile 移动安全 | Android逆向、APK分析、Frida hook | 反编译找flag、动态调试 | 较低 | jadx、apktool、Frida |
补充一点,热词里有个“红蓝对抗”,它更多是企业安全里的概念:红队模拟攻击,蓝队负责防御溯源。CTF尤其是AWD赛制,其实就是红蓝对抗的浓缩版,你在比赛里练的找漏洞、修漏洞、应急响应,放到真实工作里同样是核心能力。
1.3 零基础到底先学哪个方向
我的建议非常明确:先打Misc,再碰Web,最后根据兴趣往Crypto、Reverse或Pwn深挖。
原因很简单。Misc是所有方向里最不依赖抽象知识的,它考的是细心程度和信息搜集能力,一个小白只要会装工具、愿意试错,就能解出不少题。Web方向则是CTF商业化程度最高、题目数量最多、也最容易获得成就感的方向,需要的网络基础和代码基础也不算高。而Reverse和Pwn方向需要了解汇编、操作系统内存布局等底层知识,建议等你有一定基础后再学,不然很容易被劝退。
2. 赛前准备:环境、工具包与练习平台
2.1 为什么一定要有个Linux环境
CTF比赛里大量工具都是为Linux写的,而且很多题目本身就是在Linux服务器上搭建的靶场。你如果只靠Windows,很多操作会非常别扭,比如处理压缩包文件权限、运行某些二进制工具、编写Python利用脚本等。
我推荐两条路。第一条是装虚拟机,用VirtualBox或VMware安装一个Kali Linux,它自带了大量安全工具,省去很多安装依赖的麻烦。第二条是现在很流行的做法,买一台云服务器或在自己电脑上装Windows + WSL2,直接在Windows里跑Linux命令行。我个人经验是:刚开始用虚拟机就好,等打比赛多了,自然会打造自己的环境。
另外,很多CTF选手会准备一个“CTF专用系统”,也就是提前装好常用工具的快照或专用镜像,比赛时直接启动,不浪费一分一秒。你可以在备赛阶段就按自己的习惯去定制这样一个系统,比赛时非常省心。
2.2 每个方向的核心工具,一次配齐
我把常用的工具按方向列个清单,你先照着装一遍,不用全部精通,用到哪个再深入学。
- Misc必备:StegSolve(图片隐写分析)、binwalk(文件分离)、foremost(文件恢复)、Wireshark(流量分析)、010 Editor(十六进制编辑)、zipinfo/fcrackzip(压缩包处理)、Audacity(音频分析)。
- Web必备:Burp Suite Community(抓包改包)、dirsearch(目录扫描)、GitHack(git泄露利用)、蚁剑或冰蝎(webshell连接,做题时常用)、网站源码审计工具可以以后再说。
- Crypto必备:CyberChef(在线编码解码神器)、OpenSSL(命令行加解密)、Python的pycryptodome库、随波逐流CTF编码工具(一个集成了海量编码解码的离线工具箱,做题效率很高)。
- Reverse/Pwn必备:checksec(检查二进制保护)、objdump(反汇编)、gdb/pwndbg(动态调试)、IDA Pro或Ghidra(反编译)、pwntools(Python利用库)。
- Mobile必备:jadx(反编译Android APK为Java代码)、apktool(资源解码和重新打包)、Frida(动态hook,进阶再学)。
初次安装这些工具时别贪多,可以先装CyberChef、StegSolve、Wireshark、Burp Suite、010 Editor这几个,足够应付大部分入门题。其他的边学边装。
2.3 练习平台选哪个好
练习平台直接影响你的学习动力,我推荐这几个公开练习平台:
- BUUCTF:题目覆盖面广,还有题解平台,很多老题都能搜到思路,适合入门和中级选手。
- CTFshow:题目分类细致,从最基本的Level1开始,非常适合零基础按专题刷题。
- 攻防世界:老牌平台,有新手练习区,题目难度从入门到进阶都有。
- PolarCTF:题目风格偏清新,有很多有趣的题目名,刷题体验不错。
- 青少年CTF平台:专门面向学生群体,题目相对温和,很适合刚接触CTF的中学生和大学生。
这些平台的题目足够你练很久。刚开始做题时,如果卡住超过两小时,可以直接看题解,把思路记下来,然后自己把flag推一遍。学习效率最高的时候不是做出来一道题,而是“看懂一道题后再独立复现”的过程。
3. Web方向:找flag最直接的入口
3.1 信息收集是一切的基础
Web题目的第一步永远是信息收集。很多人拿到题就直接开始猜漏洞,这是非常低效的。标准的姿势是先做三件事:看页面源码、扫目录、看HTTP请求。
看页面源码不只是找注释里的提示,还要注意开发者工具里Network面板的每一个请求。很多时候,flag就藏在某个AJAX请求的响应里,或者藏在某个不起眼的JS文件里。
目录扫描是必做的操作。用dirsearch很简单:
python dirsearch.py -u http://target.com -e php,html,txt它能把目标网站里常见的备份文件、后台目录、敏感文件全部扫出来。Web题目里经常出现一类题叫“git泄露”,就是开发者把.git目录留在了线上服务器上,你可以用GitHack这类工具把整个仓库还原出来,源码一旦到手,漏洞基本就明牌了:
githack http://target.com/.git/我做过最典型的git泄露题是,源码里藏着flag的一部分,另一部分要结合代码逻辑才能推出来。这类题的坑在于GitHack还原不完整,这时候可以看仓库的提交记录,删掉的代码里往往就有线索。
3.2 命令执行、文件包含和上传题的通用套路
命令执行(RCE)是Web题里的常客。出题人会在某个参数位置把用户输入拼接进系统命令,考察你能不能绕过各种过滤。
比如热词里提到的passthru,它是PHP里的一个执行系统命令的函数,和system、exec、shell_exec地位相当。出题人有时候把system过滤掉,但忘了过滤passthru,于是你提交:
?cmd=passthru("cat /flag");就能直接读到根目录下的flag文件。
更常见的考点是绕过过滤。比如过滤了空格,你可以用${IFS}代替;过滤了cat,可以用tac、more、less代替;过滤了关键字,可以尝试用base64编码砸过去,让服务器解码后执行。我打的很多比赛中,一道命令执行题能玩出十几种绕过方式,核心思路就一句话:规则是死的,编码是活的。
文件包含(LFI/RFI)也经常考,经典利用姿势是读源码,比如:
?file=php://filter/read=convert.base64-encode/resource=flag.php这样就能拿到flag.php的base64编码内容,再去CyberChef解码。如果题目里直接或间接给出了文件上传点,那就要联想到一句话木马、图片马、文件包含结合上传拿webshell这些路线。
3.3 登录题:SQL注入、弱口令、认证逻辑
很多新手Web第一题是登录页面,比如热词里的“ezlogin”(easy login)。这种题看似简单,套路却很多,我不会只盯着表单向里填密码。
第一类是SQL注入,最常见的是万能密码,在用户名处输入admin' or '1'='1,密码随便填,如果后端直接把输入拼进SQL查询,就可能成功登录。第二类是弱密码,比如admin/admin888、admin/123456这种,出题人故意留的后门。第三类是认证逻辑漏洞,比如修改前端页面隐藏的用户名、修改请求里role字段、或者JWT令牌中的身份信息,都能绕过登录。
我的做题习惯是,拿到登录页先看是不是纯静态页面,再看请求数据有没有奇怪参数,最后才尝试暴力猜解。盲目跑字典反而容易错过题目设计的“标准解法”。
4. Misc杂项:细心就是最大的武器
4.1 压缩包处理:伪加密、暴力破解和明文攻击
Misc方向里,压缩包题出镜率极高,而且经常是套娃。热词里有个“helloctf小明的生日”,这是非常经典的一类题:一个ZIP压缩包带密码,题目提示“小明的生日”,让你猜密码。这种情况下,生日密码通常是8位纯数字,比如19990101这种格式。我会先用暴力破解工具跑纯数字:
fcrackzip -b -c '1' -l 1-8 -u flag.zip或者用Windows下的ARCHPR(Advanced Archive Password Recovery)设置掩码????????跑8位纯数字,通常几分钟出结果。
解密之后还会遇到另一种情况,热词里的“伪加密”就是典型的历年必考题。伪加密指的是压缩包看起来需要密码,但实际上根本没加密,只是加密标志位被置位了。特征是用解压工具打开需要密码,但用十六进制编辑器查看,文件的通用位标志(general purpose bit flag)里,第0位被置成了1。处理方式很简单,用010 Editor打开ZIP文件,把本地文件头PK\x03\x04后面偏移6字节处的低位置0,如果中央目录头PK\x01\x02也置位了,也要一并改掉。我更懒一点的做法是直接用Python脚本批量修复:
import re data = bytearray(open('flag.zip', 'rb').read()) # 修复本地文件头的加密标志 for m in re.finditer(b'PK\x03\x04', data): data[m.start() + 6] &= 0xfe # 修复中央目录头的加密标志 for m in re.finditer(b'PK\x01\x02', data): data[m.start() + 8] &= 0xfe open('flag_fixed.zip', 'wb').write(data)改完后再解压,密码直接为空或者输入任意字符都能解开。如果你遇到的是真加密,但已知某个明文文件,还可以试试ZIP明文攻击(crackzip),不过入门阶段碰到概率不高,知道有这回事就行。
4.2 图片隐写:从文件分离到LSB
图片题是Misc的大头。拿到图片第一步,不要直接用眼睛看图,先把图片塞进binwalk分离,看看里面有没有藏着其他文件:
binwalk ./picture.png foremost -i ./picture.png -o output/很多时候,flag就藏在图片末尾,被拼接进了一个隐藏的ZIP或另一个图片文件里。如果不分离直接改后缀或硬解压,会走很多弯路。
第二步是查看属性信息,exiftool可以看到JPEG/PNG元数据,作者名、备注、地理位置都可能藏线索。我曾经遇到一道题,flag被藏在图片的“Artist”字段里,肉眼根本看不出来。
第三步是检查JPEG隐写。热词里的“jpeg隐写题”,常用工具是StegSolve和JPHS(JPEG Hidden Data Solution)。StegSolve可以把图片分解成多个颜色通道,LSB(最低有效位)隐写的图片在红色、绿色、蓝色平面的第0位往往会显示出明显的文字图案。操作路径是:打开StegSolve -> Analyze -> File Format / Data Extract,选定通道后Save Bin,就能提取出隐藏信息。
4.3 流量分析:从Wireshark里挖出通话录音
流量包分析也是Misc热门方向,给你的通常是一个.pcap或.pcapng文件,里面记录了某次网络通信的所有报文。你要用Wireshark打开,按协议筛选、还原TCP流、找HTTP请求参数、分析DNS查询,甚至还原出传输的文件。
热词里有一类题是“流量分析voip后是通话录音”,这其实就是Wireshark里的VoIP分析功能。操作路径是:Wireshark -> Telephony -> VoIP Calls,会列出所有通话会话,选中相关条目后点击“Play Streams”或“Graph”,可以试听或导出RTP流。flag经常直接出现在通话内容里,或者被说话人念出来。遇到这种题时,除了听录音,还要注意看SIP包的参数,有时候flag就藏在Call-ID或User-Agent字段里。
流量题比较吃耐心,我的经验是先看统计信息,Statistics -> Protocol Hierarchy,快速判断流量包里有HTTP、DNS、SMTP还是其他协议,再决定优先看哪一块。整个过程很磨人,但也是Analyzing信息能力的绝佳训练。
4.4 编码识别和密码学杂项
Misc里有很多题其实是编码题,拿到一串完全看不懂的字符,先别急着瞎猜,用CyberChef的Magic功能自动识别,它能把Base64、Hex、URL编码、ROT13、ASCII码等一键解出来。
热词里的“CTFshow 给她”这类题目,名字越文艺,考点越基础。经常是AES/Base64/字符位移的组合变换,或者是一种不那么常见的编码,比如社会主义核心价值观编码、与佛论禅等奇葩变种。遇到这种题,建议打开随波逐流CTF编码工具,它内置了大量冷门编码的解码方式,能省去你一条条试的时间。
真正的密码学题(Crypto)会在这个基础上加入算法推理,比如RSA的公钥模数分解、低指数攻击,或者分组密码的CBC翻转攻击。入门阶段先掌握古典密码(凯撒、维吉尼亚、栅栏)和Base64、URL、Hex这些编码就足够应付前期比赛了。
5. Reverse、Pwn、Mobile:更硬核的三个方向
5.1 逆向:从字符串和函数名开始下手
Reverse(逆向工程)题的核心是:给你一个可执行程序,你要通过静态分析和动态调试,还原它的算法逻辑,找出隐藏在其中的flag。
新手的第一道逆向题通常非常简单,程序里直接有一个明确的函数叫print_flag()或者字符串区里有大段可疑文本。解法是:用IDA或Ghidra打开程序,按Shift+F12查看字符串列表,看到像flag的内容直接提交,能过就过了。
稍微进阶一点,程序会把输入经过几步运算后和某个目标值比较,你需要通过调试器查看比较过程,或者手动还原算法,输入正确的序列号来“激活”出flag。这里有个常用技巧:用x64dbg加载程序,在关键比较处下断点,看寄存器里最终比较的是哪个值。很多零基础选手能解Pwn题但卡在Reverse上,说到底是不熟汇编指令,mov、cmp、jz、call这几个见到多了,自然就习惯了。
5.2 Pwn:理解“控RIP”就能入门
Pwn是CTF里公认最硬核的方向,但入门最关键的一类题其实并不难,就是热词里的“rip题目”。
这类题目会给你一个存在栈溢出的程序,程序里往往直接写死了一个win()或shell()函数,只要你能把函数返回地址改成它的入口,就能拿到shell或flag。
具体步骤如下:
- 用
checksec检查程序保护:
checksec ./pwn1如果看到栈不可执行(NX enabled)且地址随机化关闭(PIE disabled),就非常适合新手做。 2. 用objdump -d找到后门函数的地址:
objdump -d ./pwn1 | grep win比如得到地址0x401186。 3. 确定栈偏移量。最简单的方式是用cyclic 100生成输入,把程序跑崩溃后查看返回地址处被覆盖的crystal。
有了偏移量和函数地址,就可以用pwntools写利用脚本。假设偏移是40,那么:
from pwn import * p = process('./pwn1') payload = b'A' * 40 + p64(0x401186) p.sendline(payload) p.interactive()很多零基础同学第一次跑通这个脚本时的成就感,是其他题目给不了的。Pwn入门并没有传说中那么恐怖,如果你已经能看懂C语言和简单汇编,完全可以尝试。
5.3 Mobile:把APK拆开找flag
Mobile方向的入门题大多是给一个APK文件。第一个动作永远是反编译。用jadx可以把APK转成可读的Java代码,直接打开搜索flag,很多时候出题人就把flag明文写在onCreate方法里。
apktool则用于拆解资源文件和AndroidManifest.xml,可以看到组件导出情况、权限申请等。如果flag不是明文的,还需要用Frida做动态hook。比如程序会在运行时生成一个key,再拼接出flag,你可以用Frida脚本hook住字符拼接的函数,把中间变量打印出来。
新手做Mobile题最容易忽略的是assets和res目录里的隐藏文件,以及APK是否被加固。如果jadx打开后发现全是壳代码,先去脱壳机或在线脱壳服务走一遍,再继续分析。
6. 做题途中最有价值的坑:问题排查与避坑实录
6.1 压缩包解压失败:先分清“真加密”还是“伪加密”
我在各种新手交流群里看到最频繁的问题就是:“这个压缩包我暴力破解跑不出密码,是不是伪加密?”这里有个经验判断:如果你用7-Zip打开压缩包,能看到文件名列表,但不能看到具体内容,那大概率不是伪加密。伪加密的重要特征是,你甚至无法确认某段内容是否真的被加密,需要通过十六进制检查加密标志位。
如果确认了是伪加密,又修改了加密标志位还是解不开,那就检查一下是不是同时存在多个PK头,或者压缩包被套了一层ZIP。套娃压缩包要先解开外层,再对内层做伪加密修复或暴力破解。
6.2 flag格式、编码和大小写:最容易让人崩溃的细节
CTF里flag的提交格式通常是flag{...},但总有例外:可能是ctf{...}、FLAG{...},或者题目明确给了前缀要求。如果明明算出了正确结果却提交错误,先检查是不是大小写问题、下划线问题,或者需要把所有字符转成小写/大写再提交。
还有一类题要求提交十六进制格式的flag,你算出来的是字符串但平台只认十六进制。这种细节丢分很可惜,做题时多读两遍题目要求,尤其是题目描述最后几行经常藏着格式提示。
6.3 环境问题:工具版本和系统兼容性坑
Wireshark在新版本里默认禁用某些RTP解码器,导致找不到通话流,这时候去Preferences里把相应协议解码器打开。Burp Suite社区版对WebSocket的调试能力有限,遇到WebSocket考题建议直接换用Python脚本写客户端。
Kali Linux的换源问题也值得注意。默认软件源更新很慢,装一个小工具要等半天,先把源换成国内镜像源,能省下大量时间。
6.4 比赛中的策略问题:不要死磕某一道题
很多新手第一次打比赛,一道题卡了两小时死活做不出来,最后比赛时间全耗在上面,别的题一分没拿。这是大忌。CTF比赛的核心策略是分数最大化,不是“证明自己”。正确做法是:拿到题目列表后,先快速扫一遍所有题目,挑出最有把握的三道题先做,拿到稳定分数;遇到卡壳超过30分钟的题,先放下,做别的,回头再来看往往会有新思路。
打的比赛多了你会发现,出题人喜欢把flag的一部分藏在题目的“反正不会有人看到的地方”,比如HTTP响应头、图片尺寸属性、ZIP的注释字段里。保持检查一切的细心,比盲目堆时间更重要。
7. 从入门到进阶:学习路线、AWD与AI新方向
7.1 一条可以照抄的三个月学习路线
如果你是从零开始,我建议按这条路线走,节奏稳定、不枯燥:
- 第1~2周:刷Misc入门的编码、隐写题,装好所有工具,熟悉Linux基础命令。
- 第3~4周:刷Web基础题,重点是信息收集、SQL注入、文件包含和命令执行,配合本地搭建DVWA靶场练手。
- 第5~8周:专攻一个方向。对大部分人有正反馈的是Web和Crypto,把BUUCTF上对应分类的题刷到三等难度都能独立完成。
- 第9~12周:接触Reverse和Pwn的入门题,目标是能看懂简单题解,并独立完成3~5道基础题。
同步进行的还有一件事:持续阅读CTF题解,把每道做过的、看懂的题整理成自己的知识库,用Markdown分门别类记录,否则三个月后你大概率会忘光之前的解题套路。
7.2 AWD攻防模式与红蓝对抗思维
如果你准备参加线下赛,AWD是绕不开的。AWD里你需要做两件事:守和攻。
守的思路是,开赛第一时间扫描自己的Web目录和系统进程,找到后门,把源码下载到本地进行审计,发现漏洞后打补丁或删除危险文件。攻击的思路是,分析其他队伍没有修补的漏洞,利用它写入一个通用的webshell,再通过计划任务或反弹shell循环利用。
热词里的“红蓝对抗”在这个环境下体现得淋漓尽致:一场AWD下来,你对漏洞原理的掌握程度,比刷十道题都深。如果你想专门练习,可以用CTFd、h1ve等开源框架搭建自己的动态靶场平台,把自己做过的题目打包上传,拉几个朋友一起打一场内部赛,这也是很好的学习方式。
7.3 CTF里的AI题目,新趋势值得提前关注
最近两年,AI相关题目在CTF里出现得越来越频繁。无论国内外大厂的赛题,还会专门开辟AI安全方向。我接触到的AI题目大概分几类:
- 模型文件逆向:给你一个TensorFlow或PyTorch模型,让你从权重或中间层输出里提取flag。这类题本质上是Reverse的换皮。
- 对抗样本:给你一张图片和分类模型,需要你生成一个扰动噪声,让模型误判成特定类别,flag藏在识别结果里。
- 提示词注入:给你一个聊天机器人,需要你构造特殊的输入,让系统把内部隐藏的flag吐出来。
- 数据投毒与模型后门:通过分析训练集,找到异常样本的规律,还原出后门触发条件。
如果你本身懂机器学习,做这类题会有天然优势;如果不熟悉,也可以先从Web漏洞里先积累经验再说。我更建议入门阶段不要把太多精力放在AI题上,它在目前比赛中的占比还不高,先把基础方向打牢,等以后AI题型更规律了再来系统刷都不迟。
我以前刷BUUCTF时,一道Misc题连着卡了两天,最后发现flag藏在一张纯黑色的图片右下角,肉眼根本看不见,用StegSolve在Red plane 0位才拖出来。那种感觉就像是跟出题人隔空对话,他咧嘴一笑说“我就知道你不会看这里”。CTF学到现在,我最大的体会倒不是技术本身,而是它逼着你养成了“不放过任何一个细节”的思维习惯。
最后分享我自己的一个小技巧吧:所有工具、脚本、看不明白的题目和题解,我都集中存在一个项目仓库里,按Misc、Web、Crypto、Reverse、Pwn、Mobile分类,随刷随记,随记随用。比赛前翻一翻自己的“题感笔记”,效率远高于临时抱佛脚。如果你也有类似的整理习惯,欢迎在交流时互相分享自己的坑位记录,这比纯刷题更能帮你沉淀出真正属于自己的能力。