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博客
使用工具: