☰
CTF 压缩包分析:RAR 文件格式逐字节解析与爆破、伪加密、明文攻击实战
2026/9/28 20:26:50 网站建设 项目流程
  • 文档
  • 网络安全
  • 教程

【免费下载链接】ctf-wiki

Come and join us, we need you!

项目地址:https://gitcode.com/gh_mirrors/ct/ctf-wiki
点击查看免费下载

RAR 是 CTF Misc 分类下压缩包分析题的高频考察格式,其二进制文件由一串带 CRC 校验的“块”(Block)组成。本文以 CTF Wiki「压缩包分析」章节的 RAR 文档 为主体,从文件头签名、块通用字段、文件头块到结尾块逐层拆解 RAR 的二进制布局,并系统讲解爆破、伪加密、明文攻击三类实战手法,帮助读者在比赛中快速识别 RAR 文件、判定伪加密并选择合适的破解工具。

RAR 文件整体结构与块模型

RAR 文件主要由标记块(MARK_HEAD)、压缩文件头块(Main Archive Header)、文件头块(File Header)、结尾块(Terminator)组成。整个文件本质上就是一系列结构相同、以块类型区分语义的数据块按顺序拼接而成。

其每一块大致分为以下几个字段:

名称大小描述
HEAD_CRC2全部块或块部分的CRC
HEAD_TYPE1块类型
HEAD_FLAGS2阻止标志
HEAD_SIZE2块大小
ADD_SIZE4可选字段 - 添加块大小

各字段的职责:

  • HEAD_CRC(2 字节):对整块或块的部分字段计算得到的 CRC 校验值,用于在解压时校验块数据是否完整、未被篡改。伪造块内容时必须同步重算 CRC,否则解压工具会报错。
  • HEAD_TYPE(1 字节):块类型标识。例如0x74表示文件头块(File Header),0x7b表示结尾块(Terminator)。分析时通常先按 HEAD_TYPE 定位块的语义。
  • HEAD_FLAGS(2 字节):块标志位,不同比特位承载不同语义——RAR 的伪加密就藏在这个字段里。
  • HEAD_SIZE(2 字节):块大小,用于在流式解析时跳过整个块。
  • ADD_SIZE(4 字节):可选字段,表示附加数据的大小,仅在部分块类型中出现。

文件头签名与标记块

RAR 压缩包的文件头为0x 52 61 72 21 1A 07 00,这是识别 RAR 文件最直接的硬性标志。字节52 61 72 21正是 ASCII 字符串Rar!,其后紧跟1A 07 00。

从字节层面还原,这 7 个字节恰好可以按块通用字段拆解为:

  • 0x52 0x61→ HEAD_CRC =0x6152(小端序)
  • 0x72→ HEAD_TYPE =0x72,即标记块(MARK_HEAD)类型
  • 0x1A 0x21→ HEAD_FLAGS =0x211A
  • 0x07 0x00→ HEAD_SIZE =0x0007

按文档描述,紧跟着文件头(0x526172211A0700)的是标记块(MARK_HEAD),其后还有文件头(File Header)。因此,在十六进制编辑器中打开 RAR 文件后,先在文件头中确认52 61 72 21 1A 07 00签名,再顺着块链表依次解析后续块,是标准分析流程。

文件头块(File Header)字段详解

当块的 HEAD_TYPE 为0x74时,该块即为文件头块,描述归档内的一个文件条目。其完整结构如下:

