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 道,正文第七节会单独说明。
每一题都标了届次与题号,可以直接回题解原文核对。
Q36 | Q25/Q27/Q28/Q29/Q43 | 6 | ||
Q21/Q23/Q29 | Q1/Q17/Q18 | 6 | ||
Q59 | Q55/Q56/Q78—Q79/Q83/Q85/Q88—Q92 | 12 | ||
Q19/Q45/Q72/Q74/Q76—Q80 | Q19/Q42—Q48/Q52/Q65/Q67—Q68/Q129—Q130 | 23 | ||
Q30/Q35—Q36/Q40/Q63—Q66/Q69/Q80—Q81/Q84—Q85/Q91 | Q2—Q4/Q98/Q161—Q164/Q166/Q168/Q214—Q215/Q246—Q251/Q255—Q264 | 41 |
✓ 读表先记一个结论
CTF 题在五届里的曲线是 6 → 6 → 12 → 23 → 41,一路往上,而且 2024、2025 两届占比明显抬升。早期的 CTF 题是「送分小点」(扫个二维码、认个哈希长度),2024 之后变成「一整个检材主线」——2025 年甚至用 9 道题围着一个 SecretSeed.exe,从找账号密码一路做到逆向解开助记词。
再看三类题的分布,能看出美亚杯的口味:图片与文件隐写 42 道(最多,且几乎每届都考)、密码学与编码 33 道(古典到现代都考)、逆向解密 13 道(集中在最近两届)。
换句话说:隐写是基本盘,密码学是提分项,逆向是 2024 年之后新增的大分模块。如果你只准备一个方向,优先把隐写和编码练熟——它占了近一半。
二、先补齐概念:用最土的话讲一遍
这一章不涉及任何检材,全是概念。CTF 题最气人的地方在于:你不是不会操作工具,而是看到一串字符不知道它是什么。先把下面六组概念过一遍,再去看题目,会顺很多。
2.1 四个最容易混的词:隐写、编码、加密、哈希
Steganography | |||
Encoding | |||
Encryption | |||
Hash | 单向 |
! 这组区分为什么重要
2024 团体赛 Q52 就是拿这四个词做文章:题目问「Ben 用什么技术保护他的 webshell 脚本」,标准答案是 代码混淆,而不是很多人以为的「加密」或「隐写术」。如果你分不清这三个词的区别,这道题就会凭感觉选错。
2.2 文件也有「身份证」:文件头与魔数
每个文件的开头几个字节是固定的,叫文件头(File Signature / Magic Number)。系统靠它判断文件到底是什么,而不是靠扩展名。改扩展名是最廉价、也最常用的伪装手段。
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 | |||
凯撒密码在 2025 年考了两次,而且都不是「傻解」:Q215 是先用隐写取出文本、再用 CyberChef 做凯撒解密;Q255 更绕——题干给了一条「+3」的线索,但另外还隐含了一个「-5」(因为 MIDI 里 60 代表 A,而 ASCII 里 A 是 65,两者差 5),两个位移叠加才是真正的位移。这就是美亚杯的典型手法:它不考你会不会用工具,考你能不能把多个线索串成一条。
2.6 现代密码:三件套 + 两个参数
现代加密的题,考来考去是三件套和两个参数:
| 公钥加密、私钥解密 | ||
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。
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 关键字的两组文件,然后依次加密解密找到匹配的一组」——也就是把公钥加密、私钥解密真的跑一遍,配对成功的才是一对。不要靠文件名猜,要跑一遍验证。
-----BEGIN ... KEY----- 开头结尾 | ||
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 这一步:
f.rtf——不是文件内容 | ||
a.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),要先合并再删掉填充字符。
5.5 哈希识别与 iTunes 密码爆破(团体赛 Q79/Q85)
Q79 问 true-ubuntupassword.txt 里的哈希是哪一种,答案是 MD5——题解的理由只有一句:「长度 32 位(MD5)」。所以哈希长度表是必须记住的:
| 32 | |
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 认识的格式,再跑字典或掩码 | |
| 图形化 | 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) # 最后才是密文
所以这个加密文件的布局是三段拼接:
| IV | 64f4e21c1e4cc3a60137da79e75bf973 | ||
| SALT | 5d5ca840accf...2efd05cc436c4a5424 | ||
✓ 「第一步是什么」这类题的通解
给一个加密文件问你「第一步」,答案几乎总是「读文件头,确认参数放在哪、各占多少字节」。因为解密需要三样东西:算法、钥匙、参数(IV/SALT)。算法和参数结构都写在加密脚本里,所以先读脚本,再读文件头,顺序不能反。
6.2 三个参数分别在干什么(团体赛 Q45/Q46)
Q45 问:「如果更改 PBKDF2 的 count 参数会产生什么影响」,答案是「同时影响所需的计算性能和安全性」。题解的注解很到位:「相同算法情况下,牺牲性能提高安全性」。
| 越大越安全,但越慢 |
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,使跳转指令失效」。也就是把「不相等就跳走」的那条指令直接抹掉,程序无路可跳,只能顺着走成功分支。
i Q80 的四种解法
最后的 Q80 要给出解密后的 BitLocker 恢复密钥,题解列了四条路:① 完成 Q79 的 patch,输入账号密码直接看到;② 用 Elcomsoft Forensic Disk Decryptor(EFDD) 或 Volatility3 的 LiME 插件扫内存镜像;③ U 盘里的图片上也写着恢复密钥;④ 实在不行挨个试。「同一个答案有多个来源」是美亚杯的常见设计——做题时如果一条路走不通,先看别的检材。
6.6 图片元数据的两类考法(团体赛 Q19/Q129/Q130、个人赛 Q19/Q45/Q72)
2024 年把图片元数据考得很透,分成两小类:
| 拍摄信息 | |||
| 来源判断 |
团体赛 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 的文件:
VeraCrypt | |||
AES(Twofish) | vera_key 作为密钥文件挂载容器后,查看属性 | ||
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
每一步的细节都值得记:
pass1234 | 先试六位数字爆破(失败)→ 改用字典攻击/usr/share/wordlists/rockyou.txt | ||
37422CE2...7BB8A6BA | pdfstego,按 README 用即可;判断方法很粗暴:没有隐写会抛异常,反之不会 | ||
Recovery Seed (4).pdf | |||
DuncanFung | |||
apple banana cherry dog | cat 查看 |
i PDFStego 是什么
它是一款把文件藏进 PDF 里的工具(PDF 隐写),特点是载体 PDF 仍然可以正常打开,藏进去的文件要通过它才能取出来。本题附带了源码压缩包与 README,按文档操作即可——美亚杯经常把工具直接放进检材,遇到不认识的工具先找它自带的说明文档。
7.8 九道题围着一个 exe:SecretSeed.exe 逆向(团体赛 Q256—Q264)
这是 2025 年分数最集中的一组题,也是本专题里最适合当「逆向入门范例」的一组。目标程序 SecretSeed.exe 要求输入账号密码,验证通过后解密并显示虚拟钱包的助记词。九道题正好把逆向的固定动作走了一遍:
manson | 搜索 username 字符串Invalid username or password 附近找到硬编码的账号密码 | ||
manson@MFI | |||
byte_140005704 的值来决定是否执行解密代码 | |||
MessageBoxW 显示 | MultiByteToWideChar,再传给 MessageBoxW | ||
cloud,deer,echo,fish,hawk,idea,juice,leaf,mirror,ocean,puzzle,rose | patch 掉跳转指令 | ||
12345678901234567890123456789012 | |||
JZ | |||
0x5704 | 0x140005704 − 0x140000000 = 0x5704 |
题解在 Q260 里把两种解法讲得很清楚,值得照抄这个判断:
✓ 这一组题的考点清单
搜字符串找硬编码凭据 → 定位标志位 → 识别条件跳转(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 这一组「图片来源溯源」题,考法很细:
C6735068-....jpg 与本地 IMG_0001.JPG 不同,且云端创建时间早于本地 | |||
C6735068-8DB3-4C08-AB16-4B792FF2A715.jpg | |||
IMG_0097.JPG | ZEXTATTR-CAMERA MODEL 筛选,排除掉索尼相机与 iPhone 14 Pro MAX 的记录 | ||
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,它会自动尝试常见编码并高亮可能的结果。
题解里实际用到的四种场景:
| 凯撒解密 | ||
| 反转义 + JSON 美化 | ||
| Protobuf 解码 | ||
| 基础解码 |
✓ 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 | ||
-salt | ||
-a | ||
-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 | 命令行或图形界面都行 | P@ssw0rd) | |
| PDFStego |
注意两个使用细节:① 载体格式选 BMP/PNG——JPEG 有损压缩会破坏低位数据;② 密码与载体是一一对应的,换一张图或换一个密码都可能取不出来。2025 那道 PDFStego 题还有个取巧点:题解里「根据选项给出的 pdf 文件逐一尝试即可」——选项本身就只有四个,逐个试比推理快。
8.5 密码从哪来:先找线索,最后才爆破
遇到加密文件,很多人的第一反应是「上爆破」。但把五届真题点一遍会发现:真正靠爆破跑出来的只有少数几道,绝大多数题的密码,要么题干直接给了,要么能从别的检材、别的题目里挖出来。把密码的来源按优先级排一下,考场上的动作顺序就清楚了:
| ① 题干直接给出 | |||
| ② 其他检材/上一题解出 | order.xlsx:密码写在检材的便签上;2024G-Q67 从 满汉全席Secret.jpg 尾部取出一个 Word → 里面是 BitLocker 恢复密钥和一行密码,Q68 题解原话「用上题中 word 文档中的密码成功解密」(IamRich123!) | ||
| ③ 解码/查表得到 | newpassword2;题解还专门补了一句「离线环境下,大部分的弱口令字典应该也都爆不出来吧」 | ||
| ④ 选项枚举 | |||
| ⑤ 最后才是爆破 |
✓ 为什么「先找线索」比「先爆破」划算
线索类题(①②③④)基本是几十秒到两分钟出答案,而且答案确定;爆破类题(⑤)耗时几分钟,还得赌字典里恰好有。2025G-Q246 的题解顺序就是「先进行六位数的简单爆破,发现爆破不出来,后面将思路转变为字典攻击」;2025I 那道虚拟货币压缩包更是字典跑不动,最后是把检材里出现过的密码、生日、钱包地址攒成自己的字典才跑通——密码的来源仍然是检材。反过来一上手就啃 rockyou,时间就没了。
如果确认只能爆破(对象是一份 iTunes 备份或一个加密压缩包,线索里确实没有密码),那也别以为只有 Hashcat 一把工具。爆破工具至少有两把,按「命令行」和「图形化」分成两条路线,选顺手的用:
| 命令行 | Manifest.plist 提取哈希(itunes_backup2hashcat)、转成 Hashcat 认识的格式,再选字典或掩码跑;注意选对模式编号(不同哈希格式对应不同 -m 值),跑之前先用 --show 确认格式被正确识别 | ||
| 图形化 | Passware Kit | Manifest.plist、加密的 Office 文档、BitLocker/TrueCrypt/VeraCrypt 容器),选字典或掩码就开跑,不用先转格式 |
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 | ||
| StegSolve | ||
| binwalk / Foremost | ||
| pdfid | ||
| Audacity | ||
| Python | ||
| EFDD / Volatility3 |
九、五年重复考点:哪些必须练到条件反射
把 88 道题按「考的是什么动作」归并,重复度很高。下面这张表是逐题点出来的(标了届次与题号,可回原文核对)。
9.1 跨届复现:这七件事,五届都在变着法考
| 图片元数据与来源判断 | 5/5 | ||
| 加密文档与加密容器 | 4/5 | ||
| 编码与解码链 | gzinflate(base64_decode()) → 2023 是 shell 历史里的 base64 编码链(还带陷阱)→ 2025 是邮件 MIME 编码 | ||
| 表情包式隐写(图片藏信息) | |||
| 密码从哪里来 | 4/5 | ||
| 古典密码 | |||
| 逆向绕过与解密 |
9.2 三处「几乎照搬」的复现
有三组题,考法几乎一模一样,只是换了检材。练一组等于练三组:
| 地址偏移换算 | 0x140 开头地址减基址 0x140000000:前者 0x808C、后者 0x5704 | |
| 同一个 exe 的两种问法 | ||
| 尾部隐写取密码 |
9.3 只盯前面五条,就覆盖了大半的分
前五条(图片元数据、加密文档与容器、编码链、图片隐写、密码从哪里来)跨了 2021—2025 每一届,题量占到 88 道里的绝大多数。把这五件事练到不需要思考,CTF 题的基本盘就稳了;剩下两条(古典密码、逆向)是拉分项,2024 之后分量明显上升。
i 这五条里,只有一条沾「算力」
前五条中的密码那条,五届里明确写了跑字典的只有 2023G-Q85 与 2025G-Q246 两道;其余全部靠读题、翻检材、查表、看选项解决。所以别把「密码题」和「爆破」划等号——它考的是你能不能在检材里把密码找出来,而不是你的显卡有多快。
十、易错点总清单:这些坑五届里反复出现
这一章可以直接当检查表用。交卷前过一遍,能挡掉大部分「明明会做却做错」。
ZEXTATTR 表 | |||
echo f.rtf | base64textutil 才是内容 | |||
| 白字隐写不改变文件大小 | |||
0x1400x140000000 | |||
+3 是钓饵,真正的位移是「+3 与 −5 叠加」= −2 | |||
FF D9 定位后继续看 | |||
Manifest.plist、加密文档与容器 | |||
! 最贵的一类错
截图会考、命令会背、工具会用,最后因为「没看清选项」丢分——比如「以上皆不正确」、比如「大小 4980736 而不是 4943872」。这类错不涉及任何技术,纯粹是核对习惯。交卷前把带数字的选项逐个回原文对一遍。
十一、要掌握哪些技能,才算真的「会做 CTF 题」
把上面的内容倒推成能力清单。可以当自测表用——每一项都问自己「我能不能不看笔记做出来」。
11.1 四级能力清单
| L1 认得出 | ||
| L2 找得到 | ||
| L3 解得出 | ||
| L4 追得动 |
按 2026 的备考时间算:L1 + L2 是保底(隐写与元数据题必须拿到),L3 是提分项(密码学与编码题),L4 决定你能不能在 2025 那种 41 道 CTF 题的年份里拉开差距。
11.2 备考路线(按周推进)
| 第 1 周:概念关 | ||
| 第 2 周:编码关 | ||
| 第 3 周:隐写关 | ||
| 第 4 周:密码与容器关 | ||
| 第 5 周:逆向关 | ||
| 考前一周:手感 |
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 节说明。


敬请各位大佬关注:小谢取证


扫取二维码获取
更多精彩
小谢取证
