CTF 夺旗赛入门:Web、密码与逆向

FreeGuideOnline 最新 2026-06-19

CTF 夺旗赛入门:Web、密码与逆向

欢迎来到 CTF(Capture The Flag)的世界。本教程专为零基础的你设计,将带你系统性地入门 CTF 中最核心的三大方向:Web 安全、密码学与逆向工程。无论你未来想从事安全研究,还是单纯想挑战技术极限,这里都将是你的第一站。

1. 什么是 CTF?

CTF 全称 Capture The Flag,中文叫“夺旗赛”,是网络安全技术人员之间进行技术竞技的一种比赛形式。比赛会将“旗帜”(flag)隐藏在赛题环境中,选手需要通过分析、破解、漏洞利用等手段获取 flag 并提交,从而获得分数。

常见的 CTF 赛题方向包括:

  • Web:网络攻防,寻找 Web 应用漏洞
  • Pwn:二进制漏洞利用
  • Reverse:逆向工程,分析程序逻辑
  • Crypto:密码学,破解加密算法
  • Misc:杂项,涵盖编码、隐写、取证等

本教程将聚焦于新手最友好的三个方向:WebCryptoReverse

2. 环境准备:你的 CTF 工具箱

在开始解题前,请先搭建基础环境。以下工具会贯穿你整个 CTF 生涯。

工具类型 推荐工具 用途
浏览器 Chrome / Firefox Web 题调试、查看源码、抓包
代理抓包 Burp Suite (社区版即可) 拦截、修改 HTTP 请求
编码转换 CyberChef(在线) Base、Hex、URL 等编解码
Python 环境 Python 3.8+ 编写解题脚本
逆向分析 IDA Free / Ghidra / x64dbg 静态与动态分析二进制
十六进制编辑器 010 Editor / ImHex 查看与编辑文件底层数据
终端环境 Linux (推荐 Kali 或 WSL) 命令行工具集合

3. Web 方向入门

Web 类题目会搭建一个存在漏洞的网站或提供源码,选手需要通过浏览器与 HTTP 交互,挖掘漏洞获取 flag。核心是理解 Web 应用的工作方式与常见攻击手法。

3.1 你必须掌握的 Web 基础

  • HTTP 协议:请求方法(GET、POST)、状态码(200、302、403)、请求头(Cookie、User-Agent、Referer)、响应头
  • 前端三板斧:HTML、JavaScript、CSS,至少要能看懂页面结构,会使用浏览器开发者工具(F12)的元素面板和控制台
  • URL 构成协议://域名:端口/路径?参数=值#片段,明白参数传递与路径路由
  • Cookie & Session:浏览器存储与身份维持机制

3.2 新手必学的漏洞类型

以下漏洞类型出现频率极高,请按顺序掌握。

(1)查看源码与注释

很多 flag 直接写在 HTML、CSS、JS 的注释中,或隐藏在返回头里。记住 CTF 第一要义:永远右键查看源码

<!-- 示例:隐藏的 flag -->
<!-- FLAG{th1s_1s_n0t_s3cur3} -->

(2)HTTP 请求包修改

通过 Burp Suite 捕获请求包,修改 User-Agent、Referer、Cookie 或新增强制字段。例如,题目要求“只能从 localhost 访问”,则添加 X-Forwarded-For: 127.0.0.1

(3)SQL 注入 (SQL Injection)

当用户输入被直接拼接到 SQL 语句中执行,攻击者可以改变原语句逻辑,窃取数据。典型示例:登录绕过。

-- 输入用户名: admin' -- 
-- 后端语句变为:
SELECT * FROM users WHERE username='admin' -- ' AND password=''

单引号闭合前一个条件,-- 注释掉后面的密码验证。更多场景使用联合查询 union select 获取数据。

(4)文件包含 (LFI/RFI)

动态包含文件时未做校验,导致可以读取任意文件。如:?page=flag.php,可能直接读出源码。若无法直接显示,可使用 php://filter 协议读取并输出 base64 编码内容:

?page=php://filter/convert.base64-encode/resource=flag.php

(5)命令注入 (Command Injection)

应用中调用了系统命令且拼接了用户输入。例如 ping 127.0.0.1;cat flag 可能在执行 ping 后执行 cat。常用连接符:;|&&\n(换行)。

