hexforge / guides / binary

GUIDE 09 / ENCODING

如何识别二进制文本

只由 0 和 1 组成并不代表一定能直接转成文本。可靠的判断需要同时检查分组、字节边界、字符编码和解码后的结构。

先判断它是不是按字节表示

常见的“二进制文本”是把每个字节写成 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,自然会得到乱码。

常见错误

删除前导零

000010101010 数值相同,但前者明确占一个字节。删除前导零会破坏字节边界,也可能让后续全部错位。

把位序反过来

通常按从左到右的最高位到最低位读取。只有题目给出位反转、LSB first 或硬件协议等证据时,才考虑反转每组位序。

看到乱码就继续硬转

乱码可能表示输入不是文本,也可能表示字符编码选择错误。先检查是否出现文件头、压缩数据或加密字节,不要无限尝试编码转换。

稳定的判断流程

  1. 保留原始输入,并只清理明确的空格和换行。
  2. 确认字符范围、总位数和可能的 8 位分组。
  3. 按字节转换为十六进制,检查可打印字符和文件签名。
  4. 文本场景优先尝试 UTF-8,失败时再分析其他编码。
  5. 记录每次转换的输入、规则和输出,发现结构变差时及时回退。
安全边界

本文只讨论授权 CTF、教学实验和本地数据分析。不要把工具用于读取或处理未经授权取得的数据。