图片隐写

发布时间 2023-10-09 23:37:08作者: 楚颖i

JPG图片

JPG图片十六进制开头FF D8,结尾 FF D9

JPG无法使用lsb隐写

1、插入文件尾

结尾后有隐藏base64编码,解码得到flag


2、文件中间

可ctrl+f 搜索flag格式文本,如果是base64编码则搜索ZmxhZ3,不同题目,不同应对


3、插入压缩包

在中间发现flag.txt文件

binwalk 文件名 :可查看图片信息

隐藏了个txt文件

第一种方法:binwalk -e 文件名 :提取文件(如果报错,试一下这个binwalk -e [文件] --run-as=root)root权限使用

第二种方法:

foremost 文件名(如果有output就用foremost -T文件名)

右键以root身份打开(不知道为什么改权限不能):破案了,chmod 777 -R ...才是修改他和他的子文件


搭配:binwalk查看信息,foremost提取内容


4、双图隐写

stegsolve:

1.File Format:显示图片的具体信息

2.Data Extract:数据提取

3.Steregram Solve:立体试图 可以左右控制偏移

4.Frame Browser:帧浏览器 主要是对GIF之类的动图进行分解,把动图一帧帧的放

5.Image Combiner:拼图,图片拼接


用frame browser,发现flag


PNG图片

  • IHDR:文件头数据块,包含图像的基本信息和属性。
  • IDAT:图像数据块,包含图像像素数据。

IHDR

(固定)八个字节 89 50 4E 47 0D 0A 1A 0A为png的文件头
(固定)四个字节00 00 00 0D 代表IHDR头的长度为13
(固定)四个字节 49 48 44 52(当这四个数放在ascll码中就是IHDR)