名称大小描述
HEAD_CRC2CRC of fields from HEAD_TYPE to FILEATTR and file name
HEAD_TYPE1Header Type: 0x74
HEAD_FLAGS2Bit Flags (Please see ‘Bit Flags for File in Archive’ table for all possibilities)(伪加密)
HEAD_SIZE2File header full size including file name and comments
PACK_SIZE4Compressed file size
UNP_SIZE4Uncompressed file size
HOST_OS1Operating system used for archiving (See the ‘Operating System Indicators’ table for the flags used)
FILE_CRC4File CRC
FTIME4Date and time in standard MS DOS format
UNP_VER1RAR version needed to extract file (Version number is encoded as 10 * Major version + minor version.)
METHOD1Packing method (Please see ‘Packing Method’ table for all possibilities
NAME_SIZE2File name size
ATTR4File attributes
HIGH_PACK_SIZ4High 4 bytes of 64-bit value of compressed file size. Optional value, presents only if bit 0x100 in HEAD_FLAGS is set.
HIGH_UNP_SIZE4High 4 bytes of 64-bit value of uncompressed file size. Optional value, presents only if bit 0x100 in HEAD_FLAGS is set.
FILE_NAMENAME_SIZE bytesFile name - string of NAME_SIZE bytes size
SALT8present if (HEAD_FLAGS & 0x400) != 0
EXT_TIMEvariable sizepresent if (HEAD_FLAGS & 0x1000) != 0

关键字段解读:

  • HEAD_CRC:覆盖从 HEAD_TYPE 到 FILEATTR 以及文件名字段的 CRC,是校验文件头完整性的依据。
  • HEAD_FLAGS:位标记字段,即文档标注的“伪加密”所在位置。其中不同比特位对应不同语义:0x100位置位时追加 HIGH_PACK_SIZ / HIGH_UNP_SIZE 高 32 位字段(支持 64 位大文件);0x400位置位时追加 8 字节 SALT 盐值字段;0x1000位置位时追加变长 EXT_TIME 扩展时间字段。
  • HEAD_SIZE:包含文件名与注释在内的文件头总大小,用于跳过整个文件头。
  • PACK_SIZE / UNP_SIZE:压缩后文件大小 / 解压后文件大小。两者对比可以快速判断文件内容规模与压缩效果。
  • HOST_OS:打包时使用的操作系统,可用于推断出题环境。
  • FILE_CRC:文件数据的 CRC 校验值。当文件内容极短时,可直接枚举候选明文内容并与 FILE_CRC 比对还原原文(详见后文 CRC 校验值分析)。
  • FTIME:MS-DOS 格式的日期时间,可用来判断文件的打包时间线索。
  • UNP_VER:解压所需的最低 RAR 版本,编码方式为10 * 主版本 + 次版本。
  • METHOD:压缩方式,不同取值对应 store / normal / fast 等不同压缩策略。
  • NAME_SIZE / FILE_NAME:文件名长度与文件名本体。
  • SALT:8 字节盐值,仅在(HEAD_FLAGS & 0x400) != 0时出现。SALT 是加密算法所需的随机盐,其出现条件本身就指向“文件已加密”的标记位——这正是伪加密攻击的着眼点。

结尾块(Terminator)

每个 RAR 文件的结尾块都是固定的,它标记着整个归档的结束:

Field NameSize (bytes)Possibilities
HEAD_CRC2Always 0x3DC4
HEAD_TYPE1Header type: 0x7b
HEAD_FLAGS2Always 0x4000
HEAD_SIZE2Block size = 0x0007

也就是说,一个正常 RAR 文件的末尾固定以C4 3D 7B 00 40 07 00(小端序)结尾。判断文件是否被截断、是否为一个完整归档时,检查这个固定尾巴非常实用。

主要攻击手法

爆破

  • Linux 下的 RarCrack是爆破 RAR 压缩包密码的常用工具。其适用前提是密码强度较弱、可枚举(如纯数字、短长度、常见字典词);当密码足够长且随机时,爆破的时间成本呈指数级上升,应优先考虑其他攻击面。爆破类工具的核心思路与 ZIP 格式 文档中介绍的fcrackzip一致:指定爆破模式、密码字符集与长度范围,对每个候选密码尝试解压验证。

伪加密

原理:RAR 文件的伪加密位于文件头(File Header)中的位标记字段(HEAD_FLAGS)上。根据上文文件头块字段表,SALT 字段仅在(HEAD_FLAGS & 0x400) != 0时才出现,而 SALT 正是加密算法所需的盐值——也就是说,HEAD_FLAGS的0x400位承担着“文件已加密”的标记职责。用 010 Editor 可以很清楚地看见这一位,修改这一位即可造成伪加密:文件内容本身并未真正加密,但解压时却会提示输入密码,从而在题目中伪装出“加密”假象。

上图即 010 Editor 加载 RAR 结构模板后的解析视图:RarBlock展开后可以看到块 CRC、块类型,以及FileHeadFlags位域结构体中的PASSWORD_ENCRYPTED : 1位——这就是伪加密标记所在。

实操流程:

  1. 用 010 Editor 打开 RAR 文件,加载 RAR 结构模板,定位到文件头块(HEAD_TYPE =0x74);
  2. 展开HEAD_FLAGS位域,找到PASSWORD_ENCRYPTED位;
  3. 若该位被置位(1)而文件实际未加密,将其修改为0,保存后即可直接解压出内容;
  4. 反之,若要将一个真实未加密的文件伪装成加密题目,则把该位置1即可。

绕过与修复思路(与 ZIP 格式 文档中列举的方法互通):

  • 用十六进制编辑器直接修改位标记,是最直接、最可控的方式;
  • 使用不校验加密位的解包工具直接提取文件;
  • 部分系统自带的归档工具可以直接打开伪加密压缩包;
  • 检测伪加密时可结合文件头字段表逐位核对 HEAD_FLAGS 的实际语义,判断加密位是否与 SALT 字段、文件实际状态相符。

明文攻击

RAR 的明文攻击等手法与 ZIP 格式 中介绍的基本一致,核心前提有三个:

  • 一个加密的压缩文件;
  • 知道压缩包内某个文件的部分连续明文内容(至少 12 字节);
  • 打包已知明文时使用的压缩工具与算法必须与原压缩包一致——例如用 7z 压缩的包必须用 7z 重新打包明文,压缩算法不匹配会导致明文攻击失败。

流程:将已知明文文件(如题目中泄露的readme.txt)用相同工具打包 → 使用ARCHPR(Windows)或PKCrack(Linux)发起明文攻击 → 还原出密钥后解密整个压缩包,取出其中的 flag 文件。详细的原理说明、工具参数(如pkcrack的-C/-c/-P/-p/-d参数含义)、安装步骤与完整例题解析均收录在 ZIP 格式 中,RAR 场景可直接复用整套思路。

CRC 校验值分析

除了爆破与伪加密,基于校验值的攻击同样值得关注。RAR 文件头块中的FILE_CRC字段(4 字节)记录了文件数据的 CRC 校验值。当压缩包内文件内容极短(比赛中常见约 4 字节左右)且密码很长时,与其爆破密码,不如直接枚举可能的明文内容、逐一对候选字符串计算 CRC 并与 FILE_CRC 比对,从而还原出原文。该手法的原理、Python 脚本与例题同样收录在 ZIP 格式 中,RAR 场景可直接复用。

实战要点小结

  • 识别:文件头0x526172211A0700是 RAR 的硬标识,52 61 72 21即 ASCIIRar!;
  • 结构:按 HEAD_TYPE 依次解析块链表——0x74为文件头块,末尾固定为0x7b(0x3DC4 / 0x4000 / 0x0007);
  • 伪加密判定:检查文件头块 HEAD_FLAGS 的加密位(对应 SALT 字段的(HEAD_FLAGS & 0x400) != 0出现条件),结合“解压时要求密码但文件属性与内容明显未加密”的现象综合判断;
  • 工具选择:结构分析用 010 Editor,爆破用 RarCrack(Linux),明文攻击用 ARCHPR / PKCrack;
  • 横向关联:本文档与 ZIP 格式 共同构成 CTF Wiki Misc 分类下的「压缩包分析」章节(参见 docs/zh/mkdocs.yml 的导航配置),两者在明文攻击、伪加密、CRC 爆破等手法上高度互通,建议对照阅读。
  • 文档
  • 网络安全
  • 教程

【免费下载链接】ctf-wiki

Come and join us, we need you!

项目地址:https://gitcode.com/gh_mirrors/ct/ctf-wiki
点击查看免费下载

相关推荐

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询