做了几年CTF,带过不少新人入坑,我发现一个特别明显的现象:很多第一次接触CTF的同学,不是被题目难倒的,而是被圈内说话方式绕晕的。群里有人问“这题是不是直接G”,你往下翻半天才看懂;打开一篇Writeup,作者写着“预期解是个非预期解”,你反而更懵了。CTF这个圈子确实有一套自己的专有名词体系,不夸张地说,你至少要听懂七成,才谈得上独立打比赛。
这篇文章就是把CTF里最常碰到的那些专有名词整理了一遍,包括题目类型、漏洞名称、工具黑话、比赛机制,一次性讲清楚。适合刚入坑的CTF爱好者看,也适合想带社团新人的老手拿来当扫盲提纲。我尽量用大白话解释每个词的含义,再补一点实操场景,让这些术语从“看不懂”变成“用得上”。
1. CTF的底层逻辑:夺旗到底在夺什么
1.1 从“夺旗”说起:Flag是怎么出现的
CTF全称Capture The Flag,直译就是“夺旗赛”。最早起源于国外老牌安全会议上的实践对抗,把“入侵成功”抽象成“拔到一面旗”,后来演变成网络安全的竞赛形式。比赛里,旗帜被具体为一串固定格式的字符串,通常长这样:flag{some_secret_text}。这串字符串就是题目设计者的“战利品”,你把题解出来,就能从题目里拿到它,提交到比赛计分平台换取分数。
为什么要把“解决方案”设计成一面旗?我觉得这背后有个很巧妙的逻辑:安全攻防的本质是“找到别人藏起来的东西”。现实里的漏洞利用,最终目的是拿到服务器上某个敏感文件或数据库记录,而CTF把复杂目标简化成一串只包含字母数字和标点的字符串,这样主办方可以批量出题,选手可以快速验证结果,计分系统也容易判分,极大降低了比赛的组织成本。你只需要看flag格式是否正确、是否唯一,就能判断题目是否被解开。
Flag在赛制里还分静态和动态两种,静态flag通常每道题只有一个固定值,提交就能得分;动态flag则往往在攻防赛里出现,每个队伍拿到的内容都不一样,目的是防止选手直接共享答案。后面章节我会细说。这里先记住一个核心:CTF的一切题目,最终都指向那一串flag。你学的各种技术,都是为了从给定场景里翻出这串字符串。
1.2 五个常规方向:PWN、Web、Reverse、Crypto、Misc
CTF题目通常分成五大方向,每个方向对应一类技能。为了帮助新人不迷路,我先给一个总览表格:
| 方向名称 | 研究的对象 | 典型关键词 |
|---|---|---|
| Web | 网站和服务器应用 | SQL注入、文件上传、代码审计、反序列化 |
| PWN | 二进制程序的漏洞利用 | 栈溢出、堆漏洞、ROP、shellcode |
| Reverse | 程序逆向分析 | 反汇编、脱壳、加壳、验证算法、混淆 |
| Crypto | 密码学 | RSA、AES、异或、古典密码、哈希 |
| Misc | 杂项综合 | 隐写、流量分析、编码解码、脑洞 |
新人通常从Web或Misc入门,因为这两类对编程底子要求没那么高,更容易建立信心;PWN和Reverse更贴近底层,需要对操作系统、编译原理、汇编有基本认识,门槛最高,但也最刺激。Crypto则兼顾逻辑和数学,喜欢推理的人会非常上头。
我自己的体会是,方向之间不是割裂的,很多综合题会跨方向,比如一道题先让你反汇编看懂校验逻辑,再写脚本爆破。所以起步阶段侧重两三个方向没问题,但不建议彻底把自己限定死。每类方向的专有名词数量都很大,但真正高频的其实就集中在几个核心概念上,下面几章我会按方向逐个拆解。
1.3 赛制术语:Jeopardy、AWD、解题赛、攻防赛
除了题目方向,比赛还有赛制上的专有名词。
Jeopardy赛制是主流解题赛,选手或者队伍面对一张题目列表,分为Web、PWN、Reverse等分类,每一题对应一个分值,解出来提交flag就得分。这种赛制类似闯关答题,适合练基本功,也是线上初赛最常见的形态,很多全国性比赛的第一轮都是这个玩法。
AWD(Attack With Defense)是攻防兼备的意思,中文常叫攻防赛。比赛开始时每队会拿到一个或多个部署好的靶机,里面藏着flag,赛方还会把所有人的提交接口开放。你需要一边维护自己靶机不被别人打穿,一边攻击别人的靶机偷flag,整个过程是实时的,积分曲线不断跳动。AWD对快速判断漏洞、打补丁、部署防护脚本的要求非常高,是实战味道最浓的赛制之一。
还有一种纯防守赛制强调修复漏洞能力,不过在国内赛场上比较少见。刚开始打比赛时,建议先把Jeopardy玩透,练到对各种漏洞入口有肌肉记忆,再考虑上AWD,否则容易手忙脚乱,就连自己靶机被打穿了都不知道。
2. Web方向:出镜率最高的那批专有名词
2.1 SQLi与RCE:几乎每场比赛都会出现的组合
Web方向里最常被提起的缩写就是SQLi和RCE。SQLi是SQL Injection的缩写,中文叫SQL注入,是指程序在拼接数据库查询语句时,没有对用户输入做严格过滤,导致输入内容改变了查询语句原本的语义。举个生活化的类比:你去餐厅点菜,菜单写“请告诉我你的口味”,结果你说“口味=不要辣,同时把菜单加上一个删除按钮”,后端就稀里糊涂照做了。
提到SQL注入,很多人会直接联想到一个工具叫sqlmap。确实这个工具很出名,但新手如果只会盲打sqlmap,对“为什么会注入成功”完全没概念,遇到过滤严格、语句拼接复杂的题目就会卡死。建议至少手写一遍最简单的注入判断流程:先试单引号看报错,再试注释符看反应,最后推测查询语句结构,再逐步扩展。
RCE是Remote Code Execution的缩写,远程代码执行。这是Web方向里含金量很高的一个术语,表示攻击者能让服务器执行自己提交的代码。典型场景是后台把用户输入的参数直接丢进某个系统函数里,比如拼接成命令行去执行,或者把用户上传的脚本文件当代码文件解析。RCE一旦成立,基本等于拿到了服务器权限,后续要读文件、翻源码甚至横向移动就都有了起点。
RCE和SQLi经常被连着提,是因为它们都是“输入到执行”链条上的问题,只不过一个拷问数据库,一个拷问操作系统。刷题时看到任何构造输入的地方,都要立刻想:这里是不是能把我的数据变成代码?这就是Web方向最核心的思维模式。
2.2 XSS、CSRF、SSRF,三个“S”开头的孪生兄弟
XSS是跨站脚本(Cross-Site Scripting)的缩写,本质是往页面里注入JavaScript脚本,让它在受害者浏览器里执行。CTF中常见的XSS题一般给一个存在漏洞的页面和一个“管理员机器人”,你需要构造恶意链接,让管理员点开后触发脚本,借机把管理员的会话凭据偷出来提交。这个场景非常经典,练的就是对浏览器解析机制的理解。
CSRF(Cross-Site Request Forgery,跨站请求伪造)则是让受害者浏览器在不知情的情况下,向目标网站发送请求。它与XSS的区别在于:XSS的代码本身来自被攻击的网站,而CSRF的恶意请求是从第三方页面发出的,目标是借受害者在目标网站里的身份完成一次“合法但不该发生”的操作。
SSRF(Server-Side Request Forgery,服务端请求伪造)和前两个不一样:它利用的是服务器自己发起的网络请求。很多应用功能需要“读取远程图片”“获取外部URL内容”,如果这些功能没有做地址限制,攻击者就可以诱导服务器去访问自身内部网络地址,探测内网服务,甚至读取服务器内部配置信息。我在实际刷题中最常遇到的SSRF利用方式,就是让它访问本机端口,再结合内网题目环境逐步探测。
这三个词的共同点是都和“请求/脚本”相关,很容易记混。我自己总结的区分口诀是:XSS是“让受害者的浏览器执行代码”,CSRF是“让受害者的浏览器发请求”,SSRF是“让受害者的服务器发请求”。
2.3 文件上传、反序列化、XXE,从入口到执行
文件上传是Web题里极常见的入口漏洞。题目通常会提供一个上传页面,告诉你“只允许图片”,然后你需要想办法传一个能当成代码执行的文件上去。常见思路包括改扩展名、伪造文件头、利用服务器解析顺序等方式绕过限制。这几年的题目也越出越细,很多会同时校验文件内容、MIME类型和文件头,单纯改后缀的时代早就过去了。
反序列化这个术语听起来很劝退,但拆开就清晰。序列化是把一个对象转化成字符串方便保存传输,反序列化是把字符串重新还原成对象。漏洞就藏在还原过程中——如果程序反序列化了用户可控的数据,而没有检查对象类型和属性,攻击者就可以精心构造一串数据,让还原过程触发恶意操作。PHP里常见于对象注入,Java里常见于各类组件利用。刷反序列化题,重点不是背链条,而是理解“魔术方法会在什么时机被调用”。
XXE是XML外部实体注入(XML External Entity)的缩写,本质是XML解析器处理外部实体时没有限制,导致攻击者可以读取本地文件、发起内网请求。现代框架默认关闭外部实体后这类题少了一些,但老题里还是很常见,对新人来说正好拿来建立“换个输入格式就是一条新攻击链”的意识。
3. PWN与Reverse方向:底层术语才是硬核
3.1 PWN到底是什么,和“溢出”有什么关系
PWN这个词在安全圈子里其实是从“own”(拥有、攻陷)延伸出来的网感拼写,在CTF里专指二进制漏洞利用赛题方向。PWN题的典型场景是:主办方给你一个编译好的可执行程序,你只有运行它的权限,没有源码,目标是利用程序自身的漏洞读取一个文件里的flag,或者拿到一个交互式shell。
PWN里出现频率最高的漏洞类型是“溢出”。栈溢出可以这样理解:程序在栈上分配了一个杯子大小的缓冲区域,你往里倒水时不检查水位,水漫出来就污染了旁边存放的返回地址等数据,程序的控制流就会被篡改。堆溢出原理类似,只是受害对象从栈上的局部变量换成了堆上的对象和元数据。溢出本身不是什么魔法,完全是因为很多底层语言需要开发者手工管理内存边界,一旦疏忽就埋下隐患。
PWN题真正难的是现代编译器默认带上的那套保护机制,这些保护机制也有对应的专有名词。我整理了一个常见保护机制速查:
| 术语 | 全称/含义 | 作用与利用影响 |
|---|---|---|
| Canary | 栈金丝雀 | 在栈上放随机数,溢出时先被破坏,程序检测到就退出;需要先泄露它再写入 |
| NX | 不可执行栈 | 栈上的数据不能被当作代码执行,直接堆shellcode会失效 |
| PIE | 地址随机化 | 程序基址每次加载都不同,需要先泄露地址才能计算跳转目标 |
| RELRO | 重定位只读 | 保护全局偏移表,防止通过改写函数指针劫持流程 |
看到一道PWN题,第一步从来不是直接写payload,而是用checksec这个工具查看启用了哪些保护,再决定用什么手法。这些保护彼此组合,决定了整个利用方案的走向,是PWN题里最硬的“读题环节”。
3.2 ROP与shellcode:漏洞利用的经典两板斧
shellcode是一段编译好的、可以直接在CPU上执行的机器指令,在溢出利用时被放到缓冲区里,试图让程序跳过去执行。传统思路是“溢出去,跳到栈上,执行shellcode”。不过NX保护开启后,栈变成不可执行,直接把shellcode放在栈里就没戏了,于是诞生了ROP。
ROP全称Return-Oriented Programming,中文常叫返回导向编程。它的思路是:不往栈上写新代码,而是从程序已有的二进制里找一堆以ret指令结尾的小片段(这些片段叫gadget),把它们的地址依次拼在栈上,让程序像走台阶一样一跳一跳地执行,最终完成预设的操作。为什么选ret结尾?因为ret会从栈上弹出一个地址并跳过去,链式触发非常顺滑,所以它成了ROP链条里最关键的“接口”。
实际写利用脚本时,我用pwntools这个Python库最多。它封装了与目标进程交互、构造payload、计算地址等一堆功能,一个典型的PWN脚本会先连上远程题目,然后发送精心构造的payload,最后交互收flag。第一次自己跑通一条ROP链时你会非常有成就感,同时也终于明白为什么很多人说PWN是“做得越多,常识越多”的方向。
3.3 逆向方向:从IDA到脱壳
Reverse方向的专有名词多数围绕工具和算法。最核心的工具是IDA Pro,一个可以把编译好的二进制程序反汇编成伪代码的静态分析工具。它的“反编译”能力极强,按下F5,原本只有汇编指令的机器代码会被还原成接近C语言风格的伪代码,算法的骨架就露出来了。
除了静态分析,动态调试也很常用,Linux下面一般用GDB,配合pwndbg等插件能大幅提升效率。逆向题里经常出现“验证flag”的函数,你需要看懂校验逻辑,然后要么直接算出正确答案,要么把算法逆过来写一段解密脚本。练习逆向最忌讳一上来就钻汇编细节,建议先跑一遍程序看输出,再在IDA里找关键字符串、交叉引用,顺着调用关系回溯。
加壳和脱壳也是高频词。加壳相当于是给程序穿上一套压缩和加密的“盔甲”,运行时再逐步还原自己,目的是让静态分析直接看到的是乱码。脱壳就是通过工具或手动方式把这个保护层剥离,恢复出真实逻辑。老牌的UPX壳相对简单,现在比赛里更多的是自定义壳、多层壳、虚拟机保护,需要额外耐心。
4. Crypto与Misc方向:最容易让人懵圈的概念
4.1 现代密码里的高频单词:RSA、AES、异或
Crypto方向第一个绕不开的缩写是RSA,一种非对称加密算法。非对称的意思是加密和解密用不同的钥匙,公钥拿来加密,私钥用来解密。CTF里RSA题的核心不是让你去实现它,而是考察RSA背后的数论性质:如何从已知的n、e、密文中恢复明文,常见考法有n太小可分解、共模攻击、低加密指数广播等。多数情况下你不需要手写分解算法,直接用现成的数学库或在线因子分解工具就能解决。
AES是对称加密的代表,加解密用同一把钥匙,是现代框架里的默认选择。CTF里AES题很少让你爆破真正的密钥,更多是考察使用姿势,比如ECB模式下的字节复制技巧、CBC模式的字节翻转攻击,这些对掌握AES内部工作机制很有帮助。
XOR异或可能是Crypto方向里出场率最高的基础操作。它的特点是:相同为0,不同为1;一个数异或两次同一个值会还原。这意味着一串明文和密钥异或得到密文,再用同一密钥异或密文就能恢复明文。很多题目在加密流程的最后会来一次异或运算,你只需要逆回来即可。我写过一个解异或流的小脚本,就几行,但已经救回过不少Crypto题。
data = bytes.fromhex("00112233445566778899aabbccddeeff") key = bytes.fromhex("102132435465768798a9bacbdcedfe0f") plain = bytes(a ^ b for a, b in zip(data, key)) print(plain)4.2 古典密码:凯撒、维吉尼亚、栅栏密码
如果说现代密码是数学题,古典密码更像解谜游戏。凯撒密码是最基础的移位密码,把字母表整体平移若干位;维吉尼亚密码用一组关键词循环指定每位的位移量;栅栏密码则是把明文按行排列再按列读出。这些密码在现代安全场景中没有实际价值,但作为CTF的前置训练非常友好,能让你直观感受“密钥空间”“穷举”这些概念。
处理古典密码推荐直接上手CyberChef这个在线编解码工具。它有“From Caesar”“Vigenère Decode”等现成配方,你可以先试自动判断再手动调参数。我的习惯是:看到一段全是字母、结构像英文又没有空格的数据,第一反应就试试凯撒,多试几个位移量,总有一个能读出语义;如果凯撒不行,再考虑维吉尼亚。
4.3 Misc:隐写、LSB、文件分离、流量分析
Misc在CTF里相当于“杂项后备箱”,方向多到没法单一定义,但也有一些经典的热词。隐写是最常见的一类,把flag藏进图片、音频、视频或者文本的细微差异里,需要你用工具或脚本把它提取出来。
LSB是图片隐写里最经典的玩法,全称Least Significant Bit,最低有效位。PNG图片每个像素的颜色分量最低位改动后,肉眼几乎察觉不到,但可以把一段数据按比特藏进去。提取时只需要按位拼回这些最低位,再按长度切出来。一般用现成的隐写工具,或者自己写几十行Python也能处理。
文件分离和流量分析也属于Misc高频考点。文件分离的意思是,题目给你一个看似普通的文件,但里面其实还拼接了其他文件,用binwalk或者foremost这类工具就能扫描并提取出隐藏文件。流量分析则是给你一个抓好的网络数据包,让你用Wireshark顺着传输流的上下文、HTTP请求、DNS查询等线索找到数据。Misc题往往考的是“信息收集”和“脑洞”,写脚本不重要,耐心和细心才重要。
5. 工具名词扫盲:参赛包里应该认识的“老朋友”
5.1 Web方向三件套:Burp Suite、sqlmap、dirsearch
Web方向刷题最常用的组合拳,我个人总结为“拦截代理+漏洞扫描+目录爆破”三件套。Burp Suite是Web安全从业者必备的拦截代理工具,它把浏览器和目标服务器之间的流量拿在手里,你可以逐条查看请求、改动参数再重放,也可以把拦截到的原始请求直接复制出去加工。学习Burp的关键是熟悉各个功能板块,尤其要掌握手动改包和批量跑数据这两个模块。
sqlmap是自动化SQL注入检测工具,主要价值在于帮你快速确认注入点和执行后续扩展操作。但我要提醒一句:它只是加速器,不是理解器。如果你完全不知道它为什么能检测出注入,遇到变形题、过滤题时就会两眼一抹黑。正确的用法是先手动推理确认注入存在,再用sqlmap处理重复劳动。
dirsearch是个目录扫描工具,通过字典爆破网站存在的路径。很多Web题把后台地址或敏感文件藏在深层路径里,目录扫描能帮你快速扩大信息面。这类工具本质上比的是字典覆盖程度和速度,所以选一个维护不错、内置字典丰富的版本比较重要。
5.2 PWN与逆向常用工具:pwntools、pwndbg、one_gadget
PWN方向工具链的复杂度明显上了一个台阶。pwntools是Python库,负责与目标程序交互、处理二进制文件、构造ROP链,我前面提过。pwndbg是个GDB插件,给原本单调的调试器增加了堆信息、寄存器高亮、反汇编展示,极大提升了动态调试效率。还有一个术语叫one_gadget,意思是某些特定环境下存在一个地址能直接满足所有限制条件,跳过去就能拿到shell,大大简化了利用流程。
除了这些,学PWN的新手迟早会接触到checksec、ROPgadget、LibcSearcher等工具,分别负责查看保护、搜索gadget、匹配库版本。工具之间经常要串联使用,所以学会在脚本里调用它们是个很实用的技能。
逆向方向我常备IDA、Ghidra和GDB。Ghidra是开源逆向工具中的“免费蛋糕”,功能和收费商业工具很接近,遇到不便于使用商业软件的场合就是神器。做题不在于把工具背得滚瓜烂熟,而在于想到“该用哪个工具”这一步。
5.3 通用工具箱:CyberChef与Linux命令
不管哪个方向,CyberChef这个在线工具都值得放在收藏夹第一个。它把编码解码、哈希、压缩、进制转换这些日常操作用“拖配方”的方式串起来,处理一条经过base64、十六进制、URL编码混合的数据可以几秒钟完成。
Linux命令行工具也是CTF的隐形参赛包。strings能从二进制里提取可打印字符串,往往能直接看到提示;file能识别文件真实类型,防止被扩展名骗到;xxd或者hexdump可以查看十六进制内容;配合binwalk可以直接拆分文件。这些命令单个很简单,组合起来就是非常强大的排查手段。刷题时遇到“打不开的图片”“没有后缀的文件”“一堆奇怪的字符”,我的标准流程都是先file一下,再strings一眼,再用xxd看文件头尾。
6. 竞赛黑话与参赛心态:听懂这些才算“进场”
6.1 常见黑话:预期解、非预期解、一血、签到题、直接G
除了技术名词,CTF圈还有一批流行黑话,不懂真的会一脸懵。一血来自游戏术语,意思是全场比赛第一个解出某道题的人,常常是排行榜上的高光时刻;二血、三血依此类推。“签到题”指非常简单、基本白送的题,比完赛不管技术高低几乎都能做对它,用它来保底得分。
“预期解”和“非预期解”是出题人和选手之间的博弈。预期解是出题人设计好的主流解题路径,非预期解则是选手找到的旁门解法,可能是利用某个环境配置失误、工具特性或者逻辑漏洞。一道好题的标志之一,是它的预期解和非预期解并存而都能学到东西,出题人最怕的是被一个奇怪的非预期解一波带走,那样题目就报废了。
“直接G”在群里很常见,意思是“直接完蛋了”,表示某道题折腾半天没思路、眼看分数无望。还有一个高频词叫“通杀”,指一个方法或工具能把一类题目全部解决。这些黑话不是必须背的知识,但刷赛后你会自然习惯,别人说“这题是不是直接G”时,你能秒懂他的崩溃,也算是正式“进场”的信号。
6.2 新手最常见的三大误解
第一个误解是“CTF就是攻击别人的电脑,是不是不合法”。其实CTF比赛完全运行在主办方提供的授权靶场环境中,使用的靶机、漏洞、flag都是比赛方搭建的,和攻击真实系统是两回事。按照竞赛规则去解题、提交flag是合规的学习行为,比赛里的漏洞利用知识也只适合放在靶场里练习。
第二个误解是“只要会用工具就能拿高分”。工具确实能帮你提速,但CTF本质考的是原理和思维。我见过太多新手里程碑式的挫败:sqlmap跑不出结果,卡在一道明明“很简单”的Web题上,原因就是不知道后端到底在拼接什么。反过来,你亲手写过一次注入判断、一次ROP链之后,工具才会成为你的手臂而不是拐杖。
第三个误解是“必须把所有方向都学完才可以参赛”。CTF本身是很讲究团队协作的竞赛形式,队伍里有人擅长Web,有人主攻PWN,有人专门做Misc,只要配置合理,就能覆盖大部分题目。新手完全可以选一个自己喜欢的方向先学到能独立解题,再横向拓展,没必要一上来就全都要。
我个人的体会是,CTF这条路的成长曲线其实很诚实:每当你觉得“这些名词我全会了”,下一场比赛就会冒出新的术语和新的思路把你打回原形。所以别把这篇名词手册当成终点,它只是一张地图。最好的学习方式,还是找一场合适的比赛下场做题,遇到不懂的词随时回来翻一翻,边做边查,查完就用,用几次就变成你的本能了。祝你在flag的山头里拔得顺顺利利。