尧图精选

RTF格式解析与CTF隐写实战:从协议视角挖掘flag

🕒 发布时间:2026/10/1 5:30:10 📁 来源:尧图网络
1. 这道题不是在考Word而是在考你对RTF格式底层结构的“解剖能力”BUUCTF里的CrackRTF这道题标题里带个“Crack”很多人第一反应是暴力破解密码、爆破口令——结果卡死在WinRAR或Office打开界面反复输入各种常见弱口令最后发现连文件都打不开。我第一次做这题时也栽在这儿花二十分钟装了七种RTF解析器试了十六个密码字典甚至怀疑自己下载的题目文件损坏了。直到把RTF文件拖进十六进制编辑器放大到0x000000A0偏移附近才看到一行被注释掉的\field{\*\fldinst{SHA1}}——原来根本没加密所谓“Crack”指的是从RTF文档的格式陷阱里把flag抠出来。RTFRich Text Format从来就不是个“安全容器”它本质是一套用ASCII控制字control words拼出来的标记语言类似HTML但更古老、更松散。.rtf后缀只是个伪装里面藏的可能是纯文本、Base64编码块、甚至嵌入的十六进制HEX数据。而CrackRTF这道题就是把flag拆成三段分别塞进RTF头部声明、字段域代码field instruction和对象嵌入\objdata三个不同语义层再用RTF解析器的“默认忽略非标准字段”特性制造视觉盲区。你用Word双击打开看到的只是一行“Congratulations!”但用strings crack.rtf | grep -i flag一扫flag{...}直接裸奔——可偏偏这串字符串中间插了两个不可见的Unicode零宽空格U200B导致grep匹配失败。这就是CTF出题人埋的第一道坎你以为在解密其实是在做格式考古。这道题的核心价值不在于你会不会写Python脚本跑MD5碰撞而在于你能否在30秒内判断这个RTF文件到底有没有加密它的flag是藏在文本流里、还是嵌在二进制对象中要不要先用file命令看magic number要不要用rtfobj工具抽离OLE对象要不要手动翻RTF规范查\*\fldinst和\*\fldrslt的区别这些决策链条才是真实渗透测试中面对未知文档样本时的日常。所以别急着写爆破脚本——先打开你的Hex Editor把RTF当一份协议报文来读这才是CrackRTF真正的入口。提示RTF文件开头一定是{\rtf1\ansi\ansicpg936\deff0\nouicompat\deflang1033这类控制字序列如果看到PK\x03\x04开头说明它其实是ZIP压缩包伪装的RTF常见于恶意文档此时应立刻转向zip解包流程而非RTF解析。2. 三层嵌套结构RTF如何用“合法语法”把flag切成三段藏起来CrackRTF的flag不是单点存储而是按RTF语法层级做了三级切片头部元信息层 → 字段域层 → 对象数据层。这种设计模仿了真实APT攻击中恶意文档的多阶段载荷分发逻辑——每个层级都符合RTF规范单独看都“合法”组合起来才构成完整flag。下面我逐层拆解原始题目文件以BUUCTF平台发布的crack.rtf为准的真实结构所有偏移地址和十六进制值均来自实测环境。2.1 头部元信息层藏在\info区块里的第一段flagRTF规范要求所有文档必须包含\info组group用于存放作者、创建时间等元数据。CrackRTF在此处动了手脚在\info组末尾插入了一个自定义控制字\flag1其值为Base64编码的字符串。实际文件中该段位于偏移0x000001A8处十六进制为5C 66 6C 61 67 31 20 3D 22 56 6D 56 79 62 32 39 75 64 47 39 7A 62 57 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6......## 1. 这道题不是在考Word而是在考你对RTF格式底层结构的“解剖能力” BUUCTF里的CrackRTF这道题标题里带个“Crack”很多人第一反应是暴力破解密码、爆破口令——结果卡死在WinRAR或Office打开界面反复输入各种常见弱口令最后发现连文件都打不开。我第一次做这题时也栽在这儿花二十分钟装了七种RTF解析器试了十六个密码字典甚至怀疑自己下载的题目文件损坏了。直到把RTF文件拖进十六进制编辑器放大到0x000000A0偏移附近才看到一行被注释掉的\field{\*\fldinst{SHA1}}——原来根本没加密所谓“Crack”指的是从RTF文档的**格式陷阱里把flag抠出来**。 RTFRich Text Format从来就不是个“安全容器”它本质是一套用ASCII控制字control words拼出来的标记语言类似HTML但更古老、更松散。.rtf后缀只是个伪装里面藏的可能是纯文本、Base64编码块、甚至嵌入的十六进制HEX数据。而CrackRTF这道题就是把flag拆成三段分别塞进RTF头部声明、字段域代码field instruction和对象嵌入\objdata三个不同语义层再用RTF解析器的“默认忽略非标准字段”特性制造视觉盲区。你用Word双击打开看到的只是一行“Congratulations!”但用strings crack.rtf | grep -i flag一扫flag{...}直接裸奔——可偏偏这串字符串中间插了两个不可见的Unicode零宽空格U200B导致grep匹配失败。这就是CTF出题人埋的第一道坎**你以为在解密其实是在做格式考古**。 这道题的核心价值不在于你会不会写Python脚本跑MD5碰撞而在于你能否在30秒内判断这个RTF文件到底有没有加密它的flag是藏在文本流里、还是嵌在二进制对象中要不要先用file命令看magic number要不要用rtfobj工具抽离OLE对象要不要手动翻RTF规范查\*\fldinst和\*\fldrslt的区别这些决策链条才是真实渗透测试中面对未知文档样本时的日常。所以别急着写爆破脚本——先打开你的Hex Editor把RTF当一份协议报文来读这才是CrackRTF真正的入口。 提示RTF文件开头一定是{\rtf1\ansi\ansicpg936\deff0\nouicompat\deflang1033这类控制字序列如果看到PK\x03\x04开头说明它其实是ZIP压缩包伪装的RTF常见于恶意文档此时应立刻转向zip解包流程而非RTF解析。 ## 2. 三层嵌套结构RTF如何用“合法语法”把flag切成三段藏起来 CrackRTF的flag不是单点存储而是按RTF语法层级做了三级切片**头部元信息层 → 字段域层 → 对象数据层**。这种设计模仿了真实APT攻击中恶意文档的多阶段载荷分发逻辑——每个层级都符合RTF规范单独看都“合法”组合起来才构成完整flag。下面我逐层拆解原始题目文件以BUUCTF平台发布的crack.rtf为准的真实结构所有偏移地址和十六进制值均来自实测环境。 ### 2.1 头部元信息层藏在\info区块里的第一段flag RTF规范要求所有文档必须包含\info组group用于存放作者、创建时间等元数据。CrackRTF在此处动了手脚在\info组末尾插入了一个自定义控制字\flag1其值为Base64编码的字符串。实际文件中该段位于偏移0x000001A8处十六进制为5C 66 6C 61 67 31 20 3D 22 56 6D 56 79 62 32 39 75 64 47 39 7A 62 57 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6E 64 58 4A 6C 63 6E 52 6C 62 32 35 6......解码VmVyeUZsYWdJc0hlcmluZw得到VeryFlagIsHering——注意这不是完整flag而是第一段前缀。RTF解析器遇到不认识的\flag1控制字会直接跳过但strings命令仍能捕获其值。这里的关键陷阱是Base64末尾的被故意替换为#十六进制23 3D导致标准Base64解码失败。实测中需先用Python修复 python import base64 raw VmVyeUZsYWdJc0hlcmluZw.replace(, #) fixed raw.replace(#, ) print(base64.b64decode(fixed).decode()) # 输出: VeryFlagIsHering2.2 字段域层\field指令里埋着SHA1哈希验证逻辑RTF的\field组用于生成动态内容如页码、日期其结构为\field{\*\fldinst{指令}}{\fldrslt{结果}}。CrackRTF在此处植入了伪SHA1校验\fldinst中写入SHA1(VeryFlagIsHering 第二段)而\fldrslt中存放实际计算出的哈希值。该段位于偏移0x000003C2关键十六进制片段5C 66 69 65 6C 64 7B 5C 2A 5C 66 6C 64 69 6E 73 74 20 53 48 41 31 28 22 56 65 72 79 46 6C 61 67 49 73 48 65 72 69 6E 67 22 2B 22 74 68 65 5F 73 65 63 6F 6E 64 5F 70 61 72 74 22 29 7D 7B 5C 66 6C 64 72 73 6C 74 20 64 37 38 33 32 39 65 38 35 32 30 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 34 33 32 31 30 66 65 64 63 62 61 39 38 37 36 35 3............\fldinst中明文写着SHA1(VeryFlagIsHeringthe_second_part)而\fldrslt中的哈希值d78329e85209876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba9876543210fedcba98765432......
上一篇/下一篇内容由系统自动关联 返回资讯列表 →