四道图片隐写题
Posted ch42e
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了四道图片隐写题相关的知识,希望对你有一定的参考价值。
第一题
- 打开压缩包得到的是一张PNG格式的图片
- 首先拖放到010Editor中:
CTRL+F 搜索IHDR发现只有一个,没有其他问题
- 然后放到KALI中分析一波:
图片能够在kali中打开,说明不是宽高的隐写,因为如果修改了宽高在linux中是无法正常显示的
- 然后binwalk分析一波:
同样的没有什么问题
- 最后就是放到 stegslove里面试一试了
简单的科普一下png的知识
png支持RGBA四个通道,每个通道占8个二进制位,隐写文件或数据一般都在各个通道的低位,因为低位的变化不会引起较大的视觉变化,图片看上去还是原来的图片,但是你不知道是在哪个通道,这里有4个通道,如果藏在一个通道的低位的话,有四种可能,如果藏在两个通道的低位的话,可能进行各种运算操作后出现新的图片,加减乘除与或异或
发现Red plane 0是空的,按理来说应该也是”雪花“的,所以应该是有问题的
然后 Analyse - Data Extract,查看该通道,得知是LSB隐写
后面得知就是吧Alpha、Red、Green、Blue 0通道进行异或处理就能够得到flag了,可以通过stegslove获得,下面说一下通过python编写脚本进行色道分离异或处理的方法:
#代码参考自合天智汇
import cv2
import numpy as np
import os
def lowbit(x):
return x & 0x1
png= cv2.imread("flag_enc.png" , cv2.IMREAD_UNCHANGED)
# 新建一个temp文件夹保存异或之后的图片
os.system("mkdir temp")
# 打开进入temp文件夹
os.system("cd temp")
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_xor(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"xor_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_or(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"or_"+str(i)+"_"+str(f)+".png",dst*255)
for i in range(0,4):
for f in range(0,4):
dst= cv2.bitwise_and(lowbit(png[: ,: ,i]),lowbit(png[: ,:, f]))
cv2.imwrite("temp/"+"and_"+str(i)+"_"+str(f)+".png",dst*255)
然后就可以得到结果,很明显能够看到flag了:
第二题
下载题目压缩包解压后得到两个文件 desc.txt 和 damaged.disk
desc.txt理面是一段英文,翻译后就是:
Horse Clip-Clop
A strange filesystem is recovered from a damaged old hard disk.马夹子
从损坏的旧硬盘恢复奇怪的文件系统。
然后百度、Google还是看不懂,就不对这个txt文件分析了
- 把 damaged.disk拖到010Editor中看看有什么信息
文件开头,看不懂。。。。。。
往下继续翻,CTRL+F 搜索一下 flag,key,ctf 无果(太天真了)
后面发现了PNG的文件头,终于找到关键信息
往下找发现有两个IHDR,CTRL +F 发现确实就是两个然后裁剪出来补上文件头得到两张图片
然后用PS将两张图片进行拼接,就得到flag了
第三题
下载得到一张图片,一贯的套路,拖到010Editor里面看看先
真正有东西的是后面的这部分数字和字母:
科普一下
Exif : 可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据
Exif可以附加于JPEG、TIFF、RIFF 等文件之中,为其增加有关数码相机拍摄信息的内容和索引图或图像处理软件的版本信息。
还是binwalk分析一下看看:
没什么特别,看来flag就在这一串的数字字母结合的数据里头了,很明显看起来这是16进制的编码,Converter转换一下
得到的是一堆的坐标,然后通过坐标画图
方法一:使用KALI 的 gnuplot
百度略微了解了一下gnuplot的用法,把坐标转换成为 gnuplot 能够识别的形式,用notepad++ 的替换即可完成,保存为txt文件,然后在Kali中进入gnuplot,执行 plot "文件名",得到一张二维码:扫码即可得到falg:
flag{40fc0a979f759c8892f4dc045e28b820}
方法二:利用Python编写脚本
#代码参考自合天智汇
import cv2
import os
import numpy as np
n=0
canvas= np.ones((300, 300, 3), dtype="uint8")
canvas=canvas*255
list=open("1.txt").read().split("
")
list=[i.split(",")for i in list]
for p in list:
canvas[int(p[0]),int(p[1])]=[0,0,0]
cv2.imwrite("2.jpg",canvas)
cv2.imshow("Canvas",canvas)
cv2.waitKey(0)
第四题
首先已经很明确的告诉了题目的相关信息
文件格式:BMP
工具:Winhex
类型:图片隐写
文件直接无法打开,到winhex中看一看
很显然这不是bmp文件头,所以这道题目就是加个头部就可以了,最后的答案是这样的,那么找一个bmp的文件头加上去嘛
加完之后,依旧是打不开的啊???难道是覆盖原来的地方么,那再试试吧!
还是打不开,看来是我想的太简单了。。。然后找资料详细了解一下bmp文件头
BMP文件分析
BMP(全称Bitmap)是Windows操作系统中的标准图像文件格式,可以分成两类:设备相关位图(DDB)和设备无关位图(DIB),使用非常广。它采用位映射存储格式,除了图像深度可选以外,不采用其他任何压缩,因此,BMP文件所占用的空间很大。
BMP文件的图像深度可选1bit、4bit、8bit、16bit、24bit、32bit。BMP文件存储数据时,图像的扫描方式是按从左到右、从下到上的顺序。由于BMP文件格式是Windows环境中交换与图有关的数据的一种标准,因此在Windows环境中运行的图形图像软件都支持BMP图像格式。
数据段名称 | 大小(byte) |
---|---|
bmp文件头 | 14 |
位图信息头 | 40 |
调色板 | 由颜色索引数决定 |
位图数据 | 由图像尺寸决定 |
图像通常保存的颜色深度有:wikipedia
- 每像素1位:支持2种不同的颜色(例如:黑色和白色)像素值存储在每个位中,也即调色板有两个;
- 每像素2位:支持4种不同的颜色,每1字节存储4个像;
- 每像素4位:支持16种不同的颜色,每1字节存储2个像素;
- 每像素8位:支持256种不同的颜色,每1字节存储1个像素;
- 每像素16位:支持65536种不同的颜色,每2字节WORD存储1个像素;
- 每像素24位:支持16,777,216种不同颜色(真彩色),每3字节存储1个像素值,没有调色板;
- 每像素32位:支持4,294,967,296种不同颜色,每4字节DWORD存储1个像素,没有调色板;
BMP文件头
字节(byte) | 内容 (HEX) |
---|---|
0-1(2byte) | 4D 42(固定) 表示文件类型 |
2-5(4byte) | 表示文件的大小 |
6-7(2byte) | 00 00(固定)保留位 |
8-9(2byte) | 00 00(固定)保留位 |
a-d(4byte) | 4字节的偏移,表示从文件头到位图数据的偏移 |
位图信息头
字节 | 内容(HEX) |
---|---|
4byte | 28 00 00 00(固定)信息头的大小 |
4byte | 宽度(以像素为单位) |
4byte | 高度(以像素为单位) 同时如果为正,说明位图倒立(即数据表示从图像的左下角到右上角),如果为负说明正向; |
2byte | 为目标设备说明颜色平面数,总被设置为1 |
2byte | 位数/像素数,十进制值有1、2、4、8、16、24、32 |
4byte | 说明位图数据的压类型( 00 00 00 00 表示不压缩) |
4byte | 说明位图数据的大小,即图像大小=文件大小-偏移量 |
4byte | 水平分辨率 |
4byte | 垂直分辨率 |
4byte | 颜色索引数 |
调色板
不都有
题目
分析之后发现,不是所有的bmp文件头数据都是一样的,所以需要知道文件的大小,宽高才能够匹配正确的文件头
- 在这里可以看到文件大小为 230454 byte;
- 图像大小为 230454-54=230400 byte;
- 那么宽高是是多少呢?
- 这里得看位图是多少,现在常见的就是24位,每三个字节存储一个像素
- 还有就是文件尾部看到的 00 00 00也可以得知是24位的
- 图像大小=宽 x 高 x 3
- 得知是 320 x 240 x 3
覆盖到文件头得到下面图片:
以上是关于四道图片隐写题的主要内容,如果未能解决你的问题,请参考以下文章