hexforge / guides / file-signatures

GUIDE 10 / FORENSICS

文件头与十六进制

扩展名可以被修改,文件内容却会留下结构信号。读取开头几个字节并与常见魔数比对,是 CTF 文件取证中成本最低的一步。

什么是文件魔数

很多文件格式在开头保留固定字节,用来标记格式或版本,这些字节常被称为文件签名或魔数。操作系统和取证工具可以依据内容判断类型,而不是盲目信任文件名后缀。

格式常见开头字节文本形式
PNG89 50 4E 47 0D 0A 1A 0A包含 PNG 标识
ZIP50 4B 03 04PK
PDF25 50 44 46%PDF
ELF7F 45 4C 46.ELF
Windows PE4D 5AMZ

从一段 Hex 判断文件

题目给出以下数据,但没有说明来源:

89 50 4e 47 0d 0a 1a 0a 00 00 00 0d 49 48 44 52

前 8 个字节匹配 PNG 签名,随后出现 49 48 44 52,转为文本是 IHDR,对应 PNG 的图像头数据块。这比“看起来像十六进制”更强,因为多个结构信号相互印证。

什么时候适合转成文本

Hex 转文本适合检查可打印 ASCII、Flag 片段、协议字段和已知标识。遇到图片、压缩包、程序或加密数据时,大量字节无法显示为文本是正常现象。此时应保留字节并交给对应解析器,而不是把乱码当作失败。

可以先转换前几十个字节寻找可读标识,再决定是否重建文件。重建时必须保持原始字节顺序,不能删除看似无意义的 00

字节序与数值字段

魔数通常按文件中出现的顺序书写,但多字节数值可能采用大端或小端。比如字节 78 56 34 12 按小端解释为 0x12345678。只有在解析长度、偏移、时间戳等数值字段时才应套用字节序;不要把整份文件随意倒序。

常见错误

  • 只看扩展名,不检查实际内容。
  • 把十六进制字符串中的一个字符当成一个字节;实际通常两个 Hex 字符表示一个字节。
  • 复制时混入 0x、逗号或不可见字符,却没有记录清理规则。
  • 只匹配两个字节就下结论,没有验证后续结构。
  • 修复文件头后覆盖原件,导致无法回退和复核。

文件类型判断清单

  1. 复制样本并计算 SHA-256,保留原件只读。
  2. 读取开头 16–64 个字节,记录原始 Hex。
  3. 匹配常见签名,并检查后续块名或结构字段。
  4. 核对文件长度、结尾标记和容器内容。
  5. 需要修复时在副本上操作,并重新计算哈希。
签名匹配不是最终鉴定

极短的签名可能碰巧出现,也可能被人为伪造。可靠结论应同时依据文件头、内部结构、长度和解析结果。