那些图片隐写中的神操作之PNG

805 阅读3分钟

我正在参加「创意开发 投稿大赛」详情请看:掘金创意开发大赛来了!

引子

上期给大家带来了JPG的隐写方式,今天我来给大家说一说PNG(文件头:89 50 4E 47 0D 0A 1A 0A),借用百度百科的资料来说:

PNG(Portable Network Graphics),便携式网络图形,是一种采用无损压缩算法的位图格式,支持索引、灰度、RGB三种颜色方案以及Alpha通道等特性。 [5]  其设计目的是试图替代GIFTIFF文件格式,同时增加一些GIF文件格式所不具备的特性。PNG使用从LZ77派生的无损数据压缩算法,一般应用于JAVA程序、网页或S60程序中,原因是它压缩比高,生成文件体积小。PNG文件的扩展名为.png

你可曾想到PNG其实也可以藏着需要重要信息呢,接下来我将以CTF比赛中遇到的PNG图片隐写方式,给大家看看出题的创意

属性隐写

先来一个最简单的,右键属性大家知道不,往往有的信息就在属性之中,对于这种隐写方式,我们有一个专门工具EXITFOOL,该工具可以一键列出该图片的所有属性,十分好用

LSB隐写

lsb隐写主要是通过stegsolve和zsteg配合使用发现隐藏的信息。

放一个下载链接:

github.com/zed-0xff/zs…

www.caesum.com/handbook/St…

考点一:flag或key隐藏在了通道里

当有信息藏在通道里时,我们可以使用stegsolve工具,逐个通道的查看来寻找有用信息

考点二:隐藏在色道的最低位。

通过观察通道里的东西,判断隐藏在了哪里,也是使用stegsolve工具逐个看,当然zsteg工具为我们提供了展现PNG全部信息的功能,也是非常好用

zsteg -a + 图片    //-a就是全部

考点三:cloacked-pixel-lsb隐写加密

github.com/livz/cloack…

简称LSB隐写,这个工具对内容的隐写是可以进行加密的,命令后面跟着的就是密码

python2 lsb.py  extract 6.png 22.txt v50

含义就是将PNG里面的TXT信息提出来,密钥就是v50

SlientEye

与上文应用方法相似

stegpy

stegpy是一种将编码信息隐写在图像和音频文件中的程序。使用Python编写

安装方法

pip3 install stegpy
sudo python3 setup.py install

可以设置密码也可以不设置

stegpy 图片 -p 密码

IDAT数据块隐写

常见的是隐藏zlib数据,具体实际应用是用010EDITOR查看数据块,发现藏有压缩包,我们便可以使用binwalk分离

binwalk -e 文件

爆破宽高

图片宽高被修改可能会隐藏一些信息,因此,我们有专门的脚本来爆破正确的宽高,当我们将PNG图片放入010EDITOR发现提示CRC错报,便可以试试这个

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# author: moddemod
# datetime: 2020/1/3 下午10:37 
# ide: PyCharm


import zlib
import struct


filename = 'mod.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    data_f = all_b[:12]
    # data = all_b[12:29]
    # print(data)
    data_r = all_b[29:]
    data_idch = all_b[12:17]
    data_l = all_b[25:29]
    # width = all_b[17:21]
    # height = all_b[21:25]
    # print(width, height)
    crc32key = int(all_b[29:33].hex(), 16)
    data = ''
    for w in range(184570, 184577):
        for h in range(22790, 22793):
            width = struct.pack('>i', w)
            height = struct.pack('>i', h)
            data = data_idch + width + height + data_l
            print(data)
            # print(len(data))
            if zlib.crc32(data) == crc32key:
                print(w, h)
                with open('r.png', 'wb') as f1:
                    f1.write(data_f + data + data_r)
                    break

结语

对于这些隐写方法是不是很有创意,如果大家还有什么补充的,可以在评论区分享一下