flag藏在图片中,使用WinHex软件或者记事本打开,搜索发现flag。
像这种图片很明显是被修改过高度的,我们使用python脚本得出正常图片的宽高。
import zlib
import struct
filename = '1.png'
with open(filename, 'rb') as f:
all_b = f.read()
crc32key = int(all_b[29:33].hex(),16)
data = bytearray(all_b[12:29])
n = 4095
for w in range(n):
width = bytearray(struct.pack('>i', w))
for h in range(n):
height = bytearray(struct.pack('>i', h))
for x in range(4):
data[x+4] = width[x]
data[x+8] = height[x]
crc32result = zlib.crc32(data)
if crc32result == crc32key:
print("宽为:",end="")
print(width)
print("高为:",end="")
print(height)
exit(0)
得出的结果是:
使用软件WinHex打开那张图片,就能看到当前的图片的高是不对的:
在WinHex里把高改成01 df就可以了,得到正常图片:
使用小程序stegdetect来检测图片是不是用了jphide隐写。
在cmd中使用这个代码:stegdetect.exe -tjopi -s 10.0 jphide.jpg
密码破解使用字典,代码为stegbreak.exe -r rules.ini -f password.txt jphide.jpg
,得到密码为power123
再使用软件Jphswin来破解图片:
打开这个图片:
点击Seek,输入破解到的密码,再另存为txt文件就能得到flag。
需要在kali虚拟机里面使用outguess工具。
安装方法是:
git clone https://github.com/crorvick/outguess
# 进入outguess的目录
./configure && make && make install
一般图片属性-详细信息-备注里面会有图片的Key
把图片文件复制到虚拟机里面,然后使用代码outguess -k gUNrbbdR9XhRBDGpzz -r outguess.jpg -t 1.txt
能得到结果文件。
这个图片需要用Stegsolve这个工具进行反色,点击上面“>”
按钮得到:
再把下面的图片进行异或处理
用这个Image Combiner功能
当一张图片的WinHex里面有这些东西,说明这个图片有盲水印,先在kali里面使用binwalk,binwalk -e 1.png --run-as=root
得到了很多文件。
把压缩文件复制到实体机,得到两张盲水印图片:
使用python bwmforpy3.py decode day1.png day2.png flag.png --oldseed
即可得到flag图片。
有时候题目中会给这么一大串的0和1的组合,这时需要用到python脚本来进行画出二维码。
from PIL import Image
MAX = 60 #二维码长宽
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")
from PIL import Image, ImageDraw, ImageFont, ImageFilter
f1 = open(r'flag.txt','r')
width = 300
height = 300
image = Image.new('RGB', (width, height), (255, 255, 255))
draw = ImageDraw.Draw(image)
color = (0,0,0)
while 1:
s = f1.readline()
if not s:
break
s = s.strip('\n')
s = s.lstrip('(')
s = s.rstrip(')')
a = int(s.split(',')[0],10)
b = int(s.split(',')[1],10)
draw.point((a, b), fill=color)
image.show()
如果一个题目给的是一张灰度图片,那么大概率是进行了LSB隐写,使用python脚本解码即可出现结果。
from PIL import Image
p = Image.open('1.png').convert('L')
a,b = p.size
flag = Image.new('L',(a,b),255)
for y in range(b):
for x in range(a):
if p.getpixel((x,y))%2==0:
flag.putpixel((x,y),255)
else:
flag.putpixel((x,y),0)
flag.show()