在上一期,我主要谈了谈对于杂项的一些浅薄理解,这一期我们正式开始对于CTF杂项的学习,我们首先学习的是杂项中最常考察的一项——隐写分析。
这篇文章的大部分来自于我为了科学之光冬令营20号下午的讲课所准备的大纲。
有些时候,我们想把一些信息或者文件隐藏在某些文件之中,就可以利用隐写术来达到我们的目的。而针对那些有隐藏信息的文件,我们从中获取到被隐藏的信息的过程就叫做隐写分析。
隐写分析是 Misc 中最为重要的项目之一,包括文件分析、信息隐写等等,涉及巧妙的编码、隐藏数据、层层嵌套的文件中的文件等等于杂项一样,它也喜欢考察一些并非为我们所掌握的小知识,比如一些从来没听说过的乱七八糟的密码(比如与佛论禅加密、颜文字加密等等),我们需要善用自己的信息搜集能力(其实就是查百度),在这里顺便简单介绍一下信息搜集。
我的理解是,信息搜集就是针对某一目标,在搜集它/他/她的明显信息后,通过进一步的信息整合与分析得到他的隐蔽信息。
(此处省略500字)
“知己知彼,百战百胜。”我们学习信息搜集只是为了更好地防止自己的信息被搜集,提高自身信息安全意识,自觉保护个人信息,防止自己的隐私被窥探。
但其实,我们做隐写分析也用不到什么高深的技术,在这里我推荐使用 Bing(国内查不到还能顺手查查国外的)。当碰到自己的知识盲区时,我们需要准确地找出自己想问的问题,比如[BUUCTF]荷兰宽带数据泄露,下载后我们得到了一个 conf.bin 文件,我觉得可能大部分人都不清楚这是个什么玩意,编辑器打开一看还是堆乱码,这个时候我们就需要使用搜索引擎了。
我们首先要明确自己的问题: conf.bin 文件是什么,输入搜索框,回车,很快便能得知这是路由器的备份配置文件,要用 RouterPassView.exe 打开查看。
其它的问题大抵也是如此,只要我们准确把握问题主干,搜索引擎大多数时候都会给我们想要的结果。
本节我们需要的工具:一个十六进制编辑器(010 Editer 或者 WinHex 等等),最好有个 Kali Linux 虚拟机
我们都知道,文件的扩展名往往反映了文件的类型,但又不一定准确,因为我们可以随意地去修改它。比如我们把可以一个 jpg 图片文件改名成 xxx.png,无论我们学过学过计算机知识都应该知道 JPG 和 PNG 不是同一个东西,但是我们双击却依然可以用图片查看器查看这张图片,这说明程序有自己的方式去判断这是什么类型的文件,从而选择读取这张图片内容的方式,这就是文件头的作用。
大部分文件类型有其固定的文件结构,基本结构为:
文件头 + 文件内容(+ 文件尾) //文件尾可能有可能没有
图片查看器打开图片文件时,首先会根据文件头判断它是哪种类型的文件,然后再根据文件类型选择恰当的读取方式。一般来说,程序在读取有文件尾的文件时一般只会读到文件尾,并不会关注后面还有没有别的内容。
所以对于有文件尾的文件类型A来说,文件尾之后的内容往往不会对文件的查看有影响,增加的内容普通情况下不会被发现(拿十六进制编辑器不算普通情况)。我们可以往它的文件尾后面添加字符,数字,甚至是藏一个别的文件,这就是直接附加。
要分离出附加在文件A后面的文件,可以通过在十六进制编辑器中观察文件尾后中隐含的文件头信息来判断文件A中附加的文件类型,从而进行提取,常见文件类型文件头(尾)如下:
文件类型 |
文件头 |
文件尾 |
JPEG( jpg ) |
FF D8 FF |
FF D9 |
PNG |
89 50 4E 47 |
AE 42 60 82 |
GIF |
47 49 46 38 |
00 3B |
ZIP |
50 4B 03 04 |
50 4B |
RAR |
52 61 72 21 |
/ |
Wave(wav) |
57 41 56 45 |
/ |
类型列举不全,更详细的可以看大佬博客:https://blog.csdn.net/Ahuuua/article/details/109165473
说实话,我不推荐肉眼观察法提取(楽),一个是考验记忆力和眼力,最主要的是可能有藏比作者把一个相同类型的文件藏一个文件里,然后在前一个文件的文件尾和后一个文件的文件头之间藏东西(我是深受其害),对于我这种喜欢先拉到最后看文件尾的人很不友好。
我推荐使用 Binwalk 工具(Kali Linux自带)和 Foremost 工具(如果你的 linux 没有的话可以输入 apt-get install foremost 回车,其他工具类似)分离文件A中附加的其他文件,Binwalk 可以自动分析一个文件中包含的多个文件并将它们提取出来,Foremost 也可以分离文件而且有时候更好用一点,我们可以先用 Binwalk 进行分析,如果有隐藏文件再用 Foremost 分离,我们经常使用的一些相关使用方法如下:
binwalk [文件A] #分析文件A
binwalk -e [文件A] #分析文件A后自动提取已知的文件类型的隐藏文件
foremost [文件A] #分离文件A的隐藏文件,存到与文件A同目录的output文件夹中,同时在文件夹中生成一个日志文件
更详细的使用方法我懒得写了(笑,以后可能统一写写),不过一般也用不着
找了道例题:[BUUCTF] 二维码 大家可以自己先尝试一下,如果有困难再去看下面的题解。顺便说一下,做CTF题,遇到不会的题看题解是一件非常正常的事,关键在于能不能在这道题中吸取教训,只要下次做到类似的能做对就行,这也是一个积累经验的过程(最好看完自己不会的地方再自己做,不要照抄 flag)。
下载下来是一张 PNG 格式的二维码,盲猜扫出来肯定不是结果。扔到 WinHex 中(或者 010-Editor ),一眼看到 png 文件尾和 zip 文件头(看多了就能一眼盯真)。(图片里面写错了)
这时当然可以直接人力提取,从 504B0304 开始选中一直到最后,右键-编辑-复制选块-正常 复制这一段数据,然后左上角新建一个文件,大小无所谓(最好小一点)直接确定。
选中第一个 0,右键-编辑-剪贴板数据-写入(其实我不知道写入和粘贴有什么区别,希望有大佬可以解惑),在弹出的窗口里确定-确定,成功写入后按 Ctrl+S 键保存,命名为1.zip。(不推荐这样肉眼观察法和人力分离法,这里讲主要是想带大家熟悉一下编辑器的用法)
我更推荐使用 Binwalk+Foremost 的方式,打开 Linux,把文件弄进去放个地方,在这个地方打开终端,输入 binwalk QR_code.png 发现有隐藏的ZIP文件,再输入 foremost QR_code.png 在 output 文件夹中找到分离出来的ZIP文件(或者直接输入 binwalk -e QR_code.png也是可以的)。
打开压缩包发现需要密码(好像有点超纲,算了无所谓做中学吧),直接打开上古神器 ARCHPR 选择 “所有数字”,长度 1-6(一般CTF题里面需要暴力破解的压缩包的密码都不会太复杂)(压缩包我会以后说)
得到密码 7639,解压后打开 4number.txt ,得到 flag。
本期就先说到这里,主要讲了讲隐写分析中的直接附加,写的不太好的地方还请包涵并提出您宝贵的建议,我们下期再见。
[1] CTF WIKI : https://ctf-wiki.org/misc/introduction/
以上内容仅供参考,水平不高,大佬见笑。
上一期:第一期:什么是杂项
下一期:隐写分析(2):PNG 图片隐写
作者:CHTXRT
出处:https://blog.csdn.net/CHTXRT
本文使用「CC BY-ND 4.0」创作共享协议,转载请在文章明显位置注明作者及出处。