misc复现与知识点总结
弥生
弥生
三社院信息Sec
2026年11月12日 14:20
河南
去阅读
| 题目 | 考点 |
|---|---|
| bear | 中文特殊文本编码的识别 |
| 表情包 | 图片元数据隐写(XMP) |
| whale | Windows 平台的中文程序,字符串几乎都是 GBK(代码页 936)编码 |
| 神奇的压缩包 | ZIP 伪加密:文件的通用标志位被标记为\"已加密\",但数据本身是明文 |
| 是我的Hanser! | 零宽字符隐写 + base-5 解码/ZIP AES-256 真加密(识别 + 密码使用)/PSD 图层结构,文字图层内容 |
| 上号 | pcap 流量分析 · JPEG 文件尾附加串 · steghide 口令隐写 |
bear
考点:中文特殊文本编码的识别。该类编码属于可逆编码,不是加密,无法暴力破解,只能依靠识别。
题目
记事本打开,发现是很怪的文本不认识
图包题的下一步固定是查元数据
.\\exiftool.exe -a -G1 -r \"表情包\" | Select-String \"qsnctf\"
-a 显示所有同名标签,-G1 标注来源组,-r 递归。

<dc:creator>
<rdf:li>qsnctf</rdf:li>
<rdf:li>qsnctf{5cab6ff8-0684-4adc-95c3-89283607073e}</rdf:li>
</dc:creator>
FLAG
qsnctf{5cab6ff8-0684-4adc-95c3-89283607073e}
whale
直接用记事本打开 ctrl+f 搜索flag直接得到flag,或者直接双击运行,比较快,需要认真看

