ctf中常见的隐写术

ctf中常见的隐写术

0x01 什么是隐写术

隐写术是关于信息隐藏,即不让计划的接收者之外的任何人知道信息的传递事件(而不只是信息的内容)的一门技巧与科学。具体涉及到图片隐写,音频隐写,视频隐写。其中图片的隐写是最为常见的,也是ctf中常见的一种题型。
0x02 准备的工具


  • Notepad++,功能比 Windows 中的 Notepad(记事本)强大,除了可以用来制作一般的纯文字说明文件,也十分适合编写计算机程序代码。不仅有语法高亮度显示,也有语法折叠功能,并且支持宏以及扩充基本功能的外挂模组。主要是用来方便的查找一些东西。
  • binwalk,kali下的一个自动化分析图片隐藏文件的软件。用来自动分析图片隐藏信息及其所在位置。
  • Stegsolve,一款图片通道查看器。做LSB分析,图片比较什么的。
  • Winhex,16进制查看器。用通过分析2进制数据来看隐藏了什么,同时可以用来分离文件。
  • Photoshop,三大邪教之一。看看有没有隐藏的图层什么的。
  • Exif查看器,可以查看拍摄时的光圈、快门、白平衡、ISO、焦距、日期时间等各种和拍摄条件以及相机品牌、型号、色彩编码、拍摄时录制的声音以及GPS全球定位系统数据、缩略图等。

对于不想装linux系统,真的想在windows下安装binwalk的,也可以,先确保windows中有git环境和python环境,然后在git中输入

1
2
3
git clone https://github.com/devttys0/binwalk
cd binwalk
python setup.py install

Binwalk具体用法在wiki里面,没有git环境的在github项目里直接下载binwalk

github项目:https://github.com/devttys0/binwalk

binwalk的wiki:https://github.com/devttys0/binwalk/wiki
0x03 类型1


用载体进行隐藏,查看一下属性,看看里面有没有什么信息,或者直接用notepad++打开,一般ctrl+f查找一下key,flag等信息,如果没找到,可以翻到图片头或者尾部查看是否有特殊的字符串,比如一段md5、base64、unicode之类的,然后到某些网址进行解密。

通过备注查看:

通过notepad++查看:

在线解密:

0x04 类型2


图片文件会自动忽略结束符之后的数据,比如jpg图片的结束符为FF D9,在这之后加入数据,不会影响jpg的显示,对于类隐写,我们肯定用不能winhex打开16进制数据肉眼去看,这个时候就要用到binwalk了,例子如下,放在linux里,用binwalk xxx.jpg自动跑出来隐藏的信息及其类型。这个时候我们借助winhex设置头和尾然后导出成新文件,或者直接在linux系统中用dd命令,都是可以分割出来后面一段文件的。

使用binwalk分析:

在linux下用dd命令分离(方法一):

在win下用winhex分离(方法二):

分离出来的结果:

0x05 类型3


LSB隐写,也就是最低有效位 (Least Significant Bit)。图片中的像数一般是由三种颜色组成,即三原色,由这三种原色可以组成其他各种颜色,例如在PNG图片的储存中,每个颜色会有8bit,LSB隐写就是修改了像数中的最低的1bit。
这里需要注意一个坑,很多时候它会给你一个黑白颜色相反的二维码,直接扫肯定是出不来结果的,需要自己处理一下,最简单的就是放到一个可以编辑的地方ctrl+a一下,然后扫描。


使用Stegsolve发现他在灰色最低位隐藏了一个二维码:

0x06 类型4


Gif,这种题喜欢让密码出现的特别快来不及记录,这个时候丢到Stegsolve-frame browser,一帧一帧的看就行了
逐帧查看:


0x07 总结


关于图片隐写的还有很多,png格式的文件经常会在一个不完整的版块藏很多数据,这个时候可以用pngcheck分析,有时候会跑出来两张看起来相同的png图片,可以丢到Stegsolve-image combiner中对比,bmp文件经常会在不同图层隐藏信息,photoshop就可以处理。例子中用到的图都放在github中了,有兴趣的朋友可以去试试。