BUUCTF-Misc-揭秘7z与vmdk中的隐藏flag

📅 发布时间:2026/7/5 10:11:32 👁️ 浏览次数:
BUUCTF-Misc-揭秘7z与vmdk中的隐藏flag
1. 从一张“普通”图片开始你的flag可能就藏在眼皮底下拿到一个BUUCTF的Misc题目附件常常就是一张图比如一个表情包或者一段风景照。新手一看可能直接扔进Stegsolve或者binwalk扫一遍没发现异常就懵了。我刚开始玩CTF的时候也这样总觉得隐藏信息非得是像素点里嵌着二进制或者LSB最低有效位藏着秘密。后来踩坑多了才发现出题人的脑洞往往比你想象的要“物理”得多。就拿这次遇到的这个场景来说题目给了一张图用file命令一看确实是标准的JPEG或者PNG。但经验告诉我在CTF里特别是Misc杂项任何文件都不能只看表面。“面具下的flag”这个标题本身就很有暗示性——面具之下意味着有多层包裹。我的第一反应是这张图很可能是个“容器”它肚子里还藏着别的文件。这种技术通常叫“文件拼接”或者“隐写术中的文件附加”原理很简单就是把另一个文件比如一个压缩包的二进制数据直接追加到图片文件的末尾。因为图片查看器在读取文件时会按照图片格式的规范读到文件结束标记就停止渲染后面多出来的数据它一概不管所以你看图还是正常的图但用文本编辑器或者十六进制工具拉到最后可能就看到另一片天地了。所以面对一张图别急着上高级隐写工具。先来点“常规检查”file命令确认文件真实类型。有时扩展名是.jpg实际可能是个zip。binwalk命令这是我最喜欢的初步侦察兵。直接binwalk -e 图片文件名。-e参数是自动提取extract它发现的所有内嵌文件。如果图片后面粘了个压缩包binwalk很大概率能把它识别并抽出来。strings命令快速查看文件中的可打印字符串。strings 图片文件名 | grep -i flag有时候会有意外惊喜可能flag明晃晃地就在注释里。十六进制查看用xxd或者hexdump或者图形化的ghex直接翻到文件末尾看看有没有像PKZip文件头、Rar!RAR文件头、7z7z文件头这样的魔术字magic bytes。在这个具体的题目里我实测用binwalk可能就能直接分离出东西。但如果出题人做得更隐蔽或者文件结构有点特别我们就需要更专业的工具——foremost。2. 利器出鞘用foremost进行精确文件分离当binwalk没能自动提取出我们想要的东西时或者我们想进行更彻底、更可控的分离时foremost就该上场了。你可以把foremost理解为一个更“固执”的文件雕刻工具。它不关心文件扩展名是什么它只按照内置的、已知的数百种文件类型的头部header和尾部footer签名在整个文件的二进制流里进行搜索和切割。只要找到匹配的头部它就认为一个新的文件开始了然后一直抓到对应的尾部把这段数据单独保存成一个文件。在Kali Linux里foremost通常是预装的。如果没有安装也很简单sudo apt install foremost。它的基本用法非常直接foremost -i 可疑文件.jpg -o 输出目录名-i指定输入文件。-o指定输出目录foremost会把提取出的文件按类型如jpg、zip、pdf等分类放到这个目录的子文件夹里。执行后它会哗啦啦地扫描然后告诉你它找到了多少种类型的文件分别有多少个。接下来你就去输出目录名下翻看就行了。比如audit.txt是扫描报告zip文件夹里就放着它挖出来的所有zip归档。这里有个很重要的实战细节有时候foremost提取出来的压缩包可能是损坏的。这不一定是你操作错了而可能是原始文件在拼接时或者foremost在根据签名切割时边界没卡得那么精准。遇到这种情况别慌先尝试用7z、unzip或binwalk -e再对这个提取出的文件操作一次。很多时候压缩工具比我们想象的要健壮能自动修复一些小问题。如果不行再回头用十六进制编辑器手动调整一下文件头尾。在这个题目中使用foremost对下载的图片进行分析成功分离出了一个隐藏的压缩文件。这验证了我们最初的猜想图片只是个“面具”真正的挑战在里面的压缩包。这一步的成功是整个解题流程的基石它把我们从图像隐写的复杂分析引向了更具体的文件分析领域。3. 深入压缩包当7z遇到vmdk从图片里分离出压缩包后解压一看里面是一个.vmdk文件。对于不熟悉虚拟化技术的小伙伴来说这个后缀可能有点陌生。VMDK是VMware Virtual Machine Disk的缩写简单说它就是VMware虚拟机用的虚拟硬盘文件。你可以把它想象成一个完整的、格式化的“硬盘镜像”里面可能有分区表、文件系统如NTFS、EXT4以及存储的所有文件。为什么CTF题目喜欢用vmdk因为它能模拟一个真实的存储环境可以把flag藏在分区的间隙里、删除的文件里、磁盘的未分配空间里或者某个深层目录下考察你对磁盘映像的分析能力。处理vmdk我们有两种主流思路思路一挂载它像访问真实硬盘一样访问。如果你的系统是Linux并且安装了相关工具可以尝试挂载# 首先可能需要安装工具 sudo apt install qemu-utils # 将vmdk转换为raw格式有时直接挂载vmdk会出问题 qemu-img convert -f vmdk -O raw flag.vmdk flag.raw # 查看raw镜像的分区信息 fdisk -l flag.raw # 假设第一个分区从扇区2048开始计算偏移量扇区大小通常512字节 # 偏移量 2048 * 512 1048576 字节 # 创建挂载点并挂载 mkdir /mnt/flag_disk sudo mount -o loop,offset1048576 flag.raw /mnt/flag_disk挂载成功后你就可以像浏览普通文件夹一样进入/mnt/flag_disk去搜索flag了。用find、grep命令非常方便。思路二直接当压缩包解压。这是一个非常实用且常用的技巧很多虚拟磁盘格式如vmdk、vdi、qcow2其内部为了节省空间会使用压缩算法。而7z工具非常强大它内置了提取多种磁盘映像格式内容的能力。你可以把它看作一个“万能档案浏览器”。在Kali下使用7z命令解压vmdk7z x flag.vmdk -o./x是解压命令。flag.vmdk是你的输入文件。-o./指定输出目录为当前目录。这里特别注意-o和路径之间没有空格这是7z命令的一个常见“坑”写成-o ./会报错。执行这个命令后7z会像剥洋葱一样把vmdk这个容器里能直接访问的文件和文件夹都提取到当前目录。这通常包括磁盘的引导记录、分区表信息以及最重要的——文件系统里的文件。这比挂载更快捷尤其适合vmdk内只有一个简单文件系统的情况。在这个题目里使用7z x命令后我们直接得到了一个包含flag文件的目录结构省去了挂载的步骤。4. 脑洞大开的编码Brainfuck之谜解压vmdk后我们找到了两个文件或者文件的两部分拼凑起来可能是一段看起来极其诡异的字符串比如充满了 - . , [ ]这些符号别的什么都没有。新手一看可能又傻了这是乱码还是损坏了恭喜你遇到了著名的Brainfuck编程语言也叫Brainf**k。这其实是一种极简的、图灵完备的编程语言整个语言只有8个操作符。在CTF中它通常不是让你去写程序而是作为一种“编码”方式来隐藏信息。你需要做的是“解码”这段Brainfuck代码让它输出真正的flag。这8个操作符的含义是指针向右移动一格指针向左移动一格指针指向的字节值加一-指针指向的字节值减一.输出指针指向的单元内容作为ASCII字符,输入一个字节到指针指向的单元[如果指针指向的单元值为零则跳转到对应的]之后]如果指针指向的单元值不为零则跳转回对应的[之后手工去模拟一个Brainfuck解释器太费劲了我们肯定用现成的工具。有两种最快捷的方法方法一使用在线解密网站。就像题目中提到的 https://www.splitbrain.org/services/ook 注意Ook!是另一种类似的语言但该网站通常也支持Brainfuck。你只需要把那段奇怪的符号复制粘贴到输入框选择Brainfuck点击执行或解码它就会在输出框显示运行结果也就是flag。这是最快最省事的方法。方法二在本地用Python解码。如果你不想依赖网络或者题目环境离线用Python几行代码就能搞定。你需要安装一个叫brainfuck-interpreter的库或者直接用以下代码实现一个简单的解释器import sys def brainfuck_interpreter(code): tape [0] * 30000 # 经典脑容量30000个单元 ptr 0 output [] loop_stack [] jump_map {} # 预处理建立循环跳转映射 for i, op in enumerate(code): if op [: loop_stack.append(i) elif op ]: if not loop_stack: raise SyntaxError(Mismatched brackets) start loop_stack.pop() jump_map[start] i jump_map[i] start i 0 while i len(code): op code[i] if op : ptr 1 elif op : ptr - 1 elif op : tape[ptr] (tape[ptr] 1) % 256 elif op -: tape[ptr] (tape[ptr] - 1) % 256 elif op .: output.append(chr(tape[ptr])) elif op ,: # 对于解码通常不需要输入可以忽略或赋0 tape[ptr] 0 elif op [: if tape[ptr] 0: i jump_map[i] # 跳到匹配的]后 elif op ]: if tape[ptr] ! 0: i jump_map[i] # 跳回匹配的[后 i 1 return .join(output) # 假设你的brainfuck代码保存在变量或文件里 bf_code [-].........------.--------... flag brainfuck_interpreter(bf_code) print(解密后的flag是:, flag)运行这段Python脚本你就能在本地得到解码结果。在这个题目中将找到的两部分Brainfuck代码合并后使用在线网站或本地脚本进行解码最终得到了flagflag{N7F5_AD5_i5_funny!}。AD5很可能指的是AES或者ADS备用数据流的变体整句话大概是出题人调皮了一下说“广告真有趣”算是Misc题目常见的小幽默。5. 实战复盘与技巧延伸走完整个流程我们再来梳理一下关键点和可能遇到的“坑”以及一些可以举一反三的技巧。1. 工具链的灵活运用顺序很重要对于多层嵌套的题目binwalk - foremost - 7z - 编解码工具是一个经典流程。但不要死板如果binwalk没结果立刻换foremost或binwalk -Me递归提取。7z是神器除了vmdk7z还能直接浏览和解压很多格式如iso、dmg、rpm、deb甚至某些exe安装包。养成习惯遇到不认识的文件格式先用7z l 文件名看看里面有什么。字符串搜索是最后的法宝在任何一个阶段如果毫无头绪不妨用strings 文件名 | grep -i -E flag|key|secret|ctf|buu进行全局搜索也许flag就以明文形式藏在某个角落。2. 关于vmdk的深入玩法恢复删除的文件如果flag被删除了你可以使用testdisk、photorec这类工具对vmdk或转换后的raw镜像进行文件恢复。分析磁盘元数据使用mmls来自Sleuth Kit工具包可以清晰地查看磁盘的分区布局。使用fls可以列出文件系统里的文件包括已删除的条目。访问特定分区如果vmdk有多个分区7z可能只解压出第一个。这时就需要用前面提到的挂载方法或者用kpartx工具在Linux上映射所有分区。3. Brainfuck及其他编码的识别常见编码特征Brainfuck只有-.,[]这8种字符。Ook!以“Ook.”、“Ook?”、“Ook!”组合出现。摩斯电码由.和-组成通常有分隔符。Base64由大小写字母、数字、、/组成末尾可能有长度通常是4的倍数。十六进制由0-9a-f组成。URL编码大量%XX的形式。万能解码思路遇到看不懂的字符串先扔到CyberChef一个强大的在线编解码网站里让它自动检测Magic操作试试经常有奇效。4. 环境准备建议对于Misc方向的CTF玩家我建议维护一个自己的“工具库”。Kali Linux固然是集大成者但有些轻量化的组合也不错虚拟机或WSL安装Ubuntu然后手动安装关键工具binwalk、foremost、7z、python3-pip、steghide、exiftool、xxd。Windows用户可以用Git Bash或Cygwin提供Linux环境或者直接使用Windows版的工具如7-ZipGUI版也能浏览vmdk、HxD十六进制编辑器、Notepad查看各种编码。必备网站书签CyberChef、SplitBrain的Ook!解码器、各种Base64/编码转换网站、在线字频分析工具等。回过头看这道题它完美地串联了Misc的常见考点文件格式识别、文件分离、磁盘映像处理、古怪编码解码。没有特别偏门的密码学更多的是考察你对计算机文件系统的理解和工具使用的熟练度。这种题目做多了你就会形成一种“条件反射”看到任何文件都想用file和binwalk先捅一下看到任何字符串都会下意识地想它是不是某种编码。这种思维习惯才是CTF比赛带给我们的宝贵财富。下次再遇到“面具”你就知道该从哪里下手去揭开它了。