PDF与Office文档结构
PDF与Office文档结构
本文适合
拿到 PDF、docx、xlsx、pptx、doc、xls 或可疑办公文档后,需要检查元数据、隐藏文本、对象流、宏和嵌入文件的 Misc 学习者。学完你能:把文档当作结构化容器分析,提取文本、对象、宏、附件和隐藏资源,并说明 flag 位于哪一层结构
PDF 和 Office 文档不是单纯“能打开的文件”。它们内部有结构、对象、资源、元数据、脚本和压缩内容,CTF 中经常把信息藏在这些层里。
一句话判断
文档能正常打开不代表没有隐藏内容;PDF 要看对象、stream、xref、附件和增量更新,Office 要先判断是 ZIP/XML 还是 OLE,再查元数据、宏、隐藏表和嵌入对象。
题目中常见信号
说明:有隐藏 stream、附件或历史版本
第一动作:pdfinfo、pdfid、binwalk
说明:脚本或附件藏信息
第一动作:pdf-parser、mutool
说明:本质是 ZIP 容器
第一动作:7z l、解压查 XML/media
说明:OLE 结构,可能有宏
第一动作:oleid、olevba
说明:隐藏文本层或白色字体
第一动作:pdftotext、解压 XML 搜索
说明:hidden sheet、sharedStrings、公式
第一动作:解压查 workbook/sheets
核心概念
PDF 和 Office 都是“容器”,渲染出来的页面只是其中一层。S 级分析要区分:
- 元数据层:作者、注释、路径、创建工具。
- 文本层:可见文本、隐藏文本、OCR 层、白色字体。
- 对象/资源层:图片、字体、stream、附件、OLE 对象。
- 脚本/宏层:PDF JavaScript、VBA 宏、自动动作。
- 历史/增量层:PDF 多次保存留下的旧对象。
最小分析流程
- 用
file判断文档类型,不被扩展名骗。 - 跑
exiftool、strings、binwalk做快速线索检查。 - PDF:用
pdfinfo、pdfid、pdf-parser、pdftotext查对象和文本。 - Office 新格式:
7z x解压,查docProps、word/、xl/、ppt/、media/、sharedStrings.xml。 - Office OLE 格式:用
oleid、olevba查宏和嵌入对象。 - 提取出的图片、压缩包、音频或二进制继续转对应文章。
- WP 中写清对象编号、XML 路径、宏函数或附件名。
最小验证示例
file challenge.pdf
exiftool challenge.pdf
pdfinfo challenge.pdf
pdfid.py challenge.pdf
pdftotext challenge.pdf -
binwalk challenge.pdfPDF 对象检查:
pdf-parser.py challenge.pdf --search flag
pdf-parser.py challenge.pdf --type /EmbeddedFile
pdf-parser.py challenge.pdf --object 12 --filter --raw > obj12.bin
file obj12.binOffice 新格式检查:
7z l report.docx
7z x report.docx -odocx_unzip
grep -RniE "flag|password|hidden|CTF" docx_unzip判断依据:
docx 可解压 -> 逐 XML/资源分析
PDF 搜到对象编号 -> 用对象编号复现提取
宏工具报告 AutoOpen/Document_Open -> 宏可能是入口常见利用 / 解题路线
路线总览:
关键证据:Author/Comment/路径异常
常用动作:exiftool、docProps
关键证据:渲染无字但 pdftotext 有输出
常用动作:提取文本层,查颜色/位置
关键证据:/EmbeddedFile、/Filespec
常用动作:pdf-parser 提取对象
关键证据:stream 压缩或混淆
常用动作:--filter 解压,再 file
关键证据:sharedStrings、hidden sheet
常用动作:解压搜索 XML
关键证据:VBA、AutoOpen、Shell
常用动作:olevba 反混淆
关键证据:media/ 下图片音频
常用动作:转图片/音频文章继续分析
常见失败原因
常见原因:flag 在隐藏层或元数据
排查动作:用文本/对象工具查
常见原因:内容在压缩 XML、图片或 sharedStrings
排查动作:解压后查所有目录和 media
常见原因:stream 被压缩或编码
排查动作:用 --filter、mutool clean -d
常见原因:VBA 混淆或字符串拼接
排查动作:olevba,手动还原字符串
常见原因:不是完整文件或需要裁剪
排查动作:查文件头、偏移、长度
常见原因:PDF 增量更新保留旧内容
排查动作:查多个 xref/trailer 和 EOF
迷你案例
题目给 report.pdf,页面只有普通说明。验证:
pdfid.py report.pdf
pdf-parser.py report.pdf --type /EmbeddedFile发现对象 18 0 obj 是嵌入文件,提取:
pdf-parser.py report.pdf --object 18 --filter --raw > hidden.bin
file hidden.binfile 显示为 ZIP,解压后得到 flag.txt。这说明 flag 在 PDF 附件对象中,页面内容只是掩护。