2026年“美亚杯”CTF专题
原创
小谢
小谢
小谢取证
2026年10月1日 15:34
福建
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
AI 取证实战 · 第 21 期
美亚杯 CTF 专题:五届 88 道隐写与密码学题全拆解
先讲清概念,再按届拆题——图片隐写、编码链、古典密码、加密容器与逆向解密,以及真题里真正用到的工具与用法
这是一篇专题长文,建议收藏后按章节看:第二章是零基础概念(含形象类比),第三至七章按届拆解题思路,第八章盘工具用法,第九至十一章给你重复考点、易错点和一张能力自测表。全文所有题目都标了届次+题号,可直接回题解原文核对。
一、五届 88 道 CTF 题:一张表看清它的分量
美亚杯办到第十一届,虚拟货币是一条明线,CTF(Capture The Flag 式的解谜考点)是一条暗线。它不像手机取证那样成建制地出题,而是散落在各个检材里:一张照片、一个压缩包、一段流量、一个 exe,你以为在考取证,其实在考解码。
我把 2021—2025 五届个人赛与团体赛的公开题解逐题过了一遍,凡是考点落在隐写、编码、密码学、逆向解密上的题全部挑出来——一共 88 道。这篇文章做三件事:先讲清概念,再把 88 道题按届拆开讲思路,最后把重复考法、易错点和能力清单汇总成表。
i 这篇的统计口径
只统计考点本身落在隐写/编码/密码学/逆向解密上的题,一共 88 道,分三类:图片与文件隐写 42 道(含二维码、EXIF 元数据、尾部附加、备用数据流、白字隐写、音频倒放)、密码学与编码 33 道(含古典密码、编码链、哈希识别、现代加密算法、加密容器与密码来源)、逆向解密 13 道(程序绕过 + 解密)。
只看哈希值(MD5/SHA256)当标识符的题、时间戳换算、硬盘分区分析、纯网络协议字段题,都不计入——那些是取证常规操作。
另有 2025 团体赛第 47 题(TrueCrypt 容器)题解中未单列,不计入 88 道,正文第七节会单独说明。
每一题都标了届次与题号,可以直接回题解原文核对。
| 届次 | 个人赛 | 团体赛 | 小计 | 当年的 CTF 焦点 |
|---|---|---|---|---|
| 2021 第七届 | 1 题 Q36 | 5 题 Q25/Q27/Q28/Q29/Q43 | 6 | 二维码开始出现;PHP 编码链(gzinflate + base64);勒索病毒的文件扰乱方式 |
| 2022 第八届 | 3 题 Q21/Q23/Q29 | 3 题 Q1/Q17/Q18 | 6 | 音频倒放首次出现;RSA 公私钥文件识别;EXIF 被篡改的照片 |
| 2023 第九届 | 1 题 Q59 | 11 题 Q55/Q56/Q78—Q79/Q83/Q85/Q88—Q92 | 12 | OpenStego 图片隐写 + openssl AES 解密接力;Playfair 古典密码;iTunes 备份密码爆破 |
| 2024 第十届 | 9 题 Q19/Q45/Q72/Q74/Q76—Q80 | 14 题 Q19/Q42—Q48/Q52/Q65/Q67—Q68/Q129—Q130 | 23 | PBKDF2 + AES 加密脚本逆向解密(连打 7 题);exe 逆向 patch 绕过登录 |
| 2025 第十一届 | 14 题 Q30/Q35—Q36/Q40/Q63—Q66/Q69/Q80—Q81/Q84—Q85/Q91 | 27 题 Q2—Q4/Q98/Q161—Q164/Q166/Q168/Q214—Q215/Q246—Q251/Q255—Q264 | 41 | PDF 白字隐写、图片尾部隐写 + 凯撒 + 位移推导;PDFStego 工具;SecretSeed.exe 逆向解 AES |
✓ 读表先记一个结论
CTF 题在五届里的曲线是 6 → 6 → 12 → 23 → 41,一路往上,而且 2024、2025 两届占比明显抬升。早期的 CTF 题是「送分小点」(扫个二维码、认个哈希长度),2024 之后变成「一整个检材主线」——2025 年甚至用 9 道题围着一个 SecretSeed.exe,从找账号密码一路做到逆向解开助记词。
再看三类题的分布,能看出美亚杯的口味:图片与文件隐写 42 道(最多,且几乎每届都考)、密码学与编码 33 道(古典到现代都考)、逆向解密 13 道(集中在最近两届)。
换句话说:隐写是基本盘,密码学是提分项,逆向是 2024 年之后新增的大分模块。如果你只准备一个方向,优先把隐写和编码练熟——它占了近一半。
二、先补齐概念:用最土的话讲一遍
这一章不涉及任何检材,全是概念。CTF 题最气人的地方在于:你不是不会操作工具,而是看到一串字符不知道它是什么。先把下面六组概念过一遍,再去看题目,会顺很多。
2.1 四个最容易混的词:隐写、编码、加密、哈希
| 词 | 一句话理解 | 形象类比 | 关键特征 |
|---|---|---|---|
| 隐写 Steganography | 把信息藏在别的东西里,让别人不知道有信息 | 把纸条塞进一本厚书里,书还是那本书 | 载体看不出异样;目的不是让人看不懂,而是让人不知道 |
| 编码 Encoding | 换一套表示方法,没有钥匙,谁都能还原 | 把中文翻译成拼音,规则公开 | Base64、URL 编码、十六进制;看到就解,秒出 |
| 加密 Encryption | 把信息锁起来,要有钥匙才能看 | 上锁的箱子,钥匙在谁手里谁才能开 | AES、RSA、凯撒;有密钥参数,错了就是乱码 |
| 哈希 Hash | 单向 的指纹,指不能倒推回人 | 指纹——能证明是你,但从指纹画不出你 | MD5/SHA 系列;只能比对,不能「解密」 |
! 这组区分为什么重要
2024 团体赛 Q52 就是拿这四个词做文章:题目问「Ben 用什么技术保护他的 webshell 脚本」,标准答案是 代码混淆,而不是很多人以为的「加密」或「隐写术」。如果你分不清这三个词的区别,这道题就会凭感觉选错。
2.2 文件也有「身份证」:文件头与魔数
每个文件的开头几个字节是固定的,叫文件头(File Signature / Magic Number)。系统靠它判断文件到底是什么,而不是靠扩展名。改扩展名是最廉价、也最常用的伪装手段。
| 文件类型 | 文件头(十六进制) | ASCII 特征 |
|---|---|---|
| JPEG 图片 | FF D8 FF | ——— |
| PNG 图片 | 89 50 4E 47 | ‰PNG |
| 25 50 44 46 | ||
| ZIP / Office 2007+ / APK | 50 4B 03 04 | PK.. |
| RAR | 52 61 72 21 | Rar! |
| GIF | 47 49 46 38 | GIF8 |
| 老版 Office(97-2003) | D0 CF 11 E0 | ——— |
2022 个人赛 Q29 就考了这个:一个扩展名写着 .pdf 的文件,文件头却是 D0 DF 11 E0——它其实是 2007 版之前的老 Office 文档(OLESS 结构),跟现在常见的 OOXML 格式完全不是一回事。先看头,再看名,这是做这类题的第一反应。
2.3 EXIF:照片自带的「体检报告」
手机拍照时,会往图片里写一组元数据:拍摄时间、相机型号、镜头、光圈快门 ISO、GPS 经纬度、方向(Orientation)、甚至软件名。这组数据叫 EXIF。它是美亚杯最高频的考点之一,五届都在考。
- 拍摄时间
:2025 个人赛 Q66 问 IMG\_0022.JPG 的创建时间,答案直接读 EXIF 的 2025:05:16 11:33:15。
* 相机型号
:2024 个人赛 Q45(LG-H930)、2025 个人赛 Q63(iPhone SE 3rd generation)都是从 EXIF 里读。
* GPS 经纬度
:2024 团体赛 Q129、2025 个人赛 Q40 都是给坐标选项让你挑。
* 方向 Orientation
:2025 个人赛 Q65,EXIF 写 Right top,意思是「手机右边框在顶部」,换算过来是逆时针旋转 90 度。
! 最容易踩的坑:EXIF 里没有怎么办
2025 个人赛 Q64 问 IMG\_0005.JPG 的坐标,题解明确写着:「源文件中的 EXIF 信息不包含 GPS 信息,需要在 Photos.sqlite 中查看」。也就是说,EXIF 不是唯一的元数据源——iOS 会把一份副本写进 Photos.sqlite 的 ZEXTATTR 表(对应字段 ZLATITUDE / ZLONGITUDE),2025 个人赛 Q40 更是要靠对比同批照片才能判定「ZEXTATTR 表里的才是真实值」。只翻 EXIF 就放弃,这两题都会丢分。
2.4 二维码:最朴素的「图片藏信息」
二维码本身不是隐写,但把二维码印在照片里、或者当成素材藏在图片堆里,就是隐写题的常见形态。美亚杯从 2021 考到 2025,一年没落:
- 2021 团体赛 Q29:按拍摄时间过滤图库,扫二维码得到「忠誠勇毅」。
- 2023 团体赛 Q83:用激光雕刻机打印过二维码的文件名(要查打印机 App 的数据库)。
- 2025 团体赛 Q98:NAS 里同名文件中的二维码,资讯值是一串钱包地址。
- 2025 团体赛 Q214:问到有几个 jpg 里的二维码藏着指定字符串——答案是 4 张,需要顺着路径把同类图片全找出来,是「数量题」,漏一张就错。
2.5 古典密码:凯撒与 Playfair
古典密码是用纸笔就能解的密码,美亚杯考过两种:
| 密码 | 原理 | 形象类比 | 美亚杯出处 |
|---|---|---|---|
| 凯撒密码 Caesar | 每个字母按固定位数平移(+3 就是 A→D) | 把字母表的转盘整体拧几格 | 2025 团体赛 Q215、Q255 |
| Playfair | 把字母两两分组,按 5×5 方阵做替换 | 两个人对着方阵表报坐标 | 2023 团体赛 Q89 |
凯撒密码在 2025 年考了两次,而且都不是「傻解」:Q215 是先用隐写取出文本、再用 CyberChef 做凯撒解密;Q255 更绕——题干给了一条「+3」的线索,但另外还隐含了一个「-5」(因为 MIDI 里 60 代表 A,而 ASCII 里 A 是 65,两者差 5),两个位移叠加才是真正的位移。这就是美亚杯的典型手法:它不考你会不会用工具,考你能不能把多个线索串成一条。
2.6 现代密码:三件套 + 两个参数
现代加密的题,考来考去是三件套和两个参数:
| 概念 | 一句话 | 出现在哪 |
|---|---|---|
| 对称加密 AES | 加密解密用同一把钥匙;最常见的是 AES-CBC、AES-GCM | 2023G-Q92、2024G-Q42/Q43/Q65、2025G-Q260/Q261 |
| 非对称加密 RSA | 公钥加密、私钥解密 ,两把钥匙成对出现 | 2022G-Q17、2022G-Q18 |
| 密钥派生 PBKDF2 | 把用户密码反复摔打变成一把真正的钥匙(防暴力破解) | 2024G-Q42/Q45/Q46 |
| 初始向量 IV | 让相同明文每次加密结果都不同;通常放在密文最前面 | 2024G-Q43 |
| 盐值 SALT | 防止相同密码算出相同钥匙;跟着密文一起存 | 2024G-Q44 |
2024 团体赛 Q42—Q48 是这条线的完整示范:给了加密脚本,要你先读懂「文件前 16 字节是 IV、接着 32 字节是 SALT、后面才是密文」的结构,再用 PBKDF2 按脚本参数重算 key,最后解出 Excel。读懂脚本比会点工具更重要——这一点第八、九章还会反复说。
2.7 加密容器与压缩包:两道门
题目里出现的「加密文件」通常是两种东西之一,处理方式完全不同:
- 压缩包加密(ZIP/RAR/7z)
:密码错就解不开。但别急着跑字典——先看题干有没有直接给、检材别处有没有、选项里是不是就摆着候选,几条路都不通才上字典(完整顺序见 8.5 节)。2025 团体赛 Q246 是那种真需要爆破的:先试六位数字失败,改用 Kali 自带的 rockyou.txt 才跑出 pass1234;2023 团体赛 Q85 的 iTunes 备份密码则要先 itunes_backup2hashcat 提取哈希,再交给 Hashcat 跑数字字典;图形化路线则用 Passware Kit 直接吃 Manifest.plist,两条路都能跑到 123456。
* 加密容器(TrueCrypt/VeraCrypt/BitLocker/加密 dmg)
:它本身是一个虚拟磁盘,挂载后才能看到里面的文件系统。2025 个人赛 Q84 的 xcontainer 加密算法是 AES(Twofish),2025 团体赛 Q47 用的是 TrueCrypt,2023 团体赛 Q56 是 macOS 的加密 .dmg。注意两点:一是容器题经常配一个密钥文件(不是密码),比如 2025 个人赛 Q84 的 vera_key;二是解容器的密码同样多数来自线索——2024 团体赛 Q68 的 BitLocker 密码,就是上一题从图片尾部解出来的那个 Word 里写着的。
2.8 逆向题的三个固定动作
2024 之后的逆向题,解法高度套路化,就三个动作:
- ① 搜字符串
——找 Invalid username or password 这类提示语,它附近十有八九硬编码着正确的账号密码(2025 团体赛 Q256/Q257 就是这个思路,直接捞到 manson 和 manson@MFI)。
* ② 看条件跳转
——程序判断「能不能解密」靠的是一个标志位,汇编层面就是一条 JZ/JNZ(2025 团体赛 Q262 问的正是这个,答案是 JZ)。
* ③ 打补丁
——把跳转改成不跳(patch 成 NOP),或者把那个标志位改成非零,程序就乖乖把明文吐出来(2024 个人赛 Q74/Q79、2025 团体赛 Q260 都是这么做的)。
还附带一个必考的小算术:地址换算偏移量。IDA 里看到的地址是从镜像基址算起的,2024 个人赛 Q78 的 byte_14000808C 减去基址 0x140000000,得到偏移 0x808C;2025 团体赛 Q264 同理,0x140005704 - 0x140000000 = 0x5704。看到 0x140 开头的地址,先减基址,这就是答案。
三、2021(第七届):二维码、编码链与勒索病毒
第七届的 CTF 题只有 6 道,形态很朴素,但奠定了几条沿用至今的考法:二维码从这一届开始出现,编码链从这一届开始考,文件被加密扰乱也从这一届开始问。
3.1 二维码的第一次登场(团体赛 Q29)
题目:「特普的电话中一张于 2021 年 09 月 30 日 10:45:12 拍摄的相片包含以下哪些字?」选项是「精忠/报国/忠诚/勇毅」。
题解只写了一句:「在图库中过滤时间,扫描二维码得到:忠誠勇毅」。看似简单,但这里面有三个动作,缺一不可:
- 按时间过滤
——照片那么多,先锁定时点;时间本身来自 EXIF 或相册数据库。
* 把原图导出
——不能在缩略图上扫,缩略图往往裁掉了边缘。
* 扫码
——题目给的是繁体字选项,实际扫出来也是繁体「忠誠勇毅」,答题时要照着题目的字形写,简繁转换有时会丢分。
3.2 PHP 编码链:gzinflate(base64\_decode())(团体赛 Q25/Q27/Q28)
这一组题问的是网页服务器上一个可疑档案:译码函数是什么、解压后脚本有什么功能、用的什么解压方法。标准答案是一条 PHP 里的经典组合:
gzinflate(base64\_decode($x))
拆开看就是两层:先 Base64 解码,再 gzinflate 解压。这是 webshell 免杀最常用的手法——Base64 把二进制变可打印字符,gzinflate 再压一层让特征码更难匹配。做题时的顺序是从内到外:先解 base64,再解压,解出来的才是一段可读脚本。
✓ 这类题的通用解法
看到一长串以 = 结尾的可打印字符,先试 Base64;解出来如果还是乱码但看得出有规律(比如以 eJ 开头),那就是 zlib 压缩,丢进 CyberChef 加一个 Raw Inflate 步骤即可。PHP 里的 gzdecode/gzinflate/gzuncompress 三个函数对应三种不同的压缩方式,本题答案是 gzinflate,不要选 gzdecode——这是最常见的错项。
3.3 勒索病毒是怎么「扰乱」文件的(团体赛 Q43)
题目问:「特普的计算机可能中了病毒,病毒扰乱文件方法是甚么?」选项是 +3 / XOR5 / +4 / −4。
这类题的判断方法很直接:拿一个被破坏的文件和一个已知原文比对。如果每个字节都加了同一个数,就是「位移加密」(+3 表示每个字节加 3);如果每个字节都跟同一个值做了异或,字节会在两个「镜像位置」之间跳动,那就是 XOR。
| 手法 | 字节变化特征 | 恢复方式 |
|---|---|---|
| 位移(如 +3) | 整体偏移,可打印字符会整体「挪」到另一个区间 | 逐字节减 3 |
| 异或 XOR 5 | 字节成对跳动,同一位置异或两次恢复原值 | 再异或一次同一个值 |
2021 年这一题只是问「用了哪种方法」,到了 2024、2025 年就升级成了「自己写出解密脚本把它还原出来」——同一个知识点,难度两级跳。
3.4 原图、缩略图与哈希(个人赛 Q36)
题目给了一张 IMG_0056.HEIC 和一张 5005.JPG(附 MD5),问它们「看似同一张相片,在电子数据取证分析下哪个描述正确」,答案是多选 BCD。考点是 iOS 的图片机制:
- HEIC 是原图
,JPG 是系统生成的缩略图(在 iOS 里通常以 5005.JPG 这类固定名出现在相册数据库目录下)。
* 两者哈希必然不同
——格式不同、压缩参数不同,内容一样也不影响哈希不同。
* 它们存在不同的 .db 里
,因为一个是相册资产、一个是缩略图缓存。
这个考点在 2024 个人赛 Q19 又原样考了一次(这次是 IMG_0008.HEIC 与 5005.JPG)。看到「5005.JPG」这个固定名,直接想到 iOS 缩略图,是能省时间的一条经验。
3.5 这一届的易错点
- 扫出来的字符要照题目给的字形抄(繁体就是繁体),别自己转简体。
gzinflate
与 gzdecode 只差一个词,但答案只有一个。
* HEIC 与 JPG「同一张图」不代表哈希相同——哈希比的是字节,不是画面。
* 位移加密与异或加密的选项经常同时出现,先比对字节再选,不要凭印象。
四、2022(第八届):音频倒放、RSA 密钥与「被改过的照片」
第八届也是 6 道,但花样变了:出现了音频隐写,出现了非对称加密的密钥文件,还第一次考了「照片的元数据被人动过」。
4.1 音频倒放:把声音倒过来听(团体赛 Q1)
题目:「在朗尼手机 2022 年 9 月 30 日的 WhatsApp 对话里,有一段音讯提到王景浩会给朗尼现金多少作为租用 VPN 的租金?」题解写得很生动:「呃呃,写到这题属实绷不住了。倒放是吧。」并给了一个在线音频倒放工具。答案是 HKD 3000。
这就是音频隐写最基础的形态:信息就在音频里,但被倒着录了进去,正常播放听不出人话,倒放就清楚了。同类手法还有:把信息藏在某个频段(要频谱图)、藏在双声道的一侧、藏在静音段里。
✓ 音频题的三板斧
① 倒放(很多工具一键完成);② 看频谱图——把音频丢进 Audacity 切「频谱图」视图,藏进去的文字或图形会直接显形;③ 看声道——有些题只用左声道或右声道携带信息。本题只要第一招,但后面两招在其它赛事里很常见。
4.2 RSA 密钥文件长什么样(团体赛 Q17/Q18)
这一组题给了一个 Data 文件夹,里面有 P1~P4 四个密钥文件,问:存的是哪一种密钥文件、被加密的档案用了哪种密钥类型。
题解的做法很有参考价值:文件夹里还有一份 Notes 教程和一个 rtf 文档,说明当事人正在自学加密,教程里给了生成密钥的 Python 代码:
import rsa public\_key, priv\_key = rsa.newkeys(1024) with open(filename, 'wb') as f: if filename == 'P1': f.write(public\_key.save\_pkcs1('PEM')) elif filename == 'P2': f.write(priv\_key.save\_pkcs1('PEM'))
代码里出现 PEM,所以第一问答案是 pem;而 P1(公钥)与 P2(私钥)是一对,加密档案用的是 RSA。
更值得学的是题解的验证思路:「找到 private 和 public 关键字的两组文件,然后依次加密解密找到匹配的一组」——也就是把公钥加密、私钥解密真的跑一遍,配对成功的才是一对。不要靠文件名猜,要跑一遍验证。
| 密钥文件格式/类型 | 特征 | 用途 |
|---|---|---|
| PEM | 文本形式,以 -----BEGIN ... KEY----- 开头结尾 |
最常见的密钥交换格式 |
| Symetric / AES / Twofish | 对称密钥,只有一把钥匙,加解密都用它 | 速度快,常用于文件加密 |
| RSA / PGP | 非对称,公钥私钥成对 | 加解密、签名、邮件加密 |
4.3 Office 文档也会加密(个人赛 Q21)
题目:「李大辉手机里有一个 order.xlsx 的档案被加密了,解密钥匙是」,四个选项是 Nov2022!/2022_Nov!/20221101/P@ssw0rd!,答案 Nov2022!。
这道题的密码既不是猜出来的,也不是爆破出来的,而是写在检材里的便签上——把当事人手机里的便签/记事翻一遍,密码就摆在里面。题解本身只列了选项与答案、没有展开过程,所以性质要说清楚:它属于「密码藏在另一份检材里」这一类,不是「考你熟不熟悉常见口令的命名习惯」。
这一点很关键。四个选项 Nov2022!、2022_Nov!、20221101、P@ssw0rd! 形态高度相似,如果按「哪个更像常见弱口令」去推,很容易在 A 和 D 之间反复摇摆;而只要先在检材里翻到那张便签,四个选项的干扰就全部消失了——先找线索,再谈其他。
Office 文档的加密(97-2003 的 RC4、2007+ 的 AES)在取证里有三条路,按这个顺序试:① 题干/案件描述里直接给;② 从检材里找线索(便签、备忘录、聊天记录、壁纸、文档属性);③ 以上都落空,才用 Passware Kit/Hashcat 这类工具去跑。美亚杯里前两条占多数,跑字典反而是最后手段——完整判断顺序见第八章 8.5 节。
4.4 被改过的照片(个人赛 Q23/Q29)
第八届个人赛有两道很典型的「元数据题」:
- Q23
:问「有一张由该手机拍的照片,照片的元资料曾被修改,这张照片的档案名是什么」,答案是 20220922_152622.jpg。判断方法是对比文件名里的时间与 EXIF 里的时间是否一致——文件名说 9 月 22 日,EXIF 却是另一个时间,就说明被动过。
* Q29
:问「王晓琳发给林浚熙的 PDF 档案的文件签名是什么」,答案是 D0 DF 11 E0。前面第二章讲过,这是老版 Office 的 OLESS 结构——扩展名写着 PDF,内容根本不是 PDF。
! 这两题为什么容易错
Q23 的坑在于:文件名的时间是「看起来」的时间,EXIF 才是相机写的。两者不一致,就说明有人改过其中一个(通常是文件名,因为它更容易改)。Q29 的坑在于:只看了扩展名就下结论。做题顺序永远是「先看文件头,再看扩展名」,这两个顺序反了,题就错了。
4.5 这一届的易错点
- 音频听不出人话,先试倒放,不要急着判定「没有信息」。
- 密钥文件格式题:先读文件内容找关键字(PEM/public/private),别猜。
- 文件签名题:永远先看头几个字节,扩展名只能当参考。
- EXIF 时间与文件名时间冲突时,以 EXIF 为准,并把它当作「被篡改」的证据。
五、2023(第九届):OpenStego 与 openssl 的接力
第九届的 CTF 题涨到 12 道(其中 11 道在团体赛),而且第一次出现了「一条链走到底」的设计:先从一个 bmp 图片里把密码隐写取出来,再用这个密码去解密一个 Word 文档。这一届还考了 Playfair 古典密码,以及五届里少数真正需要爆破的 iTunes 备份密码。
5.1 base64 编码链里的一个坑(团体赛 Q55)
题目给了四个文件 f.rtf、a.rtf、f1.txt、a1.txt,要求给出它们的内容。线索藏在 zsh 的 shell 历史里:
echo f.rtf | base64 > key-a.txt echo a.rtf | base64 > key-b.txt textutil -convert txt -stdout f1.rtf | base64 > key-c.txt textutil -convert txt -stdout a1.rtf | base64 > key-d.txt
关键差异在有没有 textutil 这一步:
| 输出文件 | 实际内容 | 解码后得到 |
|---|---|---|
| key-a.txt | Base64(字符串 \"f.rtf\") | 文件名本身 f.rtf——不是文件内容 |
| key-b.txt | Base64(字符串 \"a.rtf\") | 文件名本身 a.rtf——不是文件内容 |
| key-c.txt | Base64(f1.rtf 的正文) | 真正的密钥内容 |
| key-d.txt | Base64(a1.rtf 的正文) | 真正的密钥内容 |
! 这道题的陷阱
echo f.rtf | base64 编码的是四个字符的文件名,而 textutil -convert txt -stdout f1.rtf | base64 才是编码文件内容。题解原话:「key-a 和 key-b 存在问题,这两个文件中并不包含 f.rtf 或 a.rtf 文件内容」。看到 shell 历史里的编码命令,先确认它编码的是「文件名」还是「内容」——这是这道题唯一的难点,也是最容易忽略的地方。
5.2 OpenStego:图片里藏了一段文字(团体赛 Q90/Q91)
这一组题是 2023 年最完整的一条隐写链。题目问:「李哲图曾执行一个程序在 key.bmp 的图片文件中隐藏一段文字,请问他是用哪一个程序」,选项有 Steganography Studio、OpenStego、Steghide、S-Tools,答案 OpenStego。
题解的取证路径很清楚:在李哲图的电脑里找到 /Users/chris/Downloads/openstego-0.8.6.zip——工具包本身就躺在检材里;同时在 /Message/input/Message.txt 里存有隐写用的密码 P@ssw0rd。
OpenStego 是最常用的开源隐写工具之一,基本用法就三步:
- ① 选模式
:Hide Data(藏数据)或 Extract Data(取数据)。
* ② 选载体
:载体是图片(BMP/PNG 最稳,JPEG 有损压缩容易破坏数据)。
* ③ 填密码
:密码正确才能取出信息。
✓ 为什么是 BMP
本题的载体是 key.bmp。隐写算法常改到像素的最低位(LSB),而 JPEG 是有损压缩,重新编码会把低位改回去,所以隐写多用 BMP/PNG。看到题目里的载体是 bmp 或 png,就该往 LSB 隐写上想。
5.3 openssl 解密 Word:隐写出来的密码派上用场(团体赛 Q92)
承上题,隐写取出的 P@ssw0rd 就是用来解密一个加密 Word 的。线索来自 PowerShell 的历史文件(PSReadLine 记录):
openssl enc -aes-256-cbc -salt -a -e -in Data.docx -out encrypted.docx runas /user:Administrator cmd
反向操作就是解密:
openssl enc -aes-256-cbc -salt -a -d -in \"encrypted.docx\" -out \"decrypted.docx\"
参数逐个拆开:-aes-256-cbc 是算法(AES-256-CBC)、-salt 表示加了盐、-a 表示输入输出用 base64、-d 是 decrypt(解密,加密是 -e)。把 -e 改成 -d,其余的照抄,就是解密命令——这是这类题最省力的做法,不需要自己推导参数。
解出来的 Word 里要回答「李美玲的年龄」,答案是 25。整条链是这样的:找工具包 → 找到隐写密码 → OpenStego 取出文本 → 用文本当密码 openssl 解密 → 读答案。
i 这条链子的意义
2023 年的这道题,把「隐写」和「加密」串成了一条线。两年后的 2025 年,美亚杯把这条线拉得更长(PDF 白字隐写 → 压缩包密码 → 容器挂载 → 助记词),但基本骨架没有变。练熟这一届的链条,2025 的题就是加长版。
5.4 Playfair 古典密码(团体赛 Q89)
题目线索藏在一张命名为 use this.png 的图片里——它其实是一张 Playfair 加密的方阵图加上密文。题解给了解密四步:
1) Split : RN RY EY PS FL RZ SB NT MW MW 2) Decode: PA SX SW OR DF OX OT BA LX LX 3) Merge : PASXSWORDFOXOTBALXLX 4) Remove Bogus: PASSWORDFOOTBALL
最后推测密码为 FOOTBALL(题解也补了一句「爆破跑字典也能很快跑出来」)。Playfair 的规则是两两分组、按 5×5 方阵做替换,解密结果里会插入无意义的填充字母(本题的 X),要先合并再删掉填充字符。
| 古典密码 | 分组方式 | 解密要点 | 工具 |
|---|---|---|---|
| 凯撒 Caesar | 单字母 | 试 26 种位移,或按线索算位移量 | CyberChef 的 ROT13/凯撒 |
| Playfair | 两字母一组 | 需要 5×5 方阵;注意填充字符 | 手工按方阵推解(题解即手算四步) |
| 维吉尼亚 Vigenère | 单字母 | 需要关键词 | CyberChef(Vigenère Decode) |
| 栅栏 Rail Fence | 按行重排 | 试栏数 | CyberChef |
5.5 哈希识别与 iTunes 密码爆破(团体赛 Q79/Q85)
Q79 问 true-ubuntupassword.txt 里的哈希是哪一种,答案是 MD5——题解的理由只有一句:「长度 32 位(MD5)」。所以哈希长度表是必须记住的:
| 算法 | 长度(十六进制字符) |
|---|---|
| MD5 | 32 |
| SHA-1 | 40 |
| SHA-256 | 64 |
| SHA-512 | 128 |
Q85 更进一步:「陈大昆的手机被一个 iTunes backup 密码加密保护,这个密码是什么」,答案是 123456。注意这是五届里少数需要真正爆破的题,而且题干已经把范围缩小了——题解写「根据答案格式,密码应该由数字组成」,先被缩到数字,才上的数字字典,不是漫无目的地跑。完整流程是:
- 从
Manifest.plist里提取哈希——用工具itunes_backup2hashcat。 - 得到形如
$itunes_backup$*10*...*10000*...*10000000*...的哈希串(注意里面的迭代次数参数)。 - 丢给 Hashcat,配数字字典(常见弱口令 + 生日)。
- 跑出密码
123456。
✓ 这一步为什么不能跳过工具
iTunes 备份的密码不是明文存的,而是经过多轮 PBKDF2 派生后的哈希。所以必须先把哈希格式转成 Hashcat 认识的格式,再爆破。直接上手猜密码是没用的——这是「先转换格式、再交给爆破工具」的标准两步走。嫌转格式麻烦的话,图形化工具能一步把这两件事做完。
上面这条是命令行路线。同一道题还有图形化路线:用 Passware Kit 直接把 Manifest.plist 导进去,选好字典或掩码就能跑,不需要先转哈希格式。2025 个人赛的题解就是把两者并列写的:「可以通过 Passware 或 HashCat 等密码爆破工具结合弱口令字典或 4 位数字掩码进行爆破」——是并列的两把工具,不是谁替代谁。两条路的关系有点像螺丝刀和电钻,都拧得动螺丝,看你手上有什么、赶不赶时间:
| 路线 | 怎么做 | 什么时候用它 |
|---|---|---|
命令行 :itunes_backup2hashcat + Hashcat |
先从 Manifest.plist 提取哈希、转成 Hashcat 认识的格式,再跑字典或掩码 |
想精确控制参数、要把过程写进报告时 |
| 图形化 :Passware Kit | 直接导入 Manifest.plist(或加密文档、加密容器),选字典/掩码即可开跑 |
考场求快、不想记格式与 -m 编号时 |
本题(Q85)题解走的是命令行那条;图形化那条是你实操里可以走的替代路径,答案一样是 123456。
拿这一届的另一处密码对照一下就很清楚:Q88 从 ADS 里取出的内容也是一个哈希(MD5),用的办法却是在线查表,题解原话是「离线环境下,大部分的弱口令字典应该也都爆不出来吧」。同样是「以哈希的形式出现」,一个查表、一个爆破——判断顺序统一写在第八章 8.5 节,别见到哈希就上字典。
5.6 备用数据流与邮件附件(团体赛 Q78/Q88/Q83)
Q78 问:「潘志辉应用了哪一个技术把 true-ubuntupassword.txt 隐藏在 ubuntupassword.txt 中」,答案是 备用数据流(Alternate Data Stream, ADS)。
这是 NTFS 文件系统的一个特性:同一个文件名下可以挂多股「数据流」(形如 文件.txt:隐藏流名),用普通打开方式只看得到默认的那一股。形象点说,像一本书有夹层——在外层书名下还藏着一层内容。
另两道题也值得记住:Q88 要你从 Thunderbird 的邮件存储文件里把 Base64 编码的附件提取出来再解码保存(题目答案是 New Target.rar 和 use_this.png);Q83 问激光雕刻机打印二维码用的是哪个文件,答案要从打印机 App 的数据库 com.hingin.l1.hiprint/databases/hiPrint 里查打印记录。
5.7 加密 dmg 与图片元数据(团体赛 Q56/个人赛 Q59)
Q56 考的是 macOS 的加密磁盘镜像:从 zsh 历史里看到两条 hdiutil 命令,create -encryption -stdinpass 表示「创建时要求输入密码」:
hdiutil create -encryption -stdinpass -fs ExFAT -volname funnystuff -o funnystuff.dmg -size 100M hdiutil create -encryption -stdinpass -fs ExFAT -volname auto -o auto.dmg -size 256M
密码则来自另外两个文件:当事人用 textutil 把 rtf 转成文本、再 Base64 存成 key-c.txt/key-d.txt。解密后得到 funnystuff 与 autogpt。题解还给了三条打开 dmg 的路径:macOS 直接挂载、hfs explorer(仅限 HFS 文件系统)、以及 encrypteddmg 的 readencrcdsa 脚本——本题因为文件系统是 exFAT,只能用第三种。
个人赛 Q59 则是 iOS 相册数据库题:问 IMG_0008.HEIC 的哪项描述是错的(答案 ABCD)。考点是 Photos.sqlite 里那几张关联表(ZASSET/ZEXTATTR)分别记录了拍摄来源、是否被修改、前后镜头、ISO、经纬度。图片的元数据不只在 EXIF 里,这一点第二章已经强调过,2025 年考得更狠。
5.8 这一届的易错点
- shell 历史里的编码命令,先分清编码的是「文件名」还是「文件内容」(Q55 的全部难点)。
- OpenStego/Steghide/S-Tools 是四个不同工具,别只认名字眼熟的——要回检材里找工具包。
- openssl 解密:把加密命令的
-e换成-d,参数照抄,别自己重写。 - 哈希识别只数长度:32=MD5、40=SHA-1、64=SHA-256、128=SHA-512。
- iTunes 备份密码有两种跑法:命令行要先转成 Hashcat 格式,图形化的 Passware Kit 可直接导入
Manifest.plist。 - ADS(备用数据流)是 NTFS 特性,答案是四个选项里唯一的「文件系统层面」的技术。
六、2024(第十届):读懂加密脚本,再逆向一个 exe
第十届的 CTF 题跳到 23 道,而且性质变了:不再是「解一个点」,而是「读懂一段逻辑」。这一年最有代表性的两组题,一组是给一个加密脚本让你反推解密(Q42—Q48),另一组是给一个 exe 让你 patch 掉判断(个人赛 Q74—Q80)。
6.1 加密脚本题的读法:文件结构先看清楚(团体赛 Q42/Q43/Q44)
题目给了 secretExcel.encrypted 和它的加密脚本。Q42 问「解密这个文件的第一步应该是什么」,答案是「打开加密文件并读取文件的前 16 个字节」。为什么是前 16 字节?看加密脚本的写入顺序:
salt = get\_random\_bytes(32) key = PBKDF2(password, salt, dkLen=32, count=100000000) output\_dir = os.path.dirname(file\_path) output\_dir = os.path.dirname(file\_path) cipher = AES.new(key, AES.MODE\_CBC) f\_out.write(cipher.iv) # 先写 IV(16 字节) f\_out.write(salt) # 再写 SALT(32 字节) f\_out.write(encrypted\_data) # 最后才是密文
所以这个加密文件的布局是三段拼接:
| 位置 | 长度 | 内容 | 对应题目 |
|---|---|---|---|
| 第 0—15 字节 | 16 字节 | IV (初始向量) | Q43 答案 64f4e21c1e4cc3a60137da79e75bf973 |
| 第 16—47 字节 | 32 字节 | SALT (盐值) | Q44 答案 5d5ca840accf...2efd05cc436c4a5424 |
| 第 48 字节起 | 剩余全部 | 密文 | Q46 用它算 key 后解密 |
✓ 「第一步是什么」这类题的通解
给一个加密文件问你「第一步」,答案几乎总是「读文件头,确认参数放在哪、各占多少字节」。因为解密需要三样东西:算法、钥匙、参数(IV/SALT)。算法和参数结构都写在加密脚本里,所以先读脚本,再读文件头,顺序不能反。
6.2 三个参数分别在干什么(团体赛 Q45/Q46)
Q45 问:「如果更改 PBKDF2 的 count 参数会产生什么影响」,答案是「同时影响所需的计算性能和安全性」。题解的注解很到位:「相同算法情况下,牺牲性能提高安全性」。
| 参数 | 作用 | 改了会怎样 | 类比 |
|---|---|---|---|
| 算法 | 决定怎么锁 | 换了算法,密文完全不同 | 换一把锁 |
| 密钥 password | 真正的钥匙来源 | 错了就解不开 | 钥匙 |
| IV | 让相同明文加密结果不同 | 缺失会导致密文可预测 | 每次上锁的随机「起始位置」 |
| SALT | 防止相同密码算出相同 key | 缺失会导致彩虹表攻击可行 | 给密码撒一把盐 |
| count | PBKDF2 反复迭代次数 | 越大越安全,但越慢 | 把密码摔打很多遍才变成钥匙 |
Q46 要你真正算出 key 的值(答案是一串 32 字节的二进制)。做法就是照着重写一遍解密脚本、把 key 打出来:读 IV → 读 SALT → 用同样的 password 与 count 调 PBKDF2 → 得到 key。题解原话:「在解密脚本中输出密钥值即可」。拿到 key 之后 Q47/Q48 就是顺水推舟,解密出的 Excel 里查电话号码与人名。
6.3 代码混淆:一个容易选错的选项(团体赛 Q52)
题目问:「Ben 准备了几个用于黑客攻击的脚本,他采用了什么技术来保护代码」,选项是加密/代码混淆/隐写术/编译,答案是 代码混淆。
题解解释了原因:那个脚本是 weevely3 生成的 webshell,「为了免杀,大多数 webshell 都要经过混淆」。为什么不是「加密」?因为混淆后的代码本身还能被浏览器/解释器正常执行——它只是把变量名改乱、把逻辑绕弯,没有任何密钥参与。
| 技术 | 代码还能直接运行吗 | 有没有密钥 | 典型用途 |
|---|---|---|---|
| 加密 | 不能,必须先解密 | 有 | 保护数据 |
| 混淆 | 能 | 没有 | 免杀、防止别人读懂源码 |
| 隐写 | 不适用(藏的是数据不是代码) | 可能有 | 把数据藏进载体 |
| 编译 | 编译后是二进制,不是源码 | 无 | 把源码变成可执行文件 |
! 这道题的教训
「保护代码」四个字很容易让人往「加密」上想,但判断依据是「要不要密钥才能跑」。混淆后的脚本不需要任何密钥就能执行,所以它不是加密。这是 2024 年最典型的「概念题」,也是本专题第二章那四个词的意义所在。
6.4 一张图里塞了一个 Word(团体赛 Q67/Q68)
题目问:「是什么导致了『满汉全席.jpg』和『满汉全席Secret.jpg』之间的大小差异」,答案是「档案嵌入其中」。题解的推理很干脆:「对比一下文件,明显是隐写了一个 office 文档」。
手法是尾部附加(Append):JPEG 有明确的结束标志 FF D9,在它后面再追加一段数据,图片照样能正常打开、看不出任何异常——因为看图软件读到 FF D9 就停了。
满汉全席.jpg ← 正常图片,到 FF D9 结束 满汉全席Secret.jpg ← FF D9 之后又跟了一个完整的 Office 文档
取出方法也很朴素:把文件扩展名改成 .zip 或 .7z 直接解压(Office 2007+ 的文档本质就是一个 zip 包),解出来就是文档。本题解出来的是一份 BitLocker 恢复密钥,还附了一行密码——这个密码紧接着在 Q68 里用于解密 SD 卡(IamRich123!)。
✓ 尾部附加题的三个信号
① 两张「同名不同大小」的图片放在一起对比——这是出题人给的最强暗示;② 用十六进制编辑器搜 FF D9,看后面还有没有数据;③ 拿 binwalk/foremost 扫一遍,看看嵌了什么。本题就是第 ① 种。
6.5 逆向一个 exe:把跳转打掉(个人赛 Q74/Q76—Q80)
第十届个人赛藏了一组完整的逆向题,围绕一个 Bitlocker.exe:它要求输入账号密码,验证通过才吐出 BitLocker 恢复密钥。一共 7 道题,正好是第二章 2.8 节那三个动作的展开。
第一步:找账号密码
答案是用户名 david1337、密码 1337david。题解说明:「先比对用户名,再比对密码」——程序里两段判断是顺序执行的,跟着判断逻辑就能读到两个硬编码字符串。
第二步:看它怎么决定「显示成功还是失败」
Q77 问程序用什么途径决定显示哪条消息,答案是「通过检查每个寄存器的值来决定跳转到不同的汇编代码区段」。题解补了一句关键细节:「代码通过检查 eax 寄存器的值来决定跳转」。这就是逆向题的通用形态——一个值 + 一条条件跳转 = 一个开关。
第三步:找到那个开关,改掉它
Q78 问「决定能否解密 BitLocker Key 的字节的内存偏移量」,答案是 0x808C。题解的推算过程值得背下来:
判断的条件来自 byte\_14000808C 它的地址是 0x14000808C,基址是 0x140000000 偏移 = 0x14000808C - 0x140000000 = 0x808C
Q79 问「拿到偏移量后该怎么用」,答案是「把该偏移量处的值改为 1(true),以启用解密过程」。题解给了两种改法:用十六进制编辑器(010 Editor、ImHex)或者用 IDA。
Q74 则从另一条路问:「如何修改汇编代码来绕过检查,达到任意输入都成功登录」,答案是「修改 TEST 指令后的跳转指令 JNE 为 NOP,使跳转指令失效」。也就是把「不相等就跳走」的那条指令直接抹掉,程序无路可跳,只能顺着走成功分支。
| 思路 | 改什么 | 效果 | 对应题 |
|---|---|---|---|
| 改数据 | 把标志位字节改成非零(1) | 让程序认为「条件满足」 | Q79/Q78 |
| 改指令 | 把 JNE 改成 NOP(空操作) | 让跳转指令失效,走不到失败分支 | Q74 |
| 改比较 | 改 CMP/TEST 的比较结果 | 让比较永远相等 | Q74 的干扰项 |
i Q80 的四种解法
最后的 Q80 要给出解密后的 BitLocker 恢复密钥,题解列了四条路:① 完成 Q79 的 patch,输入账号密码直接看到;② 用 Elcomsoft Forensic Disk Decryptor(EFDD) 或 Volatility3 的 LiME 插件扫内存镜像;③ U 盘里的图片上也写着恢复密钥;④ 实在不行挨个试。「同一个答案有多个来源」是美亚杯的常见设计——做题时如果一条路走不通,先看别的检材。
6.6 图片元数据的两类考法(团体赛 Q19/Q129/Q130、个人赛 Q19/Q45/Q72)
2024 年把图片元数据考得很透,分成两小类:
| 小类 | 问什么 | 从哪读 | 具体题 |
|---|---|---|---|
| 拍摄信息 | 相机型号、GPS 坐标、拍摄地点 | EXIF(或相册数据库) | 团体 Q129/Q130(GPS 与地点)、个人 Q45(LG-H930)、个人 Q72(SAMSUNG SM-A4260) |
| 来源判断 | 这张图是拍的、截图、还是下载的 | 相册数据库的来源字段 | 团体 Q19(IMG\_0011.PNG → SpringBoard 截图)、个人 Q19(HEIC 与 5005.JPG 的关系) |
团体赛 Q19 的答案特别值得记:题解在 Photos.sqlite 的 ZCLOUDMASTER 表里看到图片来源是 SpringBoard,而「SpringBoard 是 iOS 系统的截图组件」,因此判定为手机截图。个人赛 Q72 更绕——要判断「已删除图像是用哪个手机拍的」,图片在内存镜像里,仍然要读它的 EXIF 才能得到型号。
6.7 顺带一题:日志里的加密算法(团体赛 Q65)
Q65 问「他使用了哪种算法加密密码」,答案 AES-256-GCM。题解的方法只有一句:「在日志里搜索 cipher 可以看到」。这提示了一个省力的习惯:程序日志往往会直接打印它用的加密算法名称,比逆向量级低得多——先搜日志,再考虑逆向。
6.8 这一届的易错点
- 「第一步」永远先读加密脚本 + 读文件头,确认参数布局。
- PBKDF2 的
count是「性能换安全」,别选成「只影响其中一个」。 - 「保护代码」的技术要分清混淆 ≠ 加密(有没有密钥是关键)。
- 两张同名图片大小不同,先想尾部附加,再想别的。
- 0x140 开头的地址要减去基址 0x140000000
才是偏移量。
* JNE 改成 NOP 是「让跳转失效」,不是「改成 JE」——两者效果不同。
* EXIF 读不到 GPS 时,去相册数据库找,别直接放弃。
七、2025(第十一届):从 PDF 白字到 SecretSeed 逆向
第十一届的 CTF 题 41 道(个人赛 14、团体赛 27),是五届里最重的一届。这一年的题型有两个明显特征:隐写手法更「聪明」(不再只是尾部附加,而是白字、位移推导),以及一条主线贯穿多道题(9 道题围着同一个 exe)。
7.1 PDF 里的白字:最容易漏的一种隐写(个人赛 Q69)
题目:「在 WhatsApp 某群组里,机主于 2025-04-29 08:31:02 传送了一个 PDF 文件,该 PDF 的内容是什么」,答案是 0xe36D4bCf0132B8Dc7317C2Fb9bfa1845629F6638——一个钱包地址。
题解的解法有两种,都非常朴素:
- ① 用 PDF 编辑器编辑文本
,就能看到被设成白色的文字(白底白字,肉眼看不见);
* ② 打开文档后直接 Ctrl+A 全选再复制
,选中的范围会把隐形文字一起带出来。
✓ 白字隐写为什么容易漏
因为它不改变文件结构——文件大小正常、图片正常、用 PDF 阅读器看上去一片干净。如果按「隐写 = 文件大小异常」的老思路去找,这道题会永远找不到。遇到 PDF 里「说好的信息找不到」,先 Ctrl+A 全选看一眼,成本极低。
7.2 密码藏在壁纸里(个人赛 Q81)
题目:U 盘上有个加密压缩包,「该压缩文件的解压密码是多少」,答案是 54d#e(nm。线索位置很妙:/WEPE/WALLPAPER.JPG——题解解释:「启动 WinPE 之后,该图片会被设置为系统桌面」,也就是密码就明明白白写在壁纸上。
这类题考的是「线索意识」而不是技术:压缩包解不开时,把同一目录、同一批检材的图片全部看一遍,往往密码就写在某张图上。这道题从头到尾没有爆破——密码是「看」出来的。同届 Q80 还考了这个压缩包的存在性与创建时间,作用也是先把检材摸清、为找密码铺路,而不是为跑字典做准备。
而压缩包解开之后里面是什么?题解写了:VeraCrypt、TorBrowser 和 1 个容器文件。主线立刻转到下一环——加密容器。
7.3 VeraCrypt 容器:容器题怎么答(个人赛 Q84/Q85/Q91)
这三道题围绕一个叫 xcontainer 的文件:
| 题目 | 问什么 | 答案 | 怎么知道 |
|---|---|---|---|
| Q91 | U 盘里那个加密文件用的是什么加密软件 | VeraCrypt |
识别容器的特征(或从上下文) |
| Q84 | 文件 xcontainer 的加密算法是什么 | AES(Twofish) |
用 vera_key 作为密钥文件挂载容器后,查看属性 |
| Q85 | 容器属性哪个描述正确(多选) | 只有 ii) 和 iv) | 容器大小 4980736 字节 ≠ 选项给的 4943872;文件系统为 FAT ✓; Embedded Backup Header 为 Yes(选项说没有 ✗);块大小 128 bits ✓ |
i 容器题的固定流程
① 确认它是容器(VeraCrypt/TrueCrypt/BitLocker 的头部特征);② 找密钥来源——本题是删除后又导出的 vera_key密钥文件,注意密钥文件与密码是两回事;③ 挂载(VeraCrypt 里选「使用密钥文件」);④ 看属性——算法、块大小、备份头、文件系统,答案基本都在属性页里。Q85 那种多选「描述正确的是」,逐项回属性页核对数字即可,不用推理。
7.4 二维码的三道题:从「找到」到「数清」(团体赛 Q4/Q98/Q214)
2025 年把二维码考出了层次:
- Q4
:问哪两个附件的图片里藏有指定的钱包地址,答案是 IQ_1.jpg 和 7b3e4512-1d8d-4d54-AA1c-5b004ce23A6f.jpeg——要在邮件附件里把这两张图找出来。
* Q98
:NAS 服务器里同名文件中的二维码,资讯值就是那串地址。
* Q214
:问一共有几个 jpg 里的二维码藏着这个地址,答案是 4。题解给了找法:「在仿真好后点开开始菜单,就能在 Recommended 部分看到一个命名为 IQ_1.jpg 的图片……然后再顺着路径去找其他图片」。
! 「数清」类题最危险
Q214 是选项题(1/2/3/4/5),只要漏一张就全错。题解的做法是「先找到一张 → 顺着它的路径把同类图片全捞出来」,而不是漫无目的地搜索。找到第一张之后,它的所在目录就是最可能的答案区域。
7.5 尾部隐写 + 凯撒:一条两步走的小链(团体赛 Q215)
题目问:「请列出加密文件 Manson 内藏的是什么文件」,答案是 login.xlsx。题解把过程写得很清楚:
① 搜索 manson → 找到加密文件与 manson.jpg ② manson.jpg 做隐写分析 → 识别为【尾部隐写】,取出一段文本 ③ 该文本是【凯撒加密】→ 用 CyberChef 解密 → 得到密码 Ocean\_Park ④ 用 TrueCrypt 挂载 → 需要密码 → 输入 Ocean\_Park → 看到 login.xlsx
题解还特意注明「过程同团体赛 47 题」,而 47 题正是这一届里交代「采用 Truecrypt 加密」的那一道(该题题解中未单列,本节按 Q215 的说明还原,因此不计入 88 道统计)。把 47 与 215 连起来看,就是同一条链的两端。
✓ 这条链的复用价值
尾部隐写取文本 → 凯撒解密 → 密码 → 容器挂载,这五步是 2025 年的高频骨架。同届 Q255 是它的升级版(多了一层位移推导),Q246—Q251 是它的另一个变体(换成 ZIP 与 PDF)。把这个骨架背下来,2025 的隐写题基本都能套。
7.6 最经典的一道:位移叠加(团体赛 Q255)
这一题我认为是五届里最能体现美亚杯出题思路的一道。题目要求「综合上述你发现的文件,请列出这些文件隐藏了什么信息」,答案是 book cat drum earth fire glatt heart ink joy king moon nest。
线索是三个文件:MIDI Table.txt、MIDI Table.jpg、Caesar's Cipher+3.jpg。其中第三个文件用 010Editor 打开,能在文件尾看到一串十六进制:
Can You Find It (Caesar's Cipher+3) : 64 77 77 73 65 63 82 66 80 83 75 67 63 80 82 70 68 71 80 67 69 74 63 82 82 70 67 63 80 82 71 76 73 72 77 61 73 71 76 69 75 77 77 76 76 67 81 82
接下来是这道题真正的难点——位移量不是 3,而是 -2。题解的推导:
- 图片
Caesar's Cipher+3.jpg上写着 C4=60=A,意思是「MIDI 里 60 代表 A」。 - ASCII 里 A 是 65。用 MIDI 的 60 去对应 ASCII 的 65,相当于把密文整体往小数点方向挪了 5,也就是凯撒位移 −5。
- 文件名明示的位移是 +3。两个位移叠加:+3 + (−5) = −2。
- 所以真正的位移量是 −2,而不是文件名暗示的 +3。
按 −2 位移解出来得到 BOOKCATDRUMEARTHFIREGLATTHEARTINKJOYKINGMOONNEST,再自己分词成 12 个单词。题解还诚实地吐槽了一句:「题干中则严格表明需要注意空格和区分大小写,此题描述并不严谨」——因为正常解密只能得到大写、也不一定会想到自己分词。
! 这题的三层坑
① 信息在文件尾,不在图片本身,要用十六进制编辑器往下翻;② 位移量要自己算——文件名是钓饵,真正的位移是「明示位移 + 进制差」;③ 解出来还要分词,题干里的「注意空格和区分大小写」就是提示。这三层任何一层没想到,题就做不出来。这也是为什么它值得当典型题反复练。
7.7 PDFStego 与 ZIP 爆破(团体赛 Q246—Q251)
这一组题把「容器里的容器」考到了极致。流程是:
① PDFStego-master (2).zip —— 加密压缩包 → 爆破密码 pass1234 ② 解压后得到一个 PDF —— PDFStego 检测出内藏文件 ③ 逐个试 Recovery Seed1~4.pdf → 选 Recovery Seed (4).pdf ④ 再要一个密码 → 字典攻击 → DuncanFung ⑤ 解出助记词 → apple banana cherry dog
每一步的细节都值得记:
| 题目 | 任务 | 答案 | 关键做法 |
|---|---|---|---|
| Q246 | 压缩包密码 | pass1234 |
先试六位数字爆破(失败)→ 改用字典攻击 ,用 Kali 自带的 /usr/share/wordlists/rockyou.txt |
| Q247 | 内藏文件的 PDF 的 SHA256 | 37422CE2...7BB8A6BA |
用检材里给的程序 pdfstego,按 README 用即可; 判断方法很粗暴:没有隐写会抛异常,反之不会 |
| Q249 | 该借助哪个 PDF 解密 | Recovery Seed (4).pdf |
把选项给的 PDF 逐一尝试 |
| Q250 | PDFStego 的密码 | DuncanFung |
密码来源是选项枚举——题解写「根据选项给出的密码逐一尝试即可」,不必真跑字典 |
| Q251 | 助记词内容 | apple banana cherry dog |
解密后 cat 查看 |
i PDFStego 是什么
它是一款把文件藏进 PDF 里的工具(PDF 隐写),特点是载体 PDF 仍然可以正常打开,藏进去的文件要通过它才能取出来。本题附带了源码压缩包与 README,按文档操作即可——美亚杯经常把工具直接放进检材,遇到不认识的工具先找它自带的说明文档。
7.8 九道题围着一个 exe:SecretSeed.exe 逆向(团体赛 Q256—Q264)
这是 2025 年分数最集中的一组题,也是本专题里最适合当「逆向入门范例」的一组。目标程序 SecretSeed.exe 要求输入账号密码,验证通过后解密并显示虚拟钱包的助记词。九道题正好把逆向的固定动作走了一遍:
| 题号 | 问什么 | 答案 | 方法 |
|---|---|---|---|
| Q256 | 正确账号 | manson |
搜索 username 字符串 ,在 Invalid username or password 附近找到硬编码的账号密码 |
| Q257 | 正确密码 | manson@MFI |
同上 |
| Q258 | 为什么输入对了还不解密 | 存储器中的一个旗标未被启用,导致条件跳转跳过解密 | 判断 byte_140005704 的值来决定是否执行解密代码 |
| Q259 | 解密后怎么显示明文 | 经 UTF-8 转宽字符后用 MessageBoxW 显示 |
解密后调用 MultiByteToWideChar,再传给 MessageBoxW |
| Q260 | 助记词明文 | cloud,deer,echo,fish,hawk,idea,juice,leaf,mirror,ocean,puzzle,rose |
patch 掉跳转指令 (IDA patch/调试器改值/frida hook),让程序跑到解密代码 |
| Q261 | AES 密钥字符串 | 12345678901234567890123456789012 |
32 字节,正好一串数字 |
| Q262 | 哪种条件跳转造成不解密 | JZ (条件为零时跳转) |
四个选项里只有 JZ 是条件跳转 |
| Q263 | 密文以什么形式存储 | 以 ASCII 字符串形式硬编码在 .rdata 或 .data 区段 | 反汇编查看 |
| Q264 | 内部变量的偏移量 | 0x5704 |
0x140005704 − 0x140000000 = 0x5704 |
题解在 Q260 里把两种解法讲得很清楚,值得照抄这个判断:
| 方法 | 怎么做 | 题解评价 |
|---|---|---|
| 静态分析 | 看懂解密代码逻辑,再用 CyberChef 或 Python 脚本按同样逻辑解出密文 | 「比较麻烦,一般不推荐,除非程序里只有加密部分、只能这样分析出解密逻辑」 |
| 动态分析 | 用静态 patch、hook 或调试器篡改原代码逻辑,直接运行程序自带的解密代码 | 「比较简单,我这里也是用这种方法」 |
✓ 这一组题的考点清单
搜字符串找硬编码凭据 → 定位标志位 → 识别条件跳转(JZ)→ patch 掉跳转 → 读 AES 密钥 → 确认密文存储位置 → 算地址偏移。七件事,覆盖了逆向题的绝大部分套路。特别是 Q264 那个减法:IDA 里的地址减去基址 0x140000000 才是偏移——2024 个人赛 Q78 考过一次,2025 又考一次,连考两年。
7.9 邮件编码与图片来源:2025 的两类「冷门但必考」(团体赛 Q2/Q3、Q161—Q168)
团体赛开头有一组邮件题,问的是 MIME 编码:
- Q3
:问「哪一种内容编码未被使用」,答案 binary。题解把四种编码都解释了一遍:7bit(ASCII 是 7 位编码)、8bit(UTF-8 是 8 位)、quoted-printable(标志是 ?Q?,非 ASCII 内容用十六进制表示、每字节以 = 开头)、base64(明显可见)。而 binary 「在 MIME 中都会被 base64 编码后发送,以免出现问题,binary 被严格限制」。
* Q2
:问附件结构的描述哪个正确,答案 E(以上皆不正确)。题解逐项排除:用 pdfid 看,PDF 里没有 JS 代码块;看图片 EXIF,不含地理位置;附件都在 Content-Disposition: attachment 里独立传输;没有 Content-Type: text/plain 的附件,且附件都是 base64 传输、不属于标准 ASCII 编码系统。
然后是 Q161—Q168 这一组「图片来源溯源」题,考法很细:
| 题目 | 问什么 | 答案 | 判断依据 |
|---|---|---|---|
| Q161 | 图片通过什么方法生成 | 由 iCloud 同步 | 云端文件名 C6735068-....jpg 与本地 IMG_0001.JPG 不同, 且云端创建时间早于本地 |
| Q162 | 原文件名称 | C6735068-8DB3-4C08-AB16-4B792FF2A715.jpg |
同上 |
| Q163 | 原图片如何生成 | 由苹果手机拍摄 | EXIF 里显示 iPhone 11 |
| Q164 | 哪些图片不是本机拍摄 | IMG_0097.JPG |
把相册数据库查询结果导出为 CSV,按 ZEXTATTR-CAMERA MODEL 筛选, 排除掉索尼相机与 iPhone 14 Pro MAX 的记录 |
| Q166 | 图片如何生成(另一张) | 通过 Safari 浏览器下载 | 图片来源字段 |
| Q168 | 原文件完整名称 | IMG_0097.JPG |
文件名未修改过 |
✓ 「图片来源」这种题怎么想
记住 2025 年出现的四种来源:本机拍摄(EXIF 有相机型号)、本机截图(来源为 SpringBoard)、云同步(云端文件名是 UUID、创建时间更早)、网络下载(来源为 Safari)。题解的通用做法是:把数据库查询结果导成 CSV,再按字段筛选——比一条条翻记录快得多。
7.10 这一届的易错点
- PDF 找不到信息时,先 Ctrl+A 全选——白字隐写不改变文件大小。
- 压缩包解不开,把同批图片看一遍,密码可能写在壁纸上。
- 容器题的答案基本都在属性页里,逐项核对数字,不要推理。
- 「有几个」类题目,找到第一张后顺着它的目录扩大范围。
- 位移类密码:文件名给的位移量可能是钓饵,要结合所有线索算总位移(Q255 是 +3 与 −5 叠加)。
- 先爆破六位数再上字典——别一上来就啃字典(Q246 的题解顺序就是这样)。
- 看到
0x140开头的地址,先减 0x140000000。 - 逆向优先用动态 patch(直接跑程序自带的解密代码),静态重写解密逻辑只在没办法时用。
八、工具链:每个工具负责哪一步,怎么用
CTF 题的工具不多,但每个都对应一个固定动作。这一章按「考场上先摸哪个」的顺序排,先讲题解里真正出现过的工具,再补几个同类的常用工具。
i 先说清一件事:工具的选择依据
题解里出现过的工具(CyberChef、010 Editor、OpenStego、PDFStego、pdfid、binwalk、Hashcat、Passware、openssl 等)是真题实战验证过的;像 StegSolve、ExifTool 这些,五届题解里没有点名,但属于 CTF 圈通用工具,作为备选与加速器推荐。两类我分开写,你可以按需取用。
8.1 CyberChef:题解里出现最多的那个「万能厨房」
五届题解里,CyberChef 是被点名最多的工具(出现 7 次)。它的定位是「网络版的瑞士军刀」——把各种编码、解码、加密、转换操作当成食材,拖进一个叫 Recipe(配方) 的面板里串起来,一步接一步执行。
界面就三块:左上选操作、中间拖成配方、右边看输入输出。它的杀手级功能是 Magic(智能识别):把一串来历不明的字符丢进去点 Magic,它会自动尝试常见编码并高亮可能的结果。
题解里实际用到的四种场景:
| 场景 | 配方怎么搭 | 出处 |
|---|---|---|
| 凯撒解密 | 拖入 ROT13 或 Caesar 操作,调整位移量,看输出是否成词 | 2025G-Q215(解出密码 Ocean\_Park) |
| 反转义 + JSON 美化 | 拖入 Unescape 相关操作 + JSON Beautify | 2025G-Q145 附近的标签内容处理 |
| Protobuf 解码 | 把十六进制字符串丢进去,用 Protobuf Decode 看结构 | 2025I(投票记录) |
| 基础解码 | Base64/Hex/URL 等按需串接,一步不行就再加一步 | 2024I、2025I 多处 |
✓ CyberChef 的两个使用要点
① 它是「流水线」思维——解不出来不是它不行,是配方顺序错了。比如 Base64 解完还要解压,就得再加一个 Inflate 操作,而不是重来。② 它能离线用:下载单文件 HTML 版本,断网也能跑,而美亚杯的赛场环境经常是断网的(这也是为什么官方爱给离线工具)。
题解里还有一句评价很值得记:在 Q260 那道逆向题里,「静态分析:看懂解密代码逻辑,然后用 CyberChef 或者 Python 脚本按照一样的逻辑把密文解密出来」——这说明 CyberChef 不只是「解码工具」,它还能当作手工执行加密算法的替身,在不想写脚本的时候顶上去。
8.2 010 Editor:看文件头、翻到文件尾
这是十六进制编辑器里最常用的一个(题解出现 5 次,每届的工具清单里都有它)。CTF 题里它的用途只有两个,但都不可替代:
- 看文件头
——确认文件的真实类型(第二章 2.2 节的文件签名表)。2025 团体赛 Q52 分析流量包接口时,题解就是「用 010 打开也已经验证了猜想」。
* 翻到文件尾
——找尾部附加的内容。2025 团体赛 Q255 就是「使用 010Editor 打开 Caesar's Cipher+3.jpg,可以发现文件尾藏着字符串」,那一串十六进制就是这么看到的。
✓ 一个操作技巧
找尾部附加时,不要从头发呆地往下滚——直接跳到文件末尾,或者用搜索功能找 FF D9(JPEG 结束标志),看后面还有没有内容。同样的思路对 PNG(49 45 4E 44 AE 42 60 82)、ZIP/Office(找第二个 50 4B 03 04)都适用。
8.3 openssl:命令行里的加密与哈希
这是题解里唯一一个给了完整命令行的工具(五届共出现 4 次,集中在 2023 团体赛)。它管两件事:对称加密/解密与算哈希。命令行最大的好处是——线索往往就写在检材里,你照着改一个参数就能跑起来。
最典型的一道题:检材里有个加密的 Word,得先从 PowerShell 的历史记录(PSReadLine)里翻出加密时用的那条命令,再把它反着解回来。
① 检材里的加密命令(来自 PSReadLine 历史) openssl enc -aes-256-cbc -salt -a -e -in Data.docx -out encrypted.docx # ② 解密:把 -e 改成 -d,其余照抄 openssl enc -aes-256-cbc -salt -a -d -in encrypted.docx -out decrypted.docx
四个参数的含义,以及「改错了会怎样」,值得背下来:
| 参数 | 作用 | 改错了会怎样 |
|---|---|---|
-aes-256-cbc |
指定算法:AES-256 的 CBC 模式 | 算法不匹配 → 直接报错 |
-salt |
加盐(随机扰动,抗彩虹表) | 一端加、一端不加 → 密钥派生结果不同,解不开 |
-a |
密文以 Base64 文本形式读写 | 去掉后按二进制处理,密文容易被截断 |
-e / -d |
加密 / 解密 | 解密就是把 -e 改成 -d ,这类题最省力的一步 |
它还有第二个高频用途:算哈希——openssl dgst -md5 文件、openssl dgst -sha256 文件。题目问「这个哈希是哪种算法」时,最快的判断依据是长度(MD5 32 位、SHA-1 40 位、SHA-256 64 位、SHA-512 128 位,见 5.5 节那张表)。
✓ 它和 CyberChef 怎么分工
两者解决的是同一类问题,区别在「文件要不要挪地方」:CyberChef 是网页/本地 HTML,适合把一串文本黏进去反复试;openssl 是本地命令行,直接对检材文件原地操作,更适合「加密文档、要算哈希的原始文件」这种不能随便挪动的检材。一句话:试编码用 CyberChef,动文件用 openssl。
8.4 隐写专用工具:OpenStego 与 PDFStego
| 工具 | 藏什么 | 基本用法 | 出处 |
|---|---|---|---|
| OpenStego | 文件或文本藏进图片(推荐 BMP/PNG) | 三步:选 Hide/Extract → 选载体图片 → 填密码。 命令行或图形界面都行 | 2023G-Q90/Q91(key.bmp 藏了一段文字,取出 P@ssw0rd) |
| PDFStego | 文件藏进 PDF,载体 PDF 仍可正常打开 | 按源码包里的 README 操作即可;没有隐写时程序会抛异常,可当作检测手段 | 2025G-Q247/Q249/Q250(助记词藏在 Recovery Seed 系列 PDF 里) |
注意两个使用细节:① 载体格式选 BMP/PNG——JPEG 有损压缩会破坏低位数据;② 密码与载体是一一对应的,换一张图或换一个密码都可能取不出来。2025 那道 PDFStego 题还有个取巧点:题解里「根据选项给出的 pdf 文件逐一尝试即可」——选项本身就只有四个,逐个试比推理快。
8.5 密码从哪来:先找线索,最后才爆破
遇到加密文件,很多人的第一反应是「上爆破」。但把五届真题点一遍会发现:真正靠爆破跑出来的只有少数几道,绝大多数题的密码,要么题干直接给了,要么能从别的检材、别的题目里挖出来。把密码的来源按优先级排一下,考场上的动作顺序就清楚了:
| 优先级 | 密码从哪来 | 真题实证 | 耗时 |
|---|---|---|---|
| ① 题干直接给出 | 题面或案件描述里就写着密码,扫一眼就有 | 2024G「John 的手机」——题解原话是「参考 John\_Smartphone\_itunebackup.zip,备份密码是 1234」,属于白送 | 几秒 |
| ② 其他检材/上一题解出 | 密码藏在另一份检材里,或者就是上一题的答案 | 2022I-Q21 的加密 order.xlsx:密码写在检材的便签上;2024G-Q67 从 满汉全席Secret.jpg 尾部取出一个 Word → 里面是 BitLocker 恢复密钥和一行密码,Q68 题解原话「用上题中 word 文档中的密码成功解密」(IamRich123!) |
1—2 分钟 |
| ③ 解码/查表得到 | 拿到的是哈希或密文,查表、解码就得到明文 | 2023G-Q88:ADS 里藏的内容是一个 MD5,在线查表得到 newpassword2;题解还专门补了一句「离线环境下,大部分的弱口令字典应该也都爆不出来吧」 |
十几秒 |
| ④ 选项枚举 | 选项本身就是几个候选密码,逐个试比推理快 | 2025G-Q250:题解写「根据选项给出的密码逐一尝试即可」 | 几十秒 |
| ⑤ 最后才是爆破 | 前面几条路都走不通,才动用字典与算力 | 2023G-Q85(iTunes 备份密码)、2025G-Q246(加密 ZIP)——五届里明确写了「跑字典/爆破」的,主要就是这两道 | 几分钟到跑不出来 |
✓ 为什么「先找线索」比「先爆破」划算
线索类题(①②③④)基本是几十秒到两分钟出答案,而且答案确定;爆破类题(⑤)耗时几分钟,还得赌字典里恰好有。2025G-Q246 的题解顺序就是「先进行六位数的简单爆破,发现爆破不出来,后面将思路转变为字典攻击」;2025I 那道虚拟货币压缩包更是字典跑不动,最后是把检材里出现过的密码、生日、钱包地址攒成自己的字典才跑通——密码的来源仍然是检材。反过来一上手就啃 rockyou,时间就没了。
如果确认只能爆破(对象是一份 iTunes 备份或一个加密压缩包,线索里确实没有密码),那也别以为只有 Hashcat 一把工具。爆破工具至少有两把,按「命令行」和「图形化」分成两条路线,选顺手的用:
| 路线 | 工具 | 怎么做 | 典型对象 |
|---|---|---|---|
| 命令行 | Hashcat + 格式转换脚本 | 先从 Manifest.plist 提取哈希(itunes_backup2hashcat)、转成 Hashcat 认识的格式,再选字典或掩码跑;注意选对模式编号(不同哈希格式对应不同 -m 值),跑之前先用 --show 确认格式被正确识别 |
iTunes 备份、各类哈希、加密压缩包 |
| 图形化 | Passware Kit | 把文件直接导入(Manifest.plist、加密的 Office 文档、BitLocker/TrueCrypt/VeraCrypt 容器),选字典或掩码就开跑,不用先转格式 |
iOS 备份、加密文档、加密容器 |
i Passware Kit 在题解里的位置
2025 个人赛的题解在讲 iOS 备份密码时,原话是「大多数检材的密码为 0000 或 1234,可以通过 Passware 或 HashCat 等密码爆破工具结合弱口令字典或 4 位数字掩码进行爆破」——它与 Hashcat 是并列关系,不是替代关系。工具本身的能力覆盖 iOS 备份、加密文档、加密压缩包与加密容器,正好对应美亚杯密码题的几大类型。但要记住:它能省掉的是「转格式」这一步,省不掉「先找线索」。
- 掩码比字典更快
——2025I 的 iOS 备份密码大多是 0000/1234 这类 4 位数字,用 4 位数字掩码几秒钟就跑完,比上大字典划算。
* 字典也可以自己攒
——2025I 那道虚拟货币压缩包字典跑不动,最后是把检材里出现过的密码、生日、钱包地址攒成自己的字典才跑通。绕了一圈,密码的来源仍然是检材。
✓ 字典顺序就是考场策略
先把六位数字跑一遍(几十秒),再上 rockyou(几分钟)。如果题目是「弱口令」型,第一轮就出来了;如果是「生日」型,中间那轮会命中。反过来先啃 rockyou,时间就浪费了。
还有两种「看着像爆破、其实不是」的情况,务必分清:
- 试默认值
——2025I 的 iOS 备份密码试的是出厂默认值,几秒钟就完事,靠的是「知道该先试默认值」这个经验,不是算力;
* 密钥硬编码在程序里
——2025G-Q261 那个 32 字节 AES 密钥,题解就是在程序里直接读出来的(12345678901234567890123456789012),搜字符串比爆破快得多。
8.6 其它够用就好的工具
下面这些是「用得上、但不必单开一节」的工具。其中 binwalk、pdfid、Python、EFDD/Volatility3 在五届题解里出现过;ExifTool、StegSolve、Audacity、Foremost 属于圈内通用工具,题解里没有点名,作为同类替代列出,结论仍以原始工具为准。
| 工具 | 用途 | 在哪一题能帮上忙 |
|---|---|---|
| ExifTool | 命令行批量读 EXIF(型号、GPS、时间、方向) | 2024G-Q129/Q130、2025I-Q63—Q66 |
| StegSolve | 分通道、分位平面查看图片,看 LSB 隐写 | 2023G-Q91 这类图片隐写题 |
| binwalk / Foremost | 自动扫描并提取文件中嵌套的内容 | 2024G-Q67 的尾部附加 |
| pdfid | 快速看 PDF 里有没有 JS、是否加密 | 2025G-Q2(题解就是用 pdfid 排除 JS) |
| Audacity | 看音频频谱、做倒放 | 2022G-Q1 这类音频隐写 |
| Python | 写解密脚本、批量处理 | 2024G-Q42—Q48(照加密脚本重写解密脚本) |
| EFDD / Volatility3 | 从内存镜像里提取 BitLocker 恢复密钥 | 2024I-Q80(题解列的备选路径) |
九、五年重复考点:哪些必须练到条件反射
把 88 道题按「考的是什么动作」归并,重复度很高。下面这张表是逐题点出来的(标了届次与题号,可回原文核对)。
9.1 跨届复现:这七件事,五届都在变着法考
| 考点 | 出现届数 | 五届怎么「变脸」的 | 代表题号 |
|---|---|---|---|
| 图片元数据与来源判断 | 5/5 | 2021 问原图与缩略图关系 → 2022 问元数据是否被篡改 → 2023 查相册数据库字段 → 2024 问相机型号与 GPS → 2025 问「这张图是拍的/截图/下载/云同步」 | 2021I-Q36;2022I-Q23;2023I-Q59;2024G-Q19/Q129;2025I-Q30/Q63/Q64;2025G-Q161—Q164 |
| 加密文档与加密容器 | 4/5 | 2022 考 Office 文档加密与 RSA 密钥文件 → 2023 考 openssl 解密 Word、加密 dmg → 2024 考自研脚本(PBKDF2+AES)、BitLocker To Go → 2025 考 TrueCrypt/VeraCrypt 容器 | 2022I-Q21;2022G-Q17;2023G-Q56/Q92;2024G-Q42—Q48/Q68;2025I-Q84/Q91;2025G-Q47 |
| 编码与解码链 | 3/5 | 2021 是 PHP 的 gzinflate(base64_decode()) → 2023 是 shell 历史里的 base64 编码链(还带陷阱)→ 2025 是邮件 MIME 编码 |
2021G-Q25/Q27/Q28;2023G-Q55/Q88;2025G-Q2/Q3 |
| 表情包式隐写(图片藏信息) | 3/5 | 2021/2023/2025 都有二维码;2023 升级为 OpenStego 的 LSB 隐写;2024 是尾部附加 Office 文档;2025 变成 PDF 白字与尾部隐写 + 位移推导 | 2021G-Q29;2023G-Q83/Q90/Q91;2024G-Q67;2025I-Q69/Q81;2025G-Q214/Q215/Q255 |
| 密码从哪里来 | 4/5 | 2022 的 Office 密码写在检材的便签上 → 2023 一半靠查表与图片线索、只有 iTunes 备份是真的爆破 → 2024 用上一题解出的密码解 BitLocker,另一处备份密码题干直接给 → 2025 两道:一道选项枚举、一道真字典攻击 | 2022I-Q21;2023G-Q79/Q85/Q88;2024G-Q67→Q68;2025G-Q246/Q250 |
| 古典密码 | 2/5 | 2023 考 Playfair(给了密文与方阵);2025 把凯撒考了两遍,其中一次还叠加了位移换算 | 2023G-Q89;2025G-Q215/Q255 |
| 逆向绕过与解密 | 2/5(但分值最重) | 2024 是 exe 里改标志位/patch 跳转 → 2025 是「搜字符串找凭据 + 识别 JZ + patch + 解 AES」,九道题围着同一个程序 | 2024I-Q74/Q78/Q79;2025G-Q256—Q264 |
9.2 三处「几乎照搬」的复现
有三组题,考法几乎一模一样,只是换了检材。练一组等于练三组:
| 复现关系 | 问法 | 答案路径 |
|---|---|---|
| 地址偏移换算 2024I-Q78 ↔ 2025G-Q264 | 都问「决定某个行为的字节,其相对基址的偏移量是多少」 | 都是 0x140 开头地址减基址 0x140000000:前者 0x808C、后者 0x5704 |
| 同一个 exe 的两种问法 2024I-Q74 ↔ 2024I-Q79 | 一个问「怎么改汇编绕过检查」,一个问「拿到偏移后怎么利用」 | 前者改指令(JNE→NOP),后者改数据(标志位改成 1);两条路都能通 |
| 尾部隐写取密码 2024G-Q67 ↔ 2025G-Q215/Q255 | 都是「图片里藏了东西,取出来当密码用」 | 2024 是从 jpg 尾部取出一个 Office 文档(内含恢复密钥与密码);2025 是从 jpg 尾部取出文本、再凯撒解密得到密码 |
9.3 只盯前面五条,就覆盖了大半的分
前五条(图片元数据、加密文档与容器、编码链、图片隐写、密码从哪里来)跨了 2021—2025 每一届,题量占到 88 道里的绝大多数。把这五件事练到不需要思考,CTF 题的基本盘就稳了;剩下两条(古典密码、逆向)是拉分项,2024 之后分量明显上升。
i 这五条里,只有一条沾「算力」
前五条中的密码那条,五届里明确写了跑字典的只有 2023G-Q85 与 2025G-Q246 两道;其余全部靠读题、翻检材、查表、看选项解决。所以别把「密码题」和「爆破」划等号——它考的是你能不能在检材里把密码找出来,而不是你的显卡有多快。
十、易错点总清单:这些坑五届里反复出现
这一章可以直接当检查表用。交卷前过一遍,能挡掉大部分「明明会做却做错」。
| # | 易错点 | 为什么错 | 涉及题号 |
|---|---|---|---|
| 1 | 只看扩展名就下结论 | 扩展名可以随手改,文件头才作数 | 2022I-Q29(PDF 后缀其实是老 Office) |
| 2 | EXIF 里没有 GPS 就放弃 | iOS 会把副本写进相册数据库的 ZEXTATTR 表 |
2025I-Q64 |
| 3 | 把同一张图的 HEIC 与 JPG 当成同一个文件 | 格式不同、哈希必然不同 | 2021I-Q36、2024I-Q19 |
| 4 | shell 历史里的 base64 编码,分不清编的是文件名还是内容 | echo f.rtf | base64 编的是文件名;要加 textutil 才是内容 |
2023G-Q55 |
| 5 | PDF 里找不到信息就判定「没有」 | 白字隐写不改变文件大小 ,Ctrl+A 全选就能看见 | 2025I-Q69 |
| 6 | 「保护代码」的技术误选成加密 | 混淆后的代码不需要密钥就能执行,所以不是加密 | 2024G-Q52 |
| 7 | 改汇编时把 JNE 改成 JE | 应改成 NOP(让跳转失效),不是改成反向跳转 | 2024I-Q74 |
| 8 | 地址当偏移量直接用 | 0x140 开头要先减基址 0x140000000 |
2024I-Q78、2025G-Q264 |
| 9 | 凯撒解密只看文件名给的位移 | Q255 里 +3 是钓饵,真正的位移是「+3 与 −5 叠加」= −2 |
2025G-Q255 |
| 10 | 解出大写字母串就交卷 | 题干要求注意空格与大小写,还要自己分词 | 2025G-Q255 |
| 11 | 信息藏在文件尾却没往下翻 | 要跳到文件末尾或用 FF D9 定位后继续看 |
2024G-Q67、2025G-Q255 |
| 12 | 密码题一上来就爆破 | 先走①题干 → ②其他检材/上一题(便签、备忘录、文档属性)→ ③查表解码 → ④选项枚举,四条都不通才动字典 | 2022I-Q21(密码写在便签上)、2024G-Q68(密码来自上一题)、2023G-Q88(查表更快)、2025G-Q246(真需爆破) |
| 13 | 只会用一把爆破工具 | 命令行路线要先提取哈希、转成 Hashcat 格式再跑;图形化的 Passware Kit 可直接导入 Manifest.plist、加密文档与容器 |
2023G-Q85(iTunes 备份密码) |
| 14 | 容器题不看属性页 | 算法、块大小、备份头、文件系统都在属性里,逐项核对即可 | 2025I-Q85 |
| 15 | 混淆「密钥文件」与「密码」 | VeraCrypt 可以只用密钥文件挂载,不必输密码 | 2025I-Q84 |
| 16 | 「有几个」类题只找到一张就填 | 找到第一张后顺着它的目录扩大范围 | 2025G-Q214 |
| 17 | 隐写载体选了 JPEG | JPEG 有损压缩会破坏低位数据,选 BMP/PNG | 2023G-Q91(载体是 key.bmp) |
| 18 | 二维码在缩略图上扫不出来就以为没有 | 要导出原图再扫 | 2021G-Q29 |
| 19 | 只看检材信息字段的「大小」,不看单位 | 容器大小、分区容量这类数字,一个字节都不能差 | 2025I-Q85(4980736 ≠ 4943872) |
| 20 | 题目说「以上皆不正确」就以为是凑数 | 这类选项是真的会选,要逐项验证后才能排除 | 2025G-Q2(答案就是 E) |
! 最贵的一类错
截图会考、命令会背、工具会用,最后因为「没看清选项」丢分——比如「以上皆不正确」、比如「大小 4980736 而不是 4943872」。这类错不涉及任何技术,纯粹是核对习惯。交卷前把带数字的选项逐个回原文对一遍。
十一、要掌握哪些技能,才算真的「会做 CTF 题」
把上面的内容倒推成能力清单。可以当自测表用——每一项都问自己「我能不能不看笔记做出来」。
11.1 四级能力清单
| 等级 | 能力 | 自测标准 |
|---|---|---|
| L1 认得出 | 看到一串字符能判断它是编码、加密还是哈希;看到文件头能说出是什么文件;知道 EXIF 里有哪些字段、二维码能藏什么 | 给一张照片,能说出它的相机型号、有没有 GPS、是拍的还是截图 |
| L2 找得到 | 知道信息可能藏在哪:图片(EXIF/二维码/尾部/LSB)、PDF(白字/内嵌文件)、压缩包(密码在别的检材里)、文件系统(ADS)、音频(倒放/频谱)、程序(硬编码字符串) | 给一份检材,能在 15 分钟内定位到一个可疑的隐写点或加密点 |
| L3 解得出 | 会用 CyberChef 搭配方解编码链;会用 010 Editor 看头尾;会按脚本重写解密逻辑;会用 OpenStego/PDFStego 取数据;知道密码有五个来源,只在都不通时才动爆破;Hashcat(命令行)与 Passware Kit(图形化)两条路线都会用 | 给一个加密脚本和一个密文,能算出 key 并把明文解出来;给一个加密压缩包,先去检材里找密码,而不是一上来就跑字典 |
| L4 追得动 | 能把多个线索串成一条链(隐写取密码 → 解密文档 → 挂载容器 → 读答案);能 patch 跳转绕过程序验证;能读懂加密算法参数并判断出题意图 | 给一组多环节的检材,能独立走完全链并解释每一步为什么这么做 |
按 2026 的备考时间算:L1 + L2 是保底(隐写与元数据题必须拿到),L3 是提分项(密码学与编码题),L4 决定你能不能在 2025 那种 41 道 CTF 题的年份里拉开差距。
11.2 备考路线(按周推进)
| 阶段 | 目标 | 练什么 |
|---|---|---|
| 第 1 周:概念关 | 第二章的六组概念能用自己的话讲清 | 把第二章过两遍;自己做一张「文件头对照表」和「哈希长度表」背下来 |
| 第 2 周:编码关 | CyberChef 用得像搜索框一样熟 | 拿 2021G-Q25/Q27/Q28、2023G-Q55/Q88、2025G-Q2/Q3 当练习册,每道都用 CyberChef 复现一遍 |
| 第 3 周:隐写关 | 图片/PDF/音频的隐写手法都能上手 | 复盘 2023G-Q90/Q91、2024G-Q67、2025I-Q69/Q81、2025G-Q214/Q215/Q255;每种手法自己造一个样本再取出来 |
| 第 4 周:密码与容器关 | 加密脚本能读懂、容器能挂载、密码知道从哪找 | 复盘 2024G-Q42—Q48(照脚本重写解密)、2024G-Q67→Q68(密码来自上一题)、2022I-Q21(密码写在便签上)、2023G-Q85(命令行与 Passware Kit 两条路线各跑一遍)、2025I-Q84/Q91(VeraCrypt)、2025G-Q246—Q251(密码来源排查 + PDFStego) |
| 第 5 周:逆向关 | 能找到标志位并 patch | 复盘 2024I-Q74—Q80、2025G-Q256—Q264;练「搜字符串 → 找条件跳转 → 改值/改指令 → 看结果」 |
| 考前一周:手感 | 别学新东西,保持手感 | 把第十章易错点清单当检查表,每套题交卷前过一遍 |
11.3 一句话总结这个专题的命题逻辑
五届走下来,CTF 题的命题逻辑其实非常稳定:它不考你有没有某个工具,而考你能不能用检材里的痕迹,把一个被藏起来的信息一层层剥出来。
藏的部分:二维码、EXIF、尾部附加、白字、LSB、通道——载体是看得见的,信息是看不见的,靠观察和工具就能找到。
锁的部分:编码、凯撒、AES、RSA、容器、压缩包——规则是公开的,钥匙藏在别处,靠读懂脚本、串起线索才能打开。
而把「藏」和「锁」串起来,就是 2024、2025 那几道大题的真正难度所在。
结语:把 88 道题当练习册用
这篇文章把 2021—2025 五届、共 88 道 CTF 相关题目做了一次完整梳理:先讲概念(第二章),再按届拆题(第三—七章),然后盘点工具(第八章),最后汇总重复考点、易错点与能力清单(第九—十一章)。
如果只记三句话,我希望是这三句:
- 先看文件头,再看扩展名
——这一条能挡掉大量「看错文件类型」的错。
* 信息可能在文件尾,而不是文件里
——尾部附加、白字隐写都不改变文件结构,「文件看起来正常」不等于「没有藏东西」。
* 读懂脚本比会点工具更重要
——2024 之后的题,考的都是「你能不能把逻辑看穿」,工具只是最后那一下。
i 资源与口径说明
本文题目统计与解题思路整理自西电 XD Forensics Wiki 公开发布的 2021—2025 五届「美亚杯」个人赛/团体赛题解与选手复盘(共 10 篇);工具说明参考各工具官方文档与公开介绍。凡题解本身标注「存疑」或答案与选项不符的题目,文中均已如实注明(如 2023G-Q83、2025G-Q255)。
统计口径:考点落在隐写/编码/密码学/逆向解密上的题,共 88 道;仅问哈希值、时间戳、分区容量、网络协议字段的题不计入。2025 团体赛第 47 题(TrueCrypt)因题解未单列,不计入统计,已在 7.5 节说明。
敬请各位大佬关注:小谢取证
扫取二维码获取
更多精彩
小谢取证
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。








评论