FLAG
qsnctf{b6627d79-1500-47b2-81c1-b9f158968fc5}
ZIP知识点
一个%20ZIP%20文件对每个成员保存了两份元数据:
| 名称 | 位置 | 作用 |
|---|---|---|
| 本地文件头 | 数据前面,PK\\x03\\x04 开头 |
流式解压时用 |
| 中央目录 | 文件末尾,PK\\x01\\x02 开头 |
整个包的\"目录表\",解压软件先读它 |
两份头里都有一格%202%20字节的 通用标志位(General%20Purpose%20Bit%20Flag)
bit0%20=%201%20 →%20 该文件已加密
bit0%20=%200%20 →%20 未加密
伪加密的套路就是把%20bit0%20置%201,但不真正加密。
解压软件只读标志位、不验证数据,看到\"加密\"就弹密码框;而这里根本没有密码可以爆破——因为根本没加密。
一、补充知识点:到底该改哪一处
伪加密有时会同时置位本地头和中央目录。实测三种改法:
| 改动位置 | Python zipfile |
Windows Expand-Archive |
|---|---|---|
只改本地头 0x06 |
❌%20仍报需要密码 | — |
只改中央目录 0x79E |
✅%20成功 | ✅%20成功 |
| 两处都改 | ✅%20成功 | ✅%20成功 |
原因:常规解压流程先读中央目录,标志位不对就直接拦下,本地头根本没机会被检查。
结论:最小改动是中央目录一处;两处都改更保险,兼容个别会校验本地头的工具。
二、常见变体与区分
标志位不一定是 01%2000
| 值 | 含义 |
|---|---|
01%2000 |
只置%20bit0(加密) |
09%2000 |
bit0%20+%20bit3(加密%20+%20数据描述符),同样按\"加密\"处理 |
改法一致:整格改成 00%2000。
是我的Hanser!
一、解题过程
拿到附件解压后拿到一个zip文件和一个txt文本,txt%20看起来是一段普通外文,zip%20解压要密码
第一层:%20文本体检%20发现零宽字符
python%20textcheck.py%20是我的Hanser!.txt
输出:
95%20个零宽字符,6%20种——这就是编码用的\"字母表\"。
手工检测的办法:Word%20里打开%20→%20开始%20→%20显示/隐藏编辑标记;或在线搜%20\"zero%20width%20character%20detector\"%20粘贴全文。
Password%20is%20:%20Hanser2024
或者用零宽字符的隐写脚本
python%20zwdecode.py%20是我的Hanser!.txt
直接输出密码:
2.第二层:判断%20ZIP%20的加密类型
先看结构,确认是不是伪加密:
python%20misc_scan.py%20Hanser.zip
| 检查项 | 值 | 含义 |
|---|---|---|
| 压缩方法 | 99 | AES%20加密(不是普通的%208%20=%20deflate) |
| extra%20字段 | 0x9901%20= 0200%204145%2003 |
AE-2%20格式,强度%203%20= AES-256 |
| 数据熵 | 7.999 | 密文(伪加密会低很多) |
| CRC | 0 | AES%20包不写%20CRC |
| 内含文件 | Hanser.psd |
16,477,602%20字节 |
四个特征齐了%20→ 真加密,不是伪加密,只能用密码解。
2.1.解密%20ZIP
7-Zip
右键 Hanser.zip →%207-Zip%20→%20提取到当前位置%20→%20输入密码 Hanser2024。
第三层:PSD%20图层
PSD%20是%20Photoshop%20工程文件,由\"图层\"堆叠而成,可以包含文字层、隐藏层。
方法一:Photoshop%20/%20GIMP%20打开(最直观)
- 双击打开
Hanser.psd - 右侧图层面板有%203%20个图层
- 其中一个叫%20\\
FLAG\\,图标是T(文字图层) - 双击那个图层,文字就显示出来了
FLAG
qsnctf{bb3bdea1fba9b8b940c3cb788d3f0aae}
方法二、用010打开直接搜索
考点
这题是三层嵌套
| 层 | 知识点 | |
|---|---|---|
| 第%201%20层 | 零宽字符隐写%20+%20base-5%20解码 | |
| 第%202%20层 | ZIP%20AES-256%20真加密(识别%20+%20密码使用) | |
| 第%203%20层 | PSD%20图层结构,文字图层内容 |
| 工具 | 作用 |
|---|---|
textcheck.py |
文本体检,自动统计零宽字符 |
misc_scan.py |
附件一键体检,判断%20ZIP%20加密类型 |
zwdecode.py |
专门解零宽字符隐写的工具 |
所属知识点
1.%20零宽字符是什么
有些%20Unicode%20字符宽度为%200,肉眼完全看不见,但确实占一个字符位置:
| 字符 | 码位 | 名称 | 用途 |
|---|---|---|---|
| ZWSP | U+200B | 零宽空格 | 换行点 |
| ZWNJ | U+200C | 零宽不连字 | 排版 |
| ZWJ | U+200D | 零宽连接符 | Emoji%20组合 |
| LRM | U+200E | 从左到右标记 | 双向文本 |
| RLM | U+200F | 从右到左标记 | 双向文本 |
| BOM | U+FEFF | 零宽不换行空格 | 文件开头标记 |
它们本来用于排版,但也可以当\"看不见的字母表\"——几种字符轮换排列,就能编码任意信息。
上号
考点
| 环节 | 知识点 |
|---|---|
| 1 | 从%20pcap%20里筛出明文%20HTTP(TLS%20是噪音) |
| 2 | Wireshark「导出对象」把下载的文件还原出来 |
| 3 | 识别%20JPEG%20文件尾的可疑字符串 |
| 4 | steghide%20隐写:密码就在文件尾 |
解题过程
1.先分清哪些流量有用
打开 files.pcapng,菜单 统计%20→%20协议分级
| 协议 | 占比 | 判断 |
|---|---|---|
| TLS | 大部分 | 加密,看不了 |
| HTTP | 少量 | 明文,重点 |
| DNS%20/%20ARP%20/%20SSDP | 零星 | 浏览器噪音 |
过滤栏输入:
http
只剩三条请求:
GET%20/%20 %20 %20 %20 %20 %20 %20 HTTP/1.1
GET%20/favicon.ico%20 %20HTTP/1.1
GET%20/shanghao.zip%20 HTTP/1.1
2.看服务器给了什么
对 GET%20/ 那条 右键%20→%20追踪%20→%20TCP%20流(Follow%20→%20TCP%20Stream),看到目录列表:
3.导出文件
菜单 文件%20→%20导出对象%20→%20HTTP(File%20→%20Export%20Objects%20→%20HTTP),列表里选中 shanghao.zip →%20保存。
4.解压
得到一个文件:shanghao.jpg一张\"上号\"表情包

wsl -d Ubuntu










评论