(可变)13位数据块(IHDR头
00 00 02 7F代表该图片的宽
00 00 00 AF代表该图片的高
后五个字节依次为:
Bit depth(图像深度)、ColorType(颜色类型)、Compression method(压缩方法)、Filter method(滤波器方法)、Interlace method(传输方法)
剩余四字节为该png的CRC检验码,由十七个字节(IHDR+IHDR头)进行crc计算得到。

IDAT

IDAT 到 IEND之间是IDAT块的数据

文件尾:AE 42 60 82


5、lsb1 隐写二维码

关于lsb:网络安全 - Lsb图片隐写 - 个人文章 - SegmentFault 思否

随便按按,再随便扫扫,拿下


6、lsb2 隐写ascii码

第一种方法:

Data Extract,RGB全0(一般是这样,原理不知),ascll码以PK开头(PK开头一般是zip文件),save bin保存为zip

file 文件:查看该文件是什么格式

ELF是linux中的可执行文件

直接执行,如果不行,属性把勾勾上


第二种:

zsteg

zsteg可以检测PNG和BMP图片里的隐写数据。

zsteg 文件(zsteg -a 文件就是查看所有通道的信息)

发现有个zip压缩包,提取一波

zsteg -e (通道) 文件 -> 保存的文件

zsteg -e b1, 1.zip-> out.zip


7、lsb3 双图比较

给了两张图,combiner结合一下,左点点,右点点

保存,并打开该二维码,在R、G、B分别为0时,得到三个二维码,分别扫一扫,得到三串字符串

DES

6XaMMbM7

U2FsdGVkX18IBEATgMBe8NqjIqp65CxRjjMxXIIUxIjBnAODJQRkSLQ/+lHBsjpv1BwwEawMo1c=

很明显DES加密,直接网站走起,得到flag:ctf{67a166801342415a6da8f0dbac591974}


7、lsb3 终极双图


binwalk发现有东西


foremost提取出两张图片


stegslove 结合一下(如果全黑代表着两张图片一模一样,每一个字节都一样(因为异或运算,00为黑)

xor发现全黑,难道这两个图片一模一样,别人的wp告诉我No

放大5000倍的景象

然后就自闭了,给个类似的wp,不弄了0x005图片隐写之双图对比+RGB通道隐写-CSDN博客


10、PNG IHDR1

一顿binwalk、foremost操作后,什么没发现,题目是IHDR,试试是不是修改宽高,直接化身脚本小子

# 判断宽高是否有问题
import zlib

image_data = open('图片路径', 'rb')
bin_data = image_data.read()
crc32key = zlib.crc32(bin_data[12:29])  # 使用函数计算
if crc32key == int(bin_data[29:33].hex(), 16):  # 对比算出的CRC和原本的CRC
    print('宽高没有问题')
else:
    print('宽高被改了')
# 修改
import binascii
import struct

crcbp = open("图片路径", "rb").read()  # 打开图片
crc32frombp = int(crcbp[29:33].hex(), 16)  # 读取图片中的CRC校验值
print(crc32frombp)

for i in range(4000):  # 宽度1-4000进行枚举
    for j in range(4000):  # 高度1-4000进行枚举
        data = crcbp[12:16] + \
               struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
        crc32 = binascii.crc32(data) & 0xffffffff
        # print(crc32)
        if (crc32 == crc32frombp):  # 计算当图片大小为i:j时的CRC校验值,与图片中的CRC比较,当相同,则图片大小已经确定
            print(i, j)
            print('hex:', hex(i), hex(j))
            exit(0)

执行第一个脚本时,显示宽高被改了,第二个:

用winhex修改宽高值后拿下

小tips:丢进linux里面发现图片打不开,应该也可以说明crc错误


10、PNG IHDR2

一来就裂开,直接丢进winhex修改png头

改完后打开,一眼图片没显示完

再次化身脚本小子


11、PNG IDAT

pngcheck

pngcheck -v 文件 #查看数块数据


png图片里的IDAT块数据会以IDAT开头,后面跟着它的数据


IDAT 块只有当上一个块充满时(一个IDAT块满长度为65524),才会继续一个新的块。

pngcheck 一下,发现倒数第二块还没满,说明最后一块有问题

脚本小子又来了,最后一段打开winhex发现是zlib(78 9C文件头是zlib标志)

# 解压zlib
import zlib
import binascii

id = ''
result = binascii.unhexlify(id)
print(result)
print()
result = zlib.decompress(result)
print(result)

尝试了二进制转换ascll失败,wp启动

发现这个01串长度是625(c的strlen函数算)

脚本小子启动

# 01串生成二维码
from PIL import Image

# MAX x MAX 矩阵
MAX = 25
pic = Image.new("RGB",(MAX, MAX))
str = ""
i=0
for y in range (0,MAX):
    for x in range (0,MAX):
        if(str[i] == '1'):
            pic.putpixel([x,y],(0, 0, 0))
        else:
            pic.putpixel([x,y],(255,255,255))
        i = i+1
pic.show()
pic.save("flag.png")


EXIF隐写

exif:记录数码照片的属性信息和拍摄数据


1、直接查看属性有没有备注

2、

exiftool

exiftool 文件,即可显示照片的信息


8、exif隐写1

方法一:直接看属性

方法二:

exiftool


9、exif隐写2

直接看属性有信息,但不全,用exiftool

base64解密拿下flag


GIF

文件头:47 49 46 38 或 GIF89A(47 49 46 38 39 61)
文件尾:00 3B

gif文件格式:GIF文件格式 - 简书 (jianshu.com)

12、GIF1 空间域

空间域:一帧帧的图片构成,每一帧的图片,都成了隐藏信息的一种载体

发现是GIF图,直接Frame Browser

可将每张图片分离出来,然后改一下rgb更好看

Y2F0Y2hfdGhlX2R5bmFtaWNfZmxhZ19pc19xdWl0ZV9zaW1wbGU=

!注意I不要写成1


13、GIF2 时间域

时间域:每一帧间的时间间隔作为信息隐藏的载体

解压后发现文件裂开了,直接开始修复,这个gif用GIF89A修复

winhex增加数据 右键-->编辑-->剪贴板数据-->粘贴,然后保存

我试着丢进Frame Browser 发现全部一样的,按照题目提示,时间域

ImageMagick

magick identify 文件:显示每一帧的情况

magick identify -format "%s %T\n" 文件 以序号和%T,可提取出有用的东西(我也不知道为什么有用),只留%T的话就剩下后面的10/20

这里的20和10 代表0、1或者1、0(两种都试一下)

丢进word里,搞出一堆0、1

最后二进制转ascll码得到flag


工具篇

特点

工具篇里图片都是jpg格式


17、steghide隐写01

本身以为题目的意思是藏在图层下面,stegslove一顿操作后,发现啥都没有,搜了一下原来steghide是工具,由于刚开始我没下,就直接binwalk了一下

提取出好多东西,一个jpg照片,一个加密pdf文档,以及原本的png照片

steghide

steghide工作流程:一个需要隐藏的文件用steghide的 参数加命令 隐藏进图片中,然后设置密码

steghide extract -sf 1.jpg -p 123456    #隐藏信息从载体中分离出来
#-sf  参数
#test.jpg  图片名称
#-p 密码参数,后面空格跟密码,无密码可不加参数

试了一下,发现有密码。


stegseek

用于爆破steghide信息隐藏时设置的密码

有密码:stegseek 图片 密码字典

检测和无密码提取元数据:stegseek --seed 图片

。。真尴尬,密码就是空,没事,拿到flag就行


18、steghide隐写01

有了前车之见,直接丢进kali里binwalk发现没东西,就steghide然后试一下空密码,发现不行,就用stegseek

拿下(本身还在想这是什么密码要解密的,后面改了一下ISO。。。那串东西发现KEY后面的两个特殊符号会变,就知道不是用的,给后面的字符串套上flag头提交)


19、outguess隐写

outguess

工作过程:

outguess -k “my secret key” -d hidden.txt 1.jpg 2.jpg
加密之后,1.jpg会覆盖2.jpg,hidden.txt的内容是要隐藏的东西。

outguess -r 图片 -t 文件

图片就是那张隐写图,文件是将隐藏的内容输出到该文件中


20、F5隐写

原理:【隐写术】F5隐写_Em0s_Er1t的博客-CSDN博客

在F5工具目录下使用命令

java Extract refresh.jpg -p refresh

密码一般是图片名,也可能是其他


21、stegdetect隐写

Stegdetect程序主要用于分析JPEG文件。 用Stegdetect可以检测到通过JSteg、JPHide、OutGuess、Invisible Secrets、F5、appendX和Camouflage等隐写工具隐藏的信息。


stegdetect.exe -tjopi -s 10.0 文件    #tjopi每个都有自己作用 -s是设置敏感度,默认为1,这条命名是判断隐写工具


发现用jphide隐写

但是jphide解密时需要密码。

图片是个二维码,草料解码一下

然后就懵逼了,看了wp后才知道这是培根密码:CTF-隐写术(二)_pcat.jpg-CSDN博客

拿到flag:CTF{123pcat321_Jphide}


22、Jphide隐写

丢进winhex里

里面藏着个hint.txt,binwalk+提取

拿到密码,jphide解密拿到flag


23、Jstego隐写

原理与代码:用到matlab:JSteg信息隐藏算法_Dennis F的博客-CSDN博客

使用工具: