先判断它是不是按字节表示
常见的“二进制文本”是把每个字节写成 8 个二进制位,例如字母 A 的 ASCII 值是 65,对应 01000001。题目通常用空格、换行或连续字符串分隔这些字节。第一步应清理空白,再确认总位数是否能被 8 整除。
| 现象 | 可能含义 | 需要继续验证 |
|---|---|---|
| 只包含 0 和 1 | 可能是二进制表示 | 也可能是位掩码、数字或压缩数据 |
| 每 8 位一组 | 符合字节边界 | 解码后是否形成合理字节序列 |
| 大量以 0 开头 | 可能是 ASCII 文本 | 高位字节较多时也可能是 UTF-8 |
| 位数不是 8 的倍数 | 可能缺少前导零 | 不要未经证据随意补位 |
一个可复现的 CTF 示例
下面的输入共有 13 个 8 位字节:
01100110 01101100 01100001 01100111 01111011 01100010 01101001 01110100 01110011 01011111 01101111 01101011 01111101
逐字节转换后得到 flag{bits_ok}。字符范围合理、花括号结构完整,而且与常见 Flag 格式一致,因此判断可信。把它粘贴到本站的二进制转换器即可复现。
ASCII 与 UTF-8 不要混为一谈
ASCII 只覆盖较小的字符范围,英文和常见符号通常一个字节即可表示。中文等 Unicode 字符在 UTF-8 中会占用多个字节。如果解码得到多个高位字节,不应逐字节强行显示为字符,而应先组成字节数组,再整体按 UTF-8 解码。
例如中文“中”的 UTF-8 字节是 E4 B8 AD,写成二进制后是三个字节。把每个字节单独解释为 ASCII,自然会得到乱码。
常见错误
删除前导零
00001010 与 1010 数值相同,但前者明确占一个字节。删除前导零会破坏字节边界,也可能让后续全部错位。
把位序反过来
通常按从左到右的最高位到最低位读取。只有题目给出位反转、LSB first 或硬件协议等证据时,才考虑反转每组位序。
看到乱码就继续硬转
乱码可能表示输入不是文本,也可能表示字符编码选择错误。先检查是否出现文件头、压缩数据或加密字节,不要无限尝试编码转换。
稳定的判断流程
- 保留原始输入,并只清理明确的空格和换行。
- 确认字符范围、总位数和可能的 8 位分组。
- 按字节转换为十六进制,检查可打印字符和文件签名。
- 文本场景优先尝试 UTF-8,失败时再分析其他编码。
- 记录每次转换的输入、规则和输出,发现结构变差时及时回退。
安全边界
本文只讨论授权 CTF、教学实验和本地数据分析。不要把工具用于读取或处理未经授权取得的数据。