在CTF比赛中,misc方向是必考的一个方向,其中,图形隐写是最最常见的类型。
先从Misc开始入门,一般会借助CTF SHOW解题平台,解题,然后进行技巧总结。
目录
图片篇(基础操作)
misc1
misc2
misc3
misc4
图片篇(信息附加)
misc5
misc6
misc7
misc8
misc9
misc10
misc11
misc12
misc13
misc14
msic15
misc16
misc17
misc18
misc19
misc20
misc21
misc22
misc23
misc41
总结
文件伪装
文件附加数据
文件拼接
元数据隐写
编码转换隐写
图片篇(基础操作)
misc1
jie直接下载文件解压后打开图片就能看到flag。
misc2
解压文件打开misc2.txt,发现文件头格式
可以知道这是一个png文件,所以讲文件扩展名改为png就可以查看到flag。
misc3
解压文件,发现一个后缀为.bpg的文件,查看文件
发现文件头格式已经和文件后缀相对应,那么可以去寻找支持查看bpg图片的软件,例如BandiView或者Honeyview。
misc4
解压文件,发现六个文本文件,还是开始查看文件格式和后缀是否相对应:
可以看到每个文件的格式都不太一样,只需要将每个文件后缀名改成相对应的就能够查看到了。
图片篇(信息附加)
misc5
只有一个图片,显示:
那么还是照样查看这个文件的内容,发现在文件最后藏有flag
misc6
同样的,这里只有一张图片,打开也没有flag
cat查看这个文件的内容,先查看属性和后缀名有没有问题,大小有没有问题,这里都没有,那我们要去看看文件内容能不能发现什么。
发现内容太多,没有办法有效地查看内容,那我们可以利用grep命令查看是否包含有关“ctf”或者“flag”关键词的内容
-a:将二进制文件(比如jpg文件)当作文本文件处理,避免grep跳过二进制文件
-F:将搜索词当作固定字符串(非正则表达式)
当然,在Windows系统直接使用文件编辑器打开Ctrl+F搜索内容
misc7
跟misc6一样,过程都要来一遍,不要闲麻烦
misc8
解压后文件和上面的普通一样,一步步尝试下来,没有发现内容还有后缀名等有什么问题,这里要新认识到一个图片里面存在多个文件的解法。
这里是属于文件直接拼接(还有其他的隐藏方式后面应该会讲),将其他文件直接追加到图片的尾部,图片查看器会忽略多余数据,但工具可以提取。
接下来使用binwalk工具来分析是否包含多个文件
很明显,这里包含了两个图片文件,接下来尝试用binwalk工具进行分离
分解出一个_misc8.png.extracted文件夹,查看发现不是想要的
那么再使用foremost工具进行分解文件
生成一个output文件夹,但是打开这个output文件夹是没有发现文件的
这是因为生成的文件kali没有执行权限
那我们修改这个文件以及其子文件的权限
-R 用于递归地更改文件和目录的权限
权限通过八进制数字表示:4=读 (r),2=写 (w),1=执行 (x)
打开文件就看到flag了。
binwalk是基于文件头/尾签名进行扫描,它的处理文件能力比较弱,适用于快速检测是否存在内嵌文件
foremost是基于文件头和文件结构进行深度分析,处理分解能力强,适用于文件损坏或者碎片化时候,在binwalk分解失败时使用
misc9
跟misc6一样
misc10
跟misc8一样,使用binwalk检测内嵌文件并尝试分解,如果不行使用foremost进行分解,这里使用binwalk就可以分解成功了
misc11
前面跟misc9一样,先查看文件头没有问题,并且文件内容搜索不到flag,然后使用binwalk分析文件是否存在多个文件,这里出现了多个文件
然后使用binwalk分解,binwalk分解不行,再利用foremost进行分解,这里使用foremost分解最终得到一张图片,图片还不在这里
根据题目给的提示“flag在另一张图里” ,使用tweakpng删除第一个IDAT,保存得到一个新图片(tweakpng是一个Windows工具,也可以通过wine在kali运行,可以尝试)
得到的新图片就有flag
PNG的图像数据块(IDAT)存储图像的实际数据,可以包含多幅图像,所以一张图片可能有多个图像的数据组成,但默认显示第一个IDAT数据块图像。
misc12
前面步骤省略...
这里用binwalk分析是否存在内嵌文件,没有
接着使用tweakpng,能够看到很多个IDAT数据块
然后这里就有两个思路:
1. 将所有IDAT数据块合并查看,还可以再进一步使用binwalk和foremost进行分解图片查看是否能够得到有效的图片
2. 手动一个个IDAT数据块得到每一个图片是否是有效图片
先来合并IDAT数据块
分别使用binwalk和foremost工具生成的文件都没有想要的文件
那一个个删除IDAT文件看看,删除了前面八个就能够得到flag了(记得每一个删完都要save!!!)
misc13
按照前面题目的流程可以过一遍,没有得到想要的文件。
根据题目提示flag位置在图片末尾,说明应该还是藏在图片的内容中,使用grep查询包含'c'的片段,发现有一个很疑似flag的片段
这里的规律是隔位取值(其实单看ctfshow还是勉强能看得出来这个规律的),得到四个flag
ctfshow{ae6e3fa48f528b1742d72e6f41298380}
ctfshow{1e3e2ed48f518b7e4267de1c412a839a}
ctfshow{ae6e3ea48f518b7e42d7de6f412f839a}
ctfshow{ae6e46c48f739b7eb2d1de6e412f839a}
都试试哪一个是答案flag就好了
misc14
按照步骤,发现图片内嵌着多个文件
然后进行binwalk分解,出现报错,并且foremost提取出来的文件也不是想要的
这里报错的原因有可能是文件结构异常(可能被加密之类的情况)或者是签名数据库识别不出
可以利用dd手动提取隐藏文件
那么我们需要提取的是后面那个图片文件,偏移量为2103
得到的jpg文件就是flag
也可以使用-D命令
文件头是JPEG文件
msic15
这里就是根据上面的方法,在使用vim或者Windows文本编辑器查看文件内容时,能够在文件头看到flag
题目这里给了提示:flag跳过去了,这个'跳'字?
BMP格式的文件头里有4位字节称作偏移量,用来指图像数据的起始位置。
题目就是利用增大这个偏移量的方法,把冗余数据塞在了BMP头部,之后的内容可以正常显示。
当使用cat的时候是不能显示出tfshow{...}这部分的,如果flag被塞在了文件头和信息头之后、图像数据之前,这段数据可能包含空字符(或者是非ASCII字符),当cat遇到空字符会提前终止输出而不会输出后面这段内容(遇到非ASCII会显示乱码,掩盖flag)但是vim以及Windows的文本编辑器就不会,因为是强制显示所有字节的(包括空字符和非ASCII字符)
misc16
使用binwalk判断是否存在多个文件,显示存在,然后使用binwalk进行分解
打开DD4文件就能看到flag
misc17
使用binwalk发现存在多个文件
使用binwalk分解出的文件也没有得到想要的
使用forest工具分解也没有得到想要的
使用tweakpng一个个删除以及合并IDAT,也没有效果
题目提示是“答案藏在内容中”,查阅,这里需要用到zsteg工具
zsteg是一个专门用于检测PNG和BMP图像中隐写数据的工具,支持LSB(最低有效位)、文件附加数据、异常调色板等常见隐写手法。kali工具下载就好gem install zsteg
发现这里有隐藏的额外数据“extradata:0”,“3544 bytes of extra data after zlib stream
”表明 PNG 文件的 IDAT 数据块(存储图像压缩数据的部分)之后存在额外的隐藏数据
将额外的数据保存到一个文件
再次使用binwalk分解额外数据文件
得到的图片即是flag
附加文件需要完整的文件头+文件体才能被解压工具识别,直接使用binwalk提取时,如果数据未完整分离,zip工具会出现报错。
misc18
注意这里有一个不同寻常的提示“flag在标题、作者、照相机和镜头型号里”。
查看图片的属性
misc19
这里提示“flag在主机上的文档名里”,但在普通查看属性看不到信息,这里可以使用exiftool工具查看完整的Exif元数据
当然也可以使用Exif官方网站查看信息https://exif.tuchong.com/
元数据是“描述数据的数据”,即文件的附加信息,用于记录文件的属性、来源、编辑历史等,但不会直接影响文件的主要内容。在CTF中,元数据常被用来隐藏Flag或者传递线索,因为它容易被忽视,但又支持自定义写入。
misc20
这里提示“flag在评论里”,跟misc18一样使用exiftool查看文件附加信息,发现comment有flag
翻译过来,flag为ctfshow{c9796b1aecf06e1d79c21ddad593e42}
misc21
这里提示“flag在序号里”,跟上面一样使用exiftool查看文件的序号,发现一行数字
刚开始没有什么思路,查阅,这里需要16进制转换
1. 数字由0-9数字组成,并且位数为偶数,符合十六进制字节对的特征
2. CTF经常使用十六进制编码隐藏ASCI字符
转换出来的字符串是hex十六进制转换函数,将X和Y进行hex转换,那这里有分辨率和位置的X和Y
分别转换得到的flag为ctfshow{e8a221498d5c073b4084eb51b1a1686d}
misc22
开始注意到没点开之前的图片是有黄色字符的,但点开就看不到了。这里binwalk检测出有两个图片
使用binwalk和foremost工具都分解不出所要的,考虑使用手动分解
FFD8文件开始位置,FFD9文件结束位置
这边binwalk和foremost分解不出来的原因有可能是第一个文件的结束标记后面紧接了数据块,JPEG 文件允许
FF D9
出现在注释或数据段中(非实际结束),工具可能被误导,从而解析不出。
这里的第二个文件偏移量计算:0xA0十六进制为160,注意这是行的起始位置,要加上后面的14个字节,所以偏移量为174
这里文件分解出来就能够看到黄色部分
Windows也可以使用winhex,这是一个非常厉害且好用的工具
打开winhex搜索FFD8
将第二个FFD8之前的内容Ctrl选中删除生成一个新的文件
保存就可以看到黄色字体了。
另外,这里没有打开之前能看到黄色字体,但打开之后看不到,这种称作thumbnail隐写(缩略图隐写)
缩略图是一个小型的JPEG,有独立的文件头标记和文件结束标记
缩略图仅在文件预览时显示,打开不显示
对于这个隐写,可以直接使用exiftool工具进行提取
exiftool -ThumbnailImage -b misc22.jpg > thumb.jpg
misc23
题目提示“flag在时间里”,exiftool工具查看
“history action”字段翻译为“时间戳,十进制转十六进制,得到flag”
首先先将时间转为时间戳https://tool.lu/timestamp/(注意格式)
然后将时间戳转换为16进制
最终得到的flag
ctfshow{3425649ea0e31938808c0de51b70ce6a}
misc41
题目提示:“H4ppy Apr1l F001's D4y!
愚人节到了,一群笨蛋往南飞,一会儿排成S字,一会儿排成B字。”
根据提示,可以猜测解题关于“F001”这串字符有关,在图片内容搜索
高亮部分图案就是flag(虽然我没看出来、、、)
flag为ctfshow{fcbd427caf4a52f1147ab44346cd1cdd}
总结
内容比较多,先针对图片篇的基础操作和信息附加进行总结
文件伪装
这对应的是后缀名和文件格式不对应,诱导选手用错误工具打开
如何检测?
- file flag.jpg 查看真实文件类型
文件附加数据
这对应的是图片末尾插入flag明文以及BMP文件头和内容中间插入flag明文
原理:
- 能够直接插入图片明文是因为,图片解析过程中碰到不能解析的内容会直接跳过,不影响图片显示
- 能够在BMP文件里面插入flag是因为,BMP文件的偏移量决定图像数据的起始位置,如果人为增大偏移量可以在文件头和图像数据之间插入额外数据
如何检测?
-
grep -a -F 'ctf' misc17.png 查看明文字符串(未隐藏)
-
vim 查看文件所有内容(文本编辑器也可以)
文件拼接
这对应的是binwalk发现图片包含多个文件
如何检测?
- 自动分离文件:使用binwalk和foremost深度扫描,foremost比binwalk厉害,binwalk这里也需要注意-e和-D命令的区别
- 手动提取:使用dd命令或者WinHex工具进行手动提取,dd命令需要准确知道文件的偏移量,WinHex是可视化工具,相对操作比较简单,而且功能比较全面
- 缩略图可以使用exiftool工具直接提取
元数据隐写
这对于的是将flag隐藏在文件的属性信息(如标题、作者等)中
如何检测?
- 可以直接通过文件属性查看工具exiftool查看,或者使用Exif网页版
- 缩略图用
exiftool -ThumbnailImage提取
编码转换隐写
这里对应的是Flag经过某种编码或加密后存储,需按提示转换(如Hex→ASCII、时间戳→日期、Base64解码等)
如何检测?
- 直接使用对应进制转换网页版
根据上面总结需学会系统解题。
接下来会进行misc入门的图片篇(文件结构)及(颜色通道)进行学习。