今天学习做一些简单的隐写术的题,来了解一些关于图片的相关知识。
第一题简单的隐写
这个一个小兔子,我先直接用Notepad打天,并搜索一下flag和key,发现没有,当浏览内容的最后时,发现一串有趣的十进制如下。
打开ASCII码表后发现107就是k
那一定就是这串十进制就是flag了。
写一个小的python脚本吧
str ='107;101;121;123;121;111;117;32;97;114;101;32;114;105;103;104;116;125'
str_ascii =''
for x in str.split(';'):
str_ascii = str_ascii +chr(int(x))
print(str_ascii)
得到结果key{you are right}
第二题隐写1
这是Bugku中的隐写1,这个题看到之后运用上面的方法打开后发现没有什么信息,将这个文件在kali中查看一下,发现不能打开,而在windows是可以打开这个图片的。
Kali不能打开,提示CRC错误
Windows就可以顺利打开图片PNG的文件结构,这说明这个图片应该是修改过图片的大小,所以运用工具打开看图片文件格式。根据PNG文件的定义来说,其文件头位置总是由位固定的字节来描述的:
[if !supportLists]l [endif]十进制数
137 80 78 71 13 10 26 10
[if !supportLists]l [endif]十六进制数
89 50 4E 47 0D 0A 1A 0A
其中第一个字节0x89超出了ASCII字符的范围,这是为了避免某些软件将PNG文件当做文本文件来处理。文件中剩余的部分由3个以上的PNG的数据块(Chunk)按照特定的顺序组成,因此,一个标准的PNG文件结构应该如下:
PNG文件标志 PNG数据块 …… PNG数据块
数据块结构
PNG文件中,每个数据块由4个部分组成,如下:
名称字节数说明
Length (长度)4字节指定数据块中数据域的长度,其长度不超过(231-1)字节
Chunk Type Code (数据块类型码)4字节数据块类型码由ASCII字母(A-Z和a-z)组成
Chunk Data (数据块数据)可变长度存储按照Chunk Type Code指定的数据
CRC (循环冗余检测)4字节存储用来检测是否有错误的循环冗余码
CRC(cyclic redundancy check)域中的值是对Chunk Type Code域和Chunk Data域中的数据进行计算得到的。CRC具体算法定义在ISO 3309和ITU-T V.42中,其值按下面的CRC码生成多项式进行计算:
x32+x26+x23+x22+x16+x12+x11+x10+x8+x7+x5+x4+x2+x+1
CRC:一种校验算法。仅仅用来校验数据的正确性的
下面,我们依次来了解一下各个关键数据块的结构吧。
IHDR
文件头数据块IHDR(header chunk):它包含有PNG文件中存储的图像数据的基本信息,并要作为第一个数据块出现在PNG数据流中,而且一个PNG数据流中只能有一个文件头数据块。
文件头数据块由13字节组成,它的格式如下表所示。
域的名称字节数说明
Width4 bytes图像宽度,以像素为单位
Height4 bytes图像高度,以像素为单位
Bit depth1 byte图像深度: 索引彩色图像:1,2,4或8 灰度图像:1,2,4,8或16 真彩色图像:8或16
ColorType1 byte颜色类型:0:灰度图像, 1,2,4,8或16 2:真彩色图像,8或16 3:索引彩色图像,1,2,4或8 4:带α通道数据的灰度图像,8或16 6:带α通道数据的真彩色图像,8或16
Compression method1 byte压缩方法(LZ77派生算法)
Filter method1 byte滤波器方法
Interlace method1 byte隔行扫描方法:0:非隔行扫描 1: Adam7(由Adam M. Costello开发的7遍隔行扫描方法)
根据上面的描述,我画横线的八位就是高度和宽度设置的位置,我们将A4改为F4然后再保存。发现flag
第三题隐写2
题目为BugKu杂项中的隐写2,在kali中打开是如下的图片
先用binwalk分析一下图片内容,发现有zip的文件。
所以对其进行分离。得到flag.rar文件如图。因为binwalk分析出来是zip文件,所以修改为zip格式。
在解压zip时,发现有密码,查看提示图片说是3个数字为密码。所以运用fcrachzip工具进行爆破。得出密码871
解压后发现还是图片
运用notepad打开发现
但这个是base64编码,要解码。