1.1 题目分析
1.misc类题目
在i春秋给出的ctf比赛中,misc题目类型中,仅仅给出一个zip文件的下载地址,其中给出了一个提示“red0”,无任何其它提示,该zip文件为图片文件其压缩文件下载地址为:https://static2.ichunqiu.com/ictf/resources/attach/red0_a311fc237b75e084793fcfbfa4105bd0.zip
2.分析题意
red0是提示,以前未玩过图片隐写,不知道是啥意思,本次通过查看各种资料,知道其实这个就是red,选择0值。
1.2解题思路
1.根据提示使用setgsolve进行分析,首先进行图片转换浏览,简单的会直接获取flag。
2.通过数据抽取进行分析
根据提示选择图像平面通道,通过预览查看有无flag等关键字,有的可能是二进制编码01,将二进制编码提取出来,通过代码进行处理或者在线转换。
1.3实战某ctf图片隐写
1.下载Stegsolve
Stegsolve是一款图片隐写分析软件,支持常见的图片文件格式,可提取GIF文件中的帧。当两张jpg图片外观、大小、像素都基本相同时,可以考虑进行结合分析,即将两个文件的像素RGB值进行XOR、ADD、SUB等操作,看能否得到有用的信息。StegSolve可以方便的进行这些操作。打开StegSolve,选择“file”->”open”打开一张图片文件,然后选择“analyse”->”image combine”选择另一张图片,默认的XOR操作就可以看到隐藏的信息。点击窗口下方的箭头,可以看到不同combine方式下的结果。使用工具的优点是简单方便,但是缺乏扩展性,不能进行批量自动化处理。而对于自己编写的脚本,就可以方便的进行扩展。Stegsolve下载地址:http://www.caesum.com/handbook/Stegsolve.jar
2.运行Stegsolve
如果系统安装了java运行环境,可以直接执行Stegsolve.jar程序,否则需要通过命令行来启动java -jar Stegsolve.jar
3.打开图片
在Stegsolve中单击“File”打开本列中的图片文件ez.png,注意开始运行Stegsolve.jar时,其软件默认窗口比较小,打开后效果如图1所示。
图1使用Stegsolve打开图片
4.图像的位平面(bit plane)
(1)图像位平面的定义
一幅256个灰度级的图像可以分解成8个位平面,原因就是2^8=256,换句话说每一个像素点的灰度值可以由8个二进制位来表示,所谓的位平面(bit
plane)就是依次取出每个像素点的数值组成一个位平面。举一个简陋的例子,假设当前图像就有两个像素点,这两个像素点的灰度值分别是1和3,那么其对应的二进制位分别为10000000和11000000,那么该图像分解成8个位平面依次为11、01、00、00、00、00、00、00,即通过取前面两个二进制位的第一位、第二位、第三位等组成第一个位平面,第二个位平面,第三个位平面等。可以发现,每一个位平面均为一个二值图,也就是说像素点的灰度值非0即1。
(2)位平面的matlab实现
可以在matlab中通过以下代码进行实现,实现效果如图2所示。
X=double(rgb2gray(imread('d:test.bmp')));%将原始图像转换为灰度图像,如果本身就是灰度图可以去掉rgb2gray函数
[h w] = size(X);
subplot(3,3,1);
imshow(X,[]);
title('原始图像');
for k=1:8
for i=1:h
for j=1:w
tmp(i,j) = bitget(X(i,j),k);%bitget函数首先将X(i,j)处灰度值分解为二进制串,然后取第k位
end
end
subplot(3,3,k+1);
imshow(tmp,[]);
ind = num2str(k);
imti = ['第',ind,'个位平面'];
title(imti);
end
图2实现位平面的效果
5.图像平面通道浏览分析
在Stegsolve软件下方中间文件使用向左或者向右的箭头可以对图片进行各种变换,如图3所示,显示是Red plane 2图像平面层,在Stegsolve中可以进行Red/Green/Brue/Alpha 0-7通道的转换,以及XOR等操作,某些题目可以直接通过该方法直接获取flag值。
图3图像平面层转换
6.提取数据分析(Data Extract)
在Stegsolve中单击“Analyse”-“Data Extract”,如图4所示进行数据提取分析,在本例中,在“Bit Planes”中选择“Red 0”,Bit Plane Order中选择RGB。单击Preview可以看到在上方存在存在01字样数据。
图4数据提取分析
解题技巧:
一般来讲出题方都会给出提示,这些暗示有些会出现在题目上,有的会在注释处,例如2014年XDCTF网络安全大赛的web100题,题目中的图片hackkey.png,明确是需要进行解答的对象,在图像文件的注释主有“rd
rgb”的提示,根据提示选择位图平面顺序RGB,选择Red0即可解题,如图5所示,获取其key为“Xd$eC@2o14”。
图5位图平面Red0解题
7.保存文件并分析
(1)保存二进制文件
在Stegsolve中可以将分析的结果保存为txt文件和二进制文件,要根据情况,如图图片中已经出现了key则可以保存为txt文件,直接复制key或者flag来提交答案。在本例中由于出现的是代码,还需要做进一步分析,因此将其保存为二进制文件2,然后使用notepad打开该文件,如图6所示,将二进制01字段全部保存。
图6打开二进制文件并提取二进制代码
(2)二进制转换查询
在http://www.5ixuexiwang.com/str/from-binary.php网站中,复制数据进行查询:
011001100110110001100001011001110111101101010000001100010110001101011111010010000011010001110011010111110011001101110110001100110111001001111001011101000110100000110001011011100110011101111101
如图7所示,查询获取其flag为:flag{P1c_H4s_3v3ryth1ng}
图7获取flag值
(3)python解码二进制
将一下代码保存为ejz.py:
binary_string='011001100110110001100001011001110111101101010000001100010110001101011111010010000011010001110011010111110011001101110110001100110111001001111001011101000110100000110001011011100110011101111101'
import binascii
hex_string = "%x"%(int(binary_string, 2))
hex_string = hex_string[ : len(hex_string) / 2 * 2]
print "key :", binascii.a2b_hex(hex_string)
执行 python ejz.py后,获取其flag如图8所示。
图8python直接解码获取flag
1.4python编程解决jpg格式图片
1.安装
python操作图片需要用到PIL(Python
Imaging Library)库,可以通过easy_install PIL命令安装。如果使用Mac系统系统的话,还可以用brew
install pillow来安装。安装PIL后就可以import
Image库了。如果系统是64位还需要下载64位程序进行安装,下载地址https://files.pythonhosted.org/packages/e6/f0/7e6d01f026274363aaefb6b7e924f4b34b4a825a4bd8eaebfbd7d401af91/Pillow-2.1.0.win-amd64-py2.7.exe,32位程序可以参考进行下载https://pypi.org/project/Pillow/2.1.0/#files
2.使用以下代码进行读取
参考网友解决jpg格式文件的处理代码,执行后即可获取二进制代码。
# -*- coding:utf-8 -*-
import Image
image = Image.open("hack.jgp")
width, height = image.size
binary_string = ""
for y in range(height):
for x in range(width):
#获取坐标(x, y)处的颜色值
r, g, b = image.getpixel((x, y))
color = (r