(6)反序列化漏洞

当应用对用户可控的序列化数据(PHP中 O:4:"User":1:{...})进行反序列化时,可能触发魔术方法导致代码执行。新手暂不需要深究,先知道现象即可。

3.3 新手实战思路

  1. 打开页面,右键查看源码、JS 文件、注释
  2. 用 Burp 查看请求/响应中的 Header 和隐藏参数
  3. 修改参数、路径、HTTP 方法,观察页面变化
  4. 发现报错时仔细阅读错误信息,可能泄露数据库结构或源码路径
  5. 尝试万能密码或简单 SQL 注入探测
  6. 留意能够访问文件的功能点(如图片展示、日志查看等)

4. 密码学方向入门

密码学题目考查的是分析加密原理、寻找弱点并恢复明文的能力。它不需要你成为数学家,但需要扎实的编码能力和对经典算法的认识。

4.1 编码与加密的区别

  • 编码:信息形式的转换,无密钥,如 Base64、Hex、URL编码。可逆,仅为了传输或显示。
  • 加密:利用密钥将明文转为密文,需要密钥才能解密。对称加密(AES、DES)、非对称加密(RSA、ECC)。

CTF 中第一步往往是识别一串密文的编码类型,层层解码。

4.2 常见编码与古典密码

类型 特征与工具 备注
Base64 大小写字母+数字+ +/- 填充 = 尾部常有 =
摩斯电码 .- 的组合 用空格或斜线分隔
凯撒密码 字母按固定偏移替换 可暴力枚举 26 个偏移
栅栏密码 将明文排成矩阵形状后按行/列读取 经典分组密码
猪圈密码 由格子图形代表字母 常见于 Misc 和 Crypto 结合题
与佛论禅/核心价值观 特殊编码工具,玩玩即可 在线解密工具很多

记住:当你拿到一段看不懂的字符串,先去 CyberChef 里用 “Magic” 模块自动识别

4.3 现代密码学核心题型

(1)RSA 基础攻击

RSA 是 CTF 密码学的重头戏。给定公钥 (n, e) 和密文 c,目标是解密密文 m = c^d mod n。当参数选取不当时,存在多种攻击方式。

  • 分解 n:当 n 过小可直接用 factordb.com 分解得到 p, q
  • 共模攻击:同一明文用相同 n 不同 e 加密,可恢复明文
  • 低加密指数攻击:e 很小(如 e=3),当 m^e < n 时直接开 e 次方
  • 维纳攻击:d 较小,可连分数逼近恢复私钥

你不需要手算,学会用 Python 库 Crypto.Util.numbergmpy2 是解题关键。

from Crypto.Util.number import long_to_bytes, inverse
# n, e, c 已知
# 假设已获得 p, q
phi = (p-1)*(q-1)
d = inverse(e, phi)
m = pow(c, d, n)
print(long_to_bytes(m))

(2)DES/AES 模式与 Padding 攻击

分组密码(Block Cipher)常采用 ECB、CBC 模式。ECB 模式下相同明文块会产生相同密文块,利于图案分析。CBC 模式则需要了解 IV(初始化向量)和 Padding 填充,常见的 Padding Oracle 攻击可通过服务器是否返回填充错误逐字节破解密文。

(3)伪随机数攻击

当题目使用易预测的随机数生成器(如 C 的 rand() 基于时间种子)作为密钥或 IV,可以系统时间区间暴力枚举种子。

4.4 学习路径建议

  1. 在 CTF 平台上完成“编码与古典密码”分类
  2. 学习 Python 的 Cryptogmpy2 库使用
  3. 完成 5 道以上 RSA 基础题,理解每种攻击的条件
  4. 查阅 Writeup 理解 AES-CBC 字节翻转等技巧

5. 逆向工程方向入门

逆向工程(Reverse)是通过分析二进制可执行文件,理解其内部逻辑,寻找隐藏的 flag 或破解程序的校验过程。你需要一点点类似侦探的思维。

5.1 逆向的基本流程

  1. 获得一个无源码的程序(Linux 的 ELF、Windows 的 PE/exe 等)
  2. 运行程序,观察行为(有时什么都不做,有时要求输入)
  3. 用工具分析代码逻辑
  4. 找到判断或比较 flag 的关键点
  5. 绕过或计算出正确值

