题目:misc1(话不多说,看图片)
分类:Misc / 图片隐写
难度:★☆☆☆☆(入门)
考点:JPEG 文件结构、strings 搜索、文件末尾附加数据(append data)
一、题目描述
题目只有一句话:"话不多说,看图片",附件是一张 misc1.jpg:

图片是一张恶搞兔子表情包,肉眼看没有任何异常。flag 显然藏在图片文件本身。
二、解题步骤
1. 确认真实文件类型
bash
file misc1.jpg
输出:
misc1.jpg: JPEG image data, JFIF standard 1.01, aspect ratio, density 1x1,
segment length 16, baseline, precision 8, 440x444, components 3
确认是一张正常的 440×444 JPEG 图片,扩展名没有造假。
2. strings 搜索可读字符串
图片隐写的第一步通常是用 strings 提取文件中的可打印字符,往往能直接发现明文 flag:
bash
strings -n 5 misc1.jpg | grep -iE "flag|key|pass|\{|ctf"
直接命中:
flag IS flag{stego_is_s0_bor1ing}
flag 就这么出来了。
3. 分析 flag 是怎么藏进去的
为了搞清楚原理,我们定位 flag 在文件中的位置,并查看文件末尾:
bash
# 文件总大小
stat -c%s misc1.jpg # 25506
# 定位 flag 字符串偏移
grep -abo "flag IS" misc1.jpg # 25473:flag IS
用 Python 查看文件末尾的原始字节:
python
data = open('misc1.jpg','rb').read()
print(data[-40:])
# b'\xff\xd9---\xa1\xb7flag IS flag{stego_is_s0_bor1ing}'
print('最后一个 FFD9 偏移:', data.rfind(b'\xff\xd9')) # 25466
可以看到:
-
JPEG 的结束标记是
FFD9(EOI,End Of Image),它出现在偏移 25466; -
而 flag 文本从偏移 25473 开始,正好位于
FFD9之后; -
也就是说,出题人在一张正常 JPEG 的结束符后面直接追加了一段明文文本:
... FF D9 2D 2D 2D A1 B7 "flag IS flag{stego_is_s0_bor1ing}"
↑ 结束符 ↑ 追加的内容
图片解码器读到 FFD9 就认为图片已经结束,所以图片正常显示、肉眼毫无异常;但这段附加数据仍然存在于文件中,用 strings 或查看十六进制末尾就能发现。
三、得到 flag
flag{stego_is_s0_bor1ing}
stego_is_s0_bor1ing即 "stego is so boring(隐写真无聊)",其中用数字0代替字母o、1代替i,是 CTF 中常见的 leetspeak(字符替换)写法。
四、知识点讲解
4.1 JPEG 文件结构
一个基础 JPEG 文件由若干"段(segment)"组成,关键标记如下:
| 标记 | 名称 | 含义 |
|---|---|---|
FF D8 |
SOI | Start Of Image,图片开始 |
FF E0 |
APP0 | JFIF 应用数据段 |
FF DA |
SOS | Start Of Scan,扫描数据开始 |
FF D9 |
EOI | End Of Image,图片结束 |
重点:解码器读到 FF D9 就认为图片结束,其后的任何数据都不会被当作图片渲染。 因此在 FF D9 之后追加文件或文本,是最常见的初级隐写手法。
类似地:
- PNG 的结束标记是
IEND(在49 45 4E 44 AE 42 60 82之后); - GIF 结束标记是
3B(;)。
4.2 strings 命令
strings 用于提取文件中的可打印字符序列:
bash
strings misc1.jpg # 提取所有可打印字符串
strings -n 5 misc1.jpg # 只显示长度 >= 5 的字符串
strings misc1.jpg | grep flag # 配合 grep 过滤关键字
它对"明文追加""注释藏 flag"这类题目极其有效,是图片/二进制 Misc 题的首选命令之一。
4.3 文件附加数据(append data)
在文件末尾追加数据,常见的追加内容有:
- 明文 flag / 提示文本;
- 一个完整的 ZIP/RAR(常用
binwalk -e或foremost分离); - 另一张图片;
- 一段需要进一步解码的 Base64 / Hex。
通用排查命令:
bash
xxd misc1.jpg | tail -20 # 直接看文件末尾
binwalk misc1.jpg # 自动识别附加/嵌入的文件
binwalk -e misc1.jpg # 分离提取
foremost misc1.jpg # 文件雕刻
4.4 图片隐写的标准排查顺序
file确认真实类型 →strings搜明文 →binwalk/foremost分离附加文件 →exiftool看元数据 → 看 hex 头尾(结束符后是否有数据)→ 按格式上专用工具(PNG 用 zsteg、JPG 用 steghide)。
本题在第 2 步 strings 就直接拿到了 flag。
五、安全启示
- 把敏感信息直接追加到图片文件末尾,没有任何保密性,一条 strings 命令就能发现;
- 即使把追加内容做 Base64、Hex 等编码,也只是"多一步解码",依然等于明文;
- 真正需要保护的信息应使用正规加密手段并妥善保管密钥,而不是藏在文件尾部。
六、总结
本题是典型的"文件末尾追加数据"隐写:
正常 JPEG + 结束符
FFD9后追加明文 flag → 图片显示正常,但strings一搜即出。
核心收获:
- 图片隐写第一步先
file+strings,很多签到题在这一步就结束; - 牢记 JPEG 结束符
FFD9、PNG 结束符IEND,结束符之后的数据就是"附加数据"; - 学会用
xxd/010 Editor 看文件末尾,用binwalk分离附加文件。
Flag:
flag{stego_is_s0_bor1ing}
版权声明
- 本文为个人 CTF 学习笔记(Writeup),题目版权归其主办方所有。
- 本文的文字分析、整理与总结部分为本人原创,转载请注明出处。
- 本文仅用于网络安全学习与研究,请勿用于任何未授权测试;如内容涉及侵权,请联系本人删除。