MuneneGeo/ZWC-decoder

GitHub: MuneneGeo/ZWC-decoder

一款纯 Python 实现的零宽字符隐写解码器,用于在 CTF 挑战中自动检测并解码隐藏在文本文件中的秘密信息。

Stars: 0 | Forks: 0

# ZWC 解码器 🔍 一个用于检测和解码**零宽字符 (ZWC) 隐写术**的 Python 工具 —— 常用于 CTF(夺旗赛)挑战中。 ## 演示 ![ZWC 解码器运行截图](https://static.pigsec.cn/wp-content/uploads/repos/2026/06/22fc8de71b211718.png) ## 什么是 ZWC 隐写术? 零宽字符是真实的 Unicode 字符,在任何文本编辑器、浏览器或终端中渲染时都是**完全不可见的**。攻击者和 CTF 出题者利用它们在看似正常的文本中隐藏秘密信息。 主要使用的三个字符: | 名称 | Unicode | UTF-8 字节 | 作用 | |---|---|---|---| | 零宽空格 (ZWSP) | U+200B | `E2 80 8B` | 编码 bit `0` 或 `1` | | 零宽非连接符 (ZWNJ) | U+200C | `E2 80 8C` | 编码 bit `0` 或 `1` | | 零宽连接符 (ZWJ) | U+200D | `E2 80 8D` | 字符之间的分隔符 | **示例:**文本 `hello` 可能实际上包含 200 个隐藏着秘密 flag 的不可见字符 —— 而你光凭肉眼是绝对看不出来的。 ## 功能 - 自动检测任何文件中的所有零宽字符 - 尝试**所有可能的编码组合**,省去你猜测的麻烦 - 处理 7 位和 8 位 ASCII 编码 - 处理带分隔符或不带分隔符的文件 - 检测:U+200B、U+200C、U+200D、U+2060、U+FEFF - 显示可见(诱饵)文本与隐藏字符的数量对比 - 当多种策略成功时,允许你选择正确的结果 - 可选择将结果保存到文件中 - 彩色终端输出,方便阅读 ## 环境要求 - Python 3.6 或更高版本 - 无需外部库 —— 仅使用 Python 标准库 ## 安装 ``` # Clone 仓库 git clone https://github.com/MuneneGeo/ZWC-decoder.git # 进入文件夹 cd ZWC-decoder # 设为可执行文件 (Linux/Mac) chmod +x zwc_decoder.py ``` ## 用法 ``` python3 zwc_decoder.py ``` 系统会提示你输入文件路径: ``` [?] Enter file path: /home/kali/ctf/suspicious_file.txt ``` 该工具随后会: 1. 分析文件并报告找到的所有隐藏字符 2. 自动尝试所有解码策略 3. 显示所有可读的解码结果 4. 提示你识别出 flag 5. 可选择将结果保存到 `zwc_results.txt` ## 示例输出 ``` [+] Loaded: not_fl4g.txt ── FILE ANALYSIS ───────────────────────── Total characters : 231 Visible text : 24 chars → 'r00t{naah_not_the_flag}' Hidden chars : 207 Breakdown: ZWSP U+200B (Zero-Width Space) : 106 ZWNJ U+200C (Zero-Width Non-Joiner) : 75 ZWJ U+200D (Zero-Width Joiner) : 26 [+] Hidden characters detected! Starting decode... ── TRYING ALL DECODE STRATEGIES ────────── [+] Strategy 3 : 0=U+200C, 1=U+200B, sep=U+200D, bits=7 Result: r00t{H1dd3n_1n_Pl41n_S1ght} 🚩 FLAG: r00t{H1dd3n_1n_Pl41n_S1ght} ``` ## 工作原理 ### 第一步 —— 检测 扫描文件中的每个字符,寻找零宽 Unicode 码点。 ### 第二步 —— 分析 报告找到的各种字符数量,以及可见(诱饵)文本的内容。 ### 第三步 —— 解码 尝试以下所有组合: - 哪个字符代表 `0`,哪个字符代表 `1` - 哪个字符充当分隔符(或没有分隔符) - 编码是 7 位还是 8 位 ASCII ### 第四步 —— 呈现 显示所有可读的解码结果,并让你挑选出 flag。 ## 在 Kali Linux 上的 CTF 工作流 ``` # 1. 如果文件位于受密码保护的 zip 中,请先破解它 zip2john challenge.zip > hash.txt john hash.txt --wordlist=/usr/share/wordlists/rockyou.txt unzip -P challenge.zip # 2. 运行 decoder python3 zwc_decoder.py # 3. 提示时输入提取的文件路径 # 4. 从结果中获取你的 flag ``` ## 手动检测 ZWC(供学习参考) ``` # 方法 1 — hexdump(寻找 e2 80 8b / 8c / 8d 字节) hexdump -C file.txt | grep "e2 80" # 方法 2 — cat -v(将隐藏字符显示为符号) cat -v file.txt # 方法 3 — Python 单行命令 python3 -c " text = open('file.txt', encoding='utf-8').read() for i, ch in enumerate(text): if ord(ch) in (0x200B, 0x200C, 0x200D): print(f'pos {i}: U+{ord(ch):04X}') " ``` ## 支持的编码方案 | 方案 | 是否支持 | |---|---| | ZWSP=0, ZWNJ=1, ZWJ 分隔符 | ✅ | | ZWSP=1, ZWNJ=0, ZWJ 分隔符 | ✅ | | 无分隔符,7 位数据块 | ✅ | | 无分隔符,8 位数据块 | ✅ | | Word Joiner (U+2060) 作为分隔符 | ✅ | | BOM (U+FEFF) 作为分隔符 | ✅ | ## 许可证 MIT 许可证 —— 可免费使用、修改和分发。 ## 作者 CTF 玩家 [GITHUB] https://github.com/MuneneGeo 专为 CTF 隐写术挑战而开发。 如果它帮助你拿到了 flag —— 请给个 ⭐
标签:DNS 反向解析, Python, 无后门, 解码器, 逆向工具, 隐写术