从EML到FlagBUUCTF俄罗斯套娃题全流程实战解密指南1. 初探EML文件邮件中的秘密宝藏当你第一次拿到这个CTF题目时可能会对.eml文件格式感到陌生。EML实际上是Outlook等邮件客户端使用的标准邮件存储格式它完整保留了邮件的所有元素——包括正文、附件和元数据。在Windows系统中最简单的查看方式就是直接用记事本打开但更专业的做法是使用邮件客户端或专用解析工具。提示如果系统没有安装邮件客户端可以尝试使用在线EML查看器或Python的email模块进行解析。通过分析附件中的eml文件我们发现两个关键组件Matry_Oshka.key- PGP私钥文件hack.pgp- 加密的PGP文件但真正的第一个突破口其实隐藏在邮件头中。在Face字段处有一段Base64编码的数据import base64 face_data BASE64编码字符串 # 替换为实际数据 decoded base64.b64decode(face_data).decode(utf-8) print(decoded)解码这段数据会得到一个二维码图片的URL扫描后将获得密码h4ck_the_plan3t。这个密码将成为我们后续解密PGP文件的关键。2. PGP解密实战从密钥导入到文件提取2.1 PGP工具的选择与使用虽然GnuPG(GPG)是命令行下的标准工具但对于CTF比赛来说PGPTool的图形界面更加友好。以下是使用PGPTool解密的详细步骤访问 PGPTool官网点击Key ring → Import PGP Key选择Matry_Oshka.key文件在弹出的密码框中输入h4ck_the_plan3t回到主界面选择Decrypt功能上传hack.pgp文件注意如果导入密钥时遇到错误检查密钥文件是否完整或者尝试用文本编辑器打开.key文件确认其格式正确。2.2 解密后的文件处理成功解密后我们会得到一个名为file.bin的文件。使用file命令检查其类型file file.bin输出显示这是一个lzip压缩文件。但直接使用lzip解压会失败因为文件头部有多余数据。我们需要用十六进制编辑器(如010 Editor)删除前10个字节操作步骤具体命令/操作1. 删除前10字节在010 Editor中选中前10字节并删除2. 保存修改另存为clean_file.bin3. 解压文件lzip -d clean_file.bin解压后将得到file.bin.out实际上是一个PDF文档。3. 隐写术分析从壁纸到隐藏数据3.1 PDF中的秘密打开PDF后里面只有一张Windows XP的经典壁纸Bliss。这显然不是终点我们需要提取其中的图片进行分析from PyPDF2 import PdfFileReader pdf PdfFileReader(open(file.bin.out, rb)) for page in pdf.pages: for obj in page[/Resources][/XObject].values(): if obj[/Subtype] /Image: with open(xp_wallpaper.png, wb) as f: f.write(obj._data)3.2 Stegsolve的高级应用使用Stegsolve分析提取出的图片重点关注以下通道Blue通道常被用于LSB隐写Red/Green通道差异可能隐藏不同信息Alpha通道如果存在透明度信息在Blue通道0位平面我们发现了类似二维码的结构。但与原始Windows XP壁纸对比后确认这是人为添加的隐藏信息。将两张图片进行像素级对比from PIL import Image, ImageChops original Image.open(bliss_original.png) modified Image.open(xp_wallpaper.png) diff ImageChops.difference(original, modified) diff.show()差异图像中清晰地显示出二维码图案解码后得到一段特殊的Base64编码数据。4. Base64变种与7z文件提取4.1 非标准Base64解码获取的Base64数据包含特殊字符-这是非标准变种。标准Base64使用和/作为第62和63个字符而这里显然做了替换。Python的base64模块支持通过altchars参数处理这种情况from base64 import b64decode data /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4ELCAORdABhgwwZfNTLh1bKR4pwkkcJw0DSEZd2BcWATAJkrMgnKT8nBgYQaCPtrzORiOeUVq7DDoe9feCLt9PG-MT9ZCLwmtpdfvW0n17pie8v0h7RS4dO/yb7JHn7sFqYYnDWZere/6BI3AiyraCtQ6qZmYZnHemfLVXmCXHan5fN6IiJL7uJdoJBZC3Rb1hiH1MdlFQ/1uOwaoglBdswAGo99HbOhsSFS5gGqo6WQ2dzK3E7NcYP2YIQxS9BGibr4Qulc6e5CaCHAZ4pAhfLVTYoN5R7l/cWvU3mLOSPUkELK6StPUBd0AABBU17Cf970JQABgALDhQEApzo4PbHEZ/sCAAAAAARZWg with open(flag.7z, wb) as f: decoded b64decode(data, altchars-/) f.write(decoded)关键点解析altchars-/表示用-替换标准中的用/替换标准中的/虽然第二个替换是冗余的解码后的数据实际上是7z压缩文件的二进制格式4.2 最终Flag提取使用7zip解压得到的文件7z x flag.7z解压后得到的二进制文件可以使用CyberChef进行快速分析。在Magic模式下CyberChef会自动识别文件格式并提取可读内容最终我们获得了flagflag{delat_iz_muhi_slona}5. 解题技巧与常见问题5.1 工具链准备为了高效解决此类CTF题目建议准备以下工具集工具类别推荐工具主要用途文件分析file, binwalk识别文件真实类型十六进制编辑010 Editor, HxD手动修改文件结构隐写分析Stegsolve, zsteg图像隐写分析加解密GPG, PGPToolPGP加密解密编码转换CyberChef各种编码转换和分析5.2 常见错误排查PGP解密失败检查密钥文件是否完整确认密码完全正确注意大小写和特殊字符尝试不同的PGP工具GPG vs PGPToolBase64解码问题注意非标准变种字符替换、填充缺失等尝试不同的altchars组合检查解码后的文件头是否符合预期隐写分析技巧尝试不同的位平面组合对比原始图像和修改后的图像检查EXIF等元数据在实战中我经常遇到Base64变种解码的问题。有一次比赛中的Base64数据使用了!和作为替换字符花了我近一个小时才意识到这一点。关键是要仔细观察数据中的特殊字符并尝试不同的替换组合。
从一封神秘邮件到最终Flag:手把手复现BUUCTF那道‘俄罗斯套娃’CTF题(含PGP解密、Stegsolve、Base64变种处理)
从EML到FlagBUUCTF俄罗斯套娃题全流程实战解密指南1. 初探EML文件邮件中的秘密宝藏当你第一次拿到这个CTF题目时可能会对.eml文件格式感到陌生。EML实际上是Outlook等邮件客户端使用的标准邮件存储格式它完整保留了邮件的所有元素——包括正文、附件和元数据。在Windows系统中最简单的查看方式就是直接用记事本打开但更专业的做法是使用邮件客户端或专用解析工具。提示如果系统没有安装邮件客户端可以尝试使用在线EML查看器或Python的email模块进行解析。通过分析附件中的eml文件我们发现两个关键组件Matry_Oshka.key- PGP私钥文件hack.pgp- 加密的PGP文件但真正的第一个突破口其实隐藏在邮件头中。在Face字段处有一段Base64编码的数据import base64 face_data BASE64编码字符串 # 替换为实际数据 decoded base64.b64decode(face_data).decode(utf-8) print(decoded)解码这段数据会得到一个二维码图片的URL扫描后将获得密码h4ck_the_plan3t。这个密码将成为我们后续解密PGP文件的关键。2. PGP解密实战从密钥导入到文件提取2.1 PGP工具的选择与使用虽然GnuPG(GPG)是命令行下的标准工具但对于CTF比赛来说PGPTool的图形界面更加友好。以下是使用PGPTool解密的详细步骤访问 PGPTool官网点击Key ring → Import PGP Key选择Matry_Oshka.key文件在弹出的密码框中输入h4ck_the_plan3t回到主界面选择Decrypt功能上传hack.pgp文件注意如果导入密钥时遇到错误检查密钥文件是否完整或者尝试用文本编辑器打开.key文件确认其格式正确。2.2 解密后的文件处理成功解密后我们会得到一个名为file.bin的文件。使用file命令检查其类型file file.bin输出显示这是一个lzip压缩文件。但直接使用lzip解压会失败因为文件头部有多余数据。我们需要用十六进制编辑器(如010 Editor)删除前10个字节操作步骤具体命令/操作1. 删除前10字节在010 Editor中选中前10字节并删除2. 保存修改另存为clean_file.bin3. 解压文件lzip -d clean_file.bin解压后将得到file.bin.out实际上是一个PDF文档。3. 隐写术分析从壁纸到隐藏数据3.1 PDF中的秘密打开PDF后里面只有一张Windows XP的经典壁纸Bliss。这显然不是终点我们需要提取其中的图片进行分析from PyPDF2 import PdfFileReader pdf PdfFileReader(open(file.bin.out, rb)) for page in pdf.pages: for obj in page[/Resources][/XObject].values(): if obj[/Subtype] /Image: with open(xp_wallpaper.png, wb) as f: f.write(obj._data)3.2 Stegsolve的高级应用使用Stegsolve分析提取出的图片重点关注以下通道Blue通道常被用于LSB隐写Red/Green通道差异可能隐藏不同信息Alpha通道如果存在透明度信息在Blue通道0位平面我们发现了类似二维码的结构。但与原始Windows XP壁纸对比后确认这是人为添加的隐藏信息。将两张图片进行像素级对比from PIL import Image, ImageChops original Image.open(bliss_original.png) modified Image.open(xp_wallpaper.png) diff ImageChops.difference(original, modified) diff.show()差异图像中清晰地显示出二维码图案解码后得到一段特殊的Base64编码数据。4. Base64变种与7z文件提取4.1 非标准Base64解码获取的Base64数据包含特殊字符-这是非标准变种。标准Base64使用和/作为第62和63个字符而这里显然做了替换。Python的base64模块支持通过altchars参数处理这种情况from base64 import b64decode data /Td6WFoAAATm1rRGAgAhARwAAAAQz1jM4ELCAORdABhgwwZfNTLh1bKR4pwkkcJw0DSEZd2BcWATAJkrMgnKT8nBgYQaCPtrzORiOeUVq7DDoe9feCLt9PG-MT9ZCLwmtpdfvW0n17pie8v0h7RS4dO/yb7JHn7sFqYYnDWZere/6BI3AiyraCtQ6qZmYZnHemfLVXmCXHan5fN6IiJL7uJdoJBZC3Rb1hiH1MdlFQ/1uOwaoglBdswAGo99HbOhsSFS5gGqo6WQ2dzK3E7NcYP2YIQxS9BGibr4Qulc6e5CaCHAZ4pAhfLVTYoN5R7l/cWvU3mLOSPUkELK6StPUBd0AABBU17Cf970JQABgALDhQEApzo4PbHEZ/sCAAAAAARZWg with open(flag.7z, wb) as f: decoded b64decode(data, altchars-/) f.write(decoded)关键点解析altchars-/表示用-替换标准中的用/替换标准中的/虽然第二个替换是冗余的解码后的数据实际上是7z压缩文件的二进制格式4.2 最终Flag提取使用7zip解压得到的文件7z x flag.7z解压后得到的二进制文件可以使用CyberChef进行快速分析。在Magic模式下CyberChef会自动识别文件格式并提取可读内容最终我们获得了flagflag{delat_iz_muhi_slona}5. 解题技巧与常见问题5.1 工具链准备为了高效解决此类CTF题目建议准备以下工具集工具类别推荐工具主要用途文件分析file, binwalk识别文件真实类型十六进制编辑010 Editor, HxD手动修改文件结构隐写分析Stegsolve, zsteg图像隐写分析加解密GPG, PGPToolPGP加密解密编码转换CyberChef各种编码转换和分析5.2 常见错误排查PGP解密失败检查密钥文件是否完整确认密码完全正确注意大小写和特殊字符尝试不同的PGP工具GPG vs PGPToolBase64解码问题注意非标准变种字符替换、填充缺失等尝试不同的altchars组合检查解码后的文件头是否符合预期隐写分析技巧尝试不同的位平面组合对比原始图像和修改后的图像检查EXIF等元数据在实战中我经常遇到Base64变种解码的问题。有一次比赛中的Base64数据使用了!和作为替换字符花了我近一个小时才意识到这一点。关键是要仔细观察数据中的特殊字符并尝试不同的替换组合。