| ID: | 17007 |
|---|---|
| 标题: | [XMAN2018排位赛]file |
| 描述: | 磁盘镜像分析 |
| 类型: | Misc |
| 网站: | None |
| 题目链接: | https://buuoj.cn/challenges#[XMAN2018%E6%8E%92%E4%BD%8D%E8%B5%9B]file |
| 赛事: | [XMAN2018排位赛] |
| 年度: | 2018 |
| Flag值: | flag{fugly_cats_need_luv_2} |
| writeup: |
第一步:识别文件类型
attachment.img → 10MB (10,485,760 字节) 通过分析镜像文件的 魔数(Magic Bytes) : - 偏移量 1080 处的两个字节是 53 ef (小端序为 0xef53 ) - 这是 EXT2/3/4 文件系统 的标志性特征 💡 知识点 :Linux EXT 文件系统在第 1080 字节处存储了超级块(Superblock),其中包含魔术字 0xEF53 用于标识文件系统类型。 ### 第二步:提取文件系统内容 使用 7z (NanaZip) 可以直接读取 EXT 镜像 💡 知识点 :EXT 文件系统挂载点显示为 /tmp/forensics ,这暗示这是一道取证题。 ### 第三步:尝试常规隐写方法 我依次检查了以下可能性: 1. EXIF 元数据 - 检查 JPEG 的 APP 段,未发现 flag 2. GIF 注释块 - 检查 GIF 的 Comment Extension,都是二进制数据 3. LSB 隐写 - 提取 GIF 帧的最低有效位,无可读字符串 4. 文件末尾附加数据 - 末尾都是 0 填充 ### 第四步:全局字符串搜索 当常规方法都无效时, 对整个镜像进行字符串搜索 是取证题的通用技巧: # 搜索所有长度 >= 10 的可打印 ASCII 字符串 for byte in data: if 32 <= byte < 127: # 可打印ASCII范围 current += bytes([byte]) else: if len(current) >= 10: strings.append(current) current = b'' 搜索发现了关键线索 :Offset 0x8833ca: f l a g { f u g l y _ c a t s _ n e e d _ l u v _ 2 } 第五步:分析 Flag 隐藏方式 Flag 隐藏在镜像的 未分配空间/元数据区域 :位置:0x8833ca (约 8.9MB 处) 格式:每个字符之间用空格分隔 原始:f l a g { f u g l y _ c a t s _ n e e d _ l u v _ 2 } 去除空格:flag{fugly_cats_need_luv_2} |