Mad Cow APT 闪存镜像取证 Writeup:从 .cow 签名雕刻到 PNG 解密取旗
发布时间:2026/10/27 2:05:49 锦皓数字建站

题目The Mad Cow APTbyuctf 风格 forensics 题Flagbyuctf{incredi-bull}作战任务m_mvo0h87t_vfpiqd· 模式 CTF · 授权边界仅本地文件只读静态分析结果solved约 2 分钟 / 4 步全部证据可从原始镜像复现1. 结论速览项目值Flagbyuctf{incredi-bull}Flag 来源Mad Cow.001偏移0xE00000处雕刻出的.cow文件 → 解密 PNG 中部文字核心方法由参考样本推导.cow字节签名 → 全镜像魔术字节扫描 → 头/尾签名夹出文件范围 → XOR 0xFF 解密 → PNG CRC 校验 → 读图关键文件found.cow587,966 BSHA256ffa278cc…、found.png915×526 RGBASHA256bdc19ccb…镜像 SHA25653e653a64b41a036cc7a80d43dfec3cd933ac10e648c791ea55a5988624eae9c题目叙事中的“随机数据擦除”“损坏的闪存镜像”“自定义 .cow 文件类型”在本例中对应为无文件系统元数据可用只能靠文件自身字节特征做 carving再按官方解密器语义还原 PNG。题面明确说明不需要逆向cow_decryptor.py本报告只利用其输入/输出特征XOR 0xFF 修正 PNG 头尾不依赖其内部实现细节。2. 附件现场a73b556c3132-steak.zip20 MiBSHA256a73b556c3132…安全解压后得到src/四个文件文件大小作用SHA256前 16 位Mad Cow.00125,165,824 B 24 MiB取证镜像现场53e653a64b41a036Cow 1.cow666,882 B参考样本 1adeb25177cc04086Cow 2.cow948,841 B参考样本 230468196b5a985f5cow_decryptor.py2,583 B官方解密器a09359a96e3b739f完整哈希清单一律见hashes.txt。原始文件全流程只读未做任何修改。3. 从参考样本推导.cow判定签名3.1 观察样本头尾Cow 1.cow head: 13 37 be ef f2 f5 e5 f5 ff ff ff f2 b6 b7 bb ad ... Cow 2.cow head: 13 37 be ef f2 f5 e5 f5 ff ff ff f2 b6 b7 bb ad ... Cow 1.cow tail: ... ff ff ff ff b6 ba b1 bb 4d 6f 6f 6f Cow 2.cow tail: ... ff ff ff ff b6 ba b1 bb 4d 6f 6f 6f两个样本的头、尾完全一致且头 4 字节13 37 BE EF是明显的 leet 标记“1337 BEEF”尾 4 字节4D 6F 6F 6F是 ASCIIMooo。进一步对照cow_decryptor.py的输出语义解密器把所有字节 XOR 0xFF然后强制修正前 4 字节为 PNG magic89 50 4E 47强制修正最后 4 字节为 PNG IEND CRCAE 42 60 82。因此.cow文件里第 0–3 与最后 4 字节是解密器会覆盖的“标记/填充”与 PNG 内容无关中间的字节才是0xFF ^ PNG。反推可得完整签名位置预期字节含义文件头13 37 BE EFLEET magic偏移 4 起F2 F5 E5 F5 FF FF FF F2 B6 B7 BB AD0xFF ^PNG magic 第 5–8 字节 IHDR 长度 IHDR尾部FF FF FF FF B6 BA B1 BB0xFF ^IEND 长度 0 IEND末 4 字节4D 6F 6F 6FMooo尾部标记3.2 镜像布局实测64 个 1 MiB 块逐块计算 Shannon 熵结果非常干净偏移区间大小熵说明0x0–0x120000018 MiB每 MiB 均 ≈ 8.000高熵随机数据模拟未完成的随机擦除0x1200000–0x18000006 MiB0.000全零镜像尾部零填充0xE00000–0xE8F8BE587,966 B结构完整唯一存活的.cow文件镜像中不存在 FAT/NTFS 文件系统签名FAT12/16/32、MSWIN、分区表均为 0 命中也没有 ZIP/PDF/JPEG/GIF/ELF 等常见文件魔数。也就是说擦除已破坏元数据常规文件系统恢复路径不可用但文件内容本身的签名仍然可被全盘扫描命中。4. 镜像取证签名扫描 → 定位 → 雕刻4.1 扫描命令与命中importre dataopen(r...\src\Mad Cow.001,rb).read()# 25,165,824 B只读magic[m.start()forminre.finditer(b\x13\x37\xbe\xef,data)]iend_xor[m.start()forminre.finditer(b\xff\xff\xff\xff\xb6\xba\xb1\xbb,data)]mooo[m.start()forminre.finditer(bMooo,data)]magic : [0xe00000] iend_xor : [0xe8f8b2] Mooo : [0xe8f8ba]三个特征各只有 1 处命中且相互吻合直接给出唯一候选起点 0xE00000 终点 0xE8F8BA 4 0xE8F8BE 长度 0xE8F8BE - 0xE00000 587,966 字节4.2 雕刻found.cow 587,966 B SHA256 ffa278cc7ca58855b0c73b0ccb456302a9934839f6904fbe80e47be1cc6faa52雕刻结果头尾与参考样本同构13 37 BE EF … ff ff ff ff b6 ba b1 bb 4d 6f 6f 6f。这一步不依赖文件系统、不依赖文件大小先验只依赖字节特征即使首 4 字节被擦除破坏仍可用偏移 4 起的 12 字节 body 头签名再次交叉验证本镜像命中位置0xE00004。5. 解密与 PNG 完整性校验5.1 官方解密器复现python cow_decryptor.py-i found.cow-o found_official.pngfound.png SHA256 bdc19ccb97371e23345fa94c28245499fc2ccb0f80d45f403aae862b619827fc found_official.png SHA256 bdc19ccb97371e23345fa94c28245499fc2ccb0f80d45f403aae862b619827fc自行实现的0xFF XOR 修 PNG 头/IEND CRC与官方脚本输出逐字节一致说明雕刻范围没有多取或少取字节。5.2 PNG 结构校验chunk 0 IHDR len13 offset0x8 chunk 1 sRGB len1 offset0x21 chunk 2 gAMA len4 offset0x2E chunk 3 pHYs len9 offset0x3E chunk 4..12 IDAT9 个 offset0x53 … 0x80004 chunk 13 IEND len0 offset0x8F8B2全部 14 个 chunk 的 CRC32全部通过IEND 之后0 个 trailing 字节文件恰好结束在 PNG 末尾尺寸915 × 526RGBA。5.3 读取 Flag解密后的 PNG 中部文字即为 flag完整图片见found.png。flag 为byuctf{incredi-bull}不含 0 1 3 4 5 6 7 8 9 ! ~ | $等 leet 变形字符无需 normalize仍按要求用cyberops_flag提取校验1 个 flag无候选变形。6. 失败路径与被排除项如实记录尝试路径结果说明按文件系统恢复FAT/NTFS 元数据排除镜像无任何 FAT/NTFS/分区表签名前 18 MiB 为高熵随机数据依赖文件大小/扩展名定位排除镜像内无.cow文件名/目录项且文件大小为未知先验只能靠内容签名常见容器魔数扫描ZIP/7z/RAR/PDF/JPEG/GIF/ELF/PE/SQLite/gzip…无有效命中仅MZ/BZh等随机数据中的偶然命中无真实文件第二个.cow文件不存在magic / body header / IEND 尾 / Mooo 四类签名全镜像各仅 1 处命中反向工程cow_decryptor.py不需要题面明确说明实际只用到“XOR 0xFF 修头尾”的输入输出语义图像隐写LSB/附加数据不需要flag 直接以可见文字出现在 PNG 中部chunk 结构与 CRC 均无异常、无 trailing 数据7. 时间线实测时间Asia/Shanghai事件23:57:35任务启动附件预分析完成安全解压到独立目录23:58:20确认src/四件套与大小23:58:55.cow格式确认1337BEEF头 Mooo尾 XOR 0xFF23:59:30全镜像签名扫描命中0xE0000023:59:45尾签名 Mooo 确认范围 587,966 B00:00:10雕刻found.cow00:00:40官方解密器输出found.png00:01:05PNG 全部 chunk CRC 校验通过00:01:20读出 flagbyuctf{incredi-bull}00:03:00哈希固化、Archify 图形、报告归档8. 可复现脚本solve.py纯标准库无第三方依赖只读打开镜像完整实现“签名扫描 → 范围定位 → 雕刻 → 解密 → PNG CRC 校验”python solve.pyF:\DSH\data\cyberops\artifacts\extracted\a73b556c3132-a73b556c3132-steak.zip-2\src\Mad Cow.001recovered预期输出关键行[*] magic 13 37 be ef hits: [0xe00000] [] carved 0xe00000..0xe8f8be len587966B cow recovered\cow_00e00000.cow sha256ffa278cc7ca58855b0c73b0ccb456302a9934839f6904fbe80e47be1cc6faa52 png recovered\cow_00e00000.png sha256bdc19ccb97371e23345fa94c28245499fc2ccb0f80d45f403aae862b619827fc png validTrue size915x526 chunks_crcOK哈希一致性复核Get-FileHash…\src\Mad Cow.001-Algorithm SHA256# 53e653a6…Get-FileHash.\found.cow-Algorithm SHA256# ffa278cc…Get-FileHash.\found.png-Algorithm SHA256# bdc19ccb…9. 图形附件Archify图文件说明架构图镜像布局与 .cow 证据链madcow-layout.html镜像三区布局、签名判定、雕刻→解密→取旗的数据链时序图定位 → 雕刻 → 解密 → 取旗madcow-recovery.html每一步的输入/输出与校验点含 SHA256 与偏移时间线约 2 分钟取旗madcow-run.html实测执行顺序与耗时节点Asia/Shanghai生成方式archify doctor→ 编写candidate.json→archify render type candidate.json name.html --quality showcase静态校验archify check三张图全部ok: true9 项检查single_svg / finite_svg / orthogonal_arrows / label_route_clearance / relationship_crossings / relationship_corridors / container_border_runs / route_rhythm / legend_clearance全通过composition.status passissues: []人工视觉复核由于 DSH elevated 会话中 Chrome/Edge 去提权重启导致archify finalize的 browser-check 无法稳定运行spawn EINVAL/ DevTools pipe 断开本报告按替代方案执行render check通过后用 Playwright 驱动 Chromium 以 1600px 视口逐图截图复核截图文件preview.png已就近内嵌于第 3/5/7 节finalize browser-check未跑特此如实披露图形仅作辅助不替代第 4–5 节的原始命令、哈希与证据。10. 附录10.1 环境与工具Python 3标准库struct/zlib/hashlibPIL/Pillow 仅用于读图与裁剪Playwright Chromium 用于图形截图复核Archify CLI 用于交互式图形生成与静态校验。全流程仅本地静态分析镜像以只读方式读取未修改任何原始文件。10.2 成果文件文件说明found.cow由镜像0xE00000雕刻的原始.cow文件found.png/found_official.png解密 PNG两者逐字节一致flag_crop.pngFlag 区域裁剪放大 2×solve.py可复现求解脚本hashes.txt全部文件 SHA-256 与关键偏移清单10.3 最终答案byuctf{incredi-bull}
锦
锦皓数字建站
深耕本土企业品牌数字化升级,专注原创端正雅致商务官网,从视觉设计到稳定运维全程保驾护航。