5.2 必备知识与工具

  • 汇编基础:x86/x64 指令集是最常见目标,至少能看懂 movcmpjmpcallpush/pop、函数的序言与结语。
  • 静态分析工具:IDA Pro(行业标准,有免费版)或 Ghidra(开源),用于反汇编/反编译查看 C 伪代码。
  • 动态调试工具:x64dbg (Windows)、GDB + pwndbg 插件 (Linux),用于运行时观察寄存器与内存变化。
  • 十六进制查看与补丁:010 Editor,可以直接修改二进制指令。

5.3 常见逆向题型与解法

(1)简单算法逆推

程序要求用户输入一串字符串,内部经过一系列运算(如异或、加减、查表)后与硬编码的字符数组比较。典型解法:用脚本逆着算法从硬编码往回计算。

例子(Python 模拟逆向):

enc = [0x66, 0x6c, 0x61, 0x67] # 硬编码的密文
for i in range(len(enc)):
    enc[i] ^= 0x20  # 逆向 XOR 20 就是再 XOR 一次
print(''.join(chr(x) for x in enc))  # 输出 flag

(2)约束求解

更复杂的算法涉及多方程组,手动逆推困难。此时使用符号执行引擎如 angr 或约束求解器 Z3。例如 angr 可以自动找到到达“成功”状态的输入,非常强大。

(3)花指令与控制流混淆

为增加阅读难度,代码中会插入无用字节或扭曲流程。静态分析时可能需要手动 patch 掉花指令,或者通过动态调试直接跳到关键位置。

(4)迷宫题

程序将输入字符映射为上、下、左、右,控制一个点在二维数组中移动,走到特定位置即为通过。解法是找到地图、起点和终点,用 BFS/DFS 规划路径,反推出按键序列。

(5)游戏/模拟器逆向

题目给出一个游戏(如 Unity 游戏、pygame 打包程序),需要分析游戏逻辑或篡改分数/状态以拿到 flag。常用工具包括 dnSpy (C# 程序)、Cheat Engine(内存修改)。

5.4 逆向解题心法

  • 先运行:了解程序干了什么,有哪些字符串提示(如 “correct”、“wrong”)。
  • 搜字符串:IDA 中 Shift+F12 搜索 flag 相关字符串,定位关键代码段。
  • 找比较:寻找 cmp 指令后面跟跳转的逻辑,通常是校验点。
  • 伪代码优先:如果反编译的 C 伪代码可读,就别硬啃汇编。
  • 不纠结于细节:很多题不需要 100% 理解所有代码,抓住输入→变换→比较的数据流即可。

6. 训练平台与进步路线

理论看再多,也不如动手解一题。下面这些平台提供大量由浅入深的题目,非常适合新手:

  • 攻防世界 (adworld.xctf.org.cn):新手引导区分类清晰,带 Writeup
  • Bugku CTF:题目基础,Web 和密码学题友好
  • CTFHub:技能树式学习,每个漏洞类型有单独环境
  • NSSCTF:大量国内外赛题复现及 Writeup 搜索
  • PicoCTF:英文全年龄段友好,解题引导详细

建议学习节奏

  1. 先完成引导区的所有方向,熟悉 flag 格式和提交方式
  2. 专攻一个方向 10 题左右,建立手感
  3. 参加一次新手友好的线上 CTF 比赛(如每年春/秋季的公开赛)
  4. 每次赛后阅读他人的 Writeup,学习不同的解题思路

7. 常见问题与坑

  • flag 长什么样? 通常格式为 flag{...}CTF{...},但也可能是纯字符串。请留意题目说明。
  • 工具报错? 多数问题出现在环境依赖上。建议使用 Conda 或虚拟环境管理 Python,逆向工具最好装在匹配的操作系统版本上。
  • 脑子会了手不会? 很正常。打开题目的第一分钟往往是空白的。先模仿 Writeup 中的步骤,逐步建立直觉。
  • 必须会编程吗? Web 入门不需要,但密码学和逆向会 Python 会极大提升效率。边学边练即可。

CTF 是一个实践性极强的领域,唯一不变的方法就是动手、动手、再动手。当你解开第一道题,看到那个 flag 出现在屏幕上时,你就会理解为什么这么多人乐此不疲。祝你玩得开心,学有所成!