文章目录
一、zlib_rar+exif+分析像素_zip
第一届深育杯misc,brige.png
使用binwalk分析出有zlib数据,但是无法使用binwalk -e或foremost分离出有效文件,在010editor中查看图片。

(1)运行命令 pngcheck.exe -v xx.png,可以详细查看每个数据块的情况


或者(2)010 editor中看到最后一个IDAT数据块长度异常,导出这段zlib数据。(编辑–>复制为十六进制文本,粘贴到txt中)
观察IDAT标识后面的87 9C两个字节,恢复成zlib数据头标识78 9C,写python3脚本将此段zlib数据解压缩,可得到一个rar压缩包。
注意解压缩的zlib数据应该是去掉IDAT-length、IDAT-type、IDAT-crc的数据部分,即只有(78 9C … 60 A5 85 A2)。

import zlib
data = open("zlib_hex_data.txt", 'r').read().replace(" ", "").replace("\n", "").strip()
data_dec = zlib.decompress(bytes.fromhex(data))
print(data_dec[:100])
with open("zlib_data.rar", 'wb') as wf:
wf.write(data_dec)
# 结果:b'Rar!\x1a\x07\x01\x00J\x97,}\x0c\x01\x05\x08\x00\x07\x01\x01\x96\x9c\x87\x80\x00\xf7\xea}W\x13\x03\x02\xbd\x00\x04\xbd\x00\x00\x90:\xd1\xdc\x80\x00\x00\x03CMT\xe5\xa6\x82\xe6\x9e\x9c\xe4\xbd\xa0\xe4\xb8\x8d\xe7\x9f\xa5\xe9\x81\x93\xe8\xbf\x99\xe6\x98\xaf\xe4\xbb\x80\xe4\xb9\x88\xe4\xb8\x9c\xe8\xa5\xbf\xef\xbc\x8c\xe5\x8f\xaf\xe4\xbb\xa5\xe5\x8e\xbb\xe7\x9c\x8b'
解压压缩包可得flag2,注意压缩包中有提示请先获取flag1。

继续找flag1,分析最开始的那张图片,实际使用zsteg和zsteg可以发现其他可以信息。
ExifTool可以提取照片exif信息。可交换图像文件格式(英语:Exchangeable image file format,官方简称Exif),是专门为数码相机的照片设定的,可以记录数码照片的属性信息和拍摄数据。
exiftool安装:
sudo apt install libimage-exiftool-perl
exiftool看到Copyright(版权)是十六进制,转换成文本:dynamical-geometry(动态几何),这个是后面的密钥。
bytes.fromhex('64796e616d6963616c2d67656f6d65747279')
# b'dynamical-geometry'

zsteg发现这张图片除了存在extradata外,在中也有脏数据。

使用StegSolve检查隐写。

导出十六进制,这里不能直接打开图片,可使用foremost将PNG快速分离出来,最后得到一张590x590,大小为979KB的图片.。
注意如果仅去掉PNG字符前数据并改后缀为PNG也能正常查看图片,但会阻塞下一步分析像素操作。
到这里只有一张色彩值杂乱的PNG图片,分析其像素。
from PIL importImage
image = Image.open(r'bri.png')
allpixels = []
for x in range(image.width):
for y in range(image.height):
allpixels.append(image.getpixel((x, y)))
print(len(allpixels)) # 348100
print(allpixels[:4])
# [(40, 176, 80), (37, 181, 75), (1, 253, 3), (2, 252, 4)]
# 0x50 0x4B 0x03 0x04
取前四个字节即可看出,像素第三列隐藏着压缩包十六进制,批量提取并保存成zip压缩包,使用前面得到的密码:dynamical-geometry解密,得到flag1文件。
from PIL importImage
image = Image.open(r'bri.png')
allpixels = []
for x in range(image.width):
for y in range(image.height):
if image.getpixel((x, y)) == (0, 0, 0):
continue
allpixels.append(image.getpixel((x, y))[2])
hex_datalist = [str(hex(i))[2:].zfill(2) for i in allpixels]
print("".join(hex_datalist)[:100])
# 504b0304140009006300caa05753d904fdb22a4b0500dce856000f000b00666c6167312d61736369692e73746c0199070001
with open("outpur.txt", 'w') as wf:
wf.write("".join(hex_datalist))
记事本打开文件后,是3D打印模型中的STL格式文件,STL格式分为ascii、binary格式,使用在线工具查看模型即可。
使用在线网站查看stl,根据flag1的STL格式,将flag2也尝试用STL预览器查看:
https://www.viewstl.com/#!
二、YCrCb通道隐写
2021“西湖论剑”网络安全大赛YUSA的小秘密
这题采用的YCrCb通道。通过 cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)对 img 图片数据进行色彩空间转换,即可得到三个通道的数据,然后对三个通道的数据分别根据奇偶做二值化处理并保存为图片。
from cv2 import *
import cv2 as cv
img=cv2.imread('C:\\Users\\XXX\\Desktop\\yusa\\yusa.png')
src_value=cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)
a, b, c = cv.split(src_value) #使用cv.split分离通道
cv.imwrite('a.png', (a % 2) * 255) #对三个通道中的数据分别根据奇偶做二值化处理,并分别保存为图片
cv.imwrite('b.png', (b % 2) * 255)
cv.imwrite('c.png', (c % 2) * 255)
运行后会得到三个通道的图片,在其中a.png即可清晰看到flag
2020ByteCTF Hardcore Watermark 01
图片中每个像素可以通过三个值(通道)来表示,常见的是 R(red)G(green)B(blue) 模式。而本题用到的通道是 YCrCb。通过 cv2.cvtColor(img, cv2.COLOR_BGR2YCrCb)对 img 图片数据进行色彩空间转换,即可得到三个通道的数据:

对三个通道中的数据根据奇偶做二值化处理,也即判断数据的最低位:
dst_value = (src_value % 2) * 255
二值化后的数据分别代表二维码的黑和白,并且每个通道可得到部分二维码图片。最后只需将三个通道数据结合到一幅图中即可复现二维码。
如果不对三通道进行拆分的话,直接提取RGB通道会造成非常多的噪点,无法识别。但是可以搜到原图进行了diff,这样能减少大部分的噪点。再结合QRazyBox工具对二维码进行还原,也可以拿到flag的内容。
QRazyBox二维码拼接网站
Linux diff 命令
三、gif二维码
安恒月赛 DASCTF 7月赛QrJoker
题目是一个gif,都是只有一点点的二维码

使用脚本切割一下:
from PIL import Image
import os
gifFileName = 'QrJoker.gif'
#使用Image模块的open()方法打开gif动态图像时,默认是第一帧
im = Image.open(gifFileName)
pngDir = gifFileName[:-4]
#创建存放每帧图片的文件夹
os.mkdir(pngDir)
try:
while True:
#保存当前帧图片
current = im.tell()
im.save(pngDir+'/'+str(current)+'.png')
#获取下一帧图片
im.seek(current+1)
except EOFError:
pass
https://merricx.github.io/qrazybox/
这个高是420 一个格子20 420/20=21
得出是21*21格子然后开始操作


在当中选择这个模式,就可以填充了



%56%6A%49%77%65%45%35%48%52%6B%64%69%4D%33%42%72%55%6A%4E%53%55%46%6C%58%4D%54%52%6A%4D%57%52%79%57%6B%5A%61%54%31%5A%55%52%6C%5A%5A%56%57%51%30%56%32%31%57%63%6B%31%45%52%6C%56%4E%56%6B%70%78%56%47%78%56%4E%56%4A%58%53%6B%68%68%52%54%6C%58%54%56%5A%56%64%31%59%79%4D%58%64%69%4D%6B%5A%79%54%6C%52%61%55%6C%64%49%51%6D%46%57%61%32%52%50%54%6C%5A%52%65%46%6F%7A%5A%44%46%56%56%44%41%35
解码一下
VjIweE5HRkdiM3BrUjNSUFlXMTRjMWRyWkZaT1ZURlZZVWQ0V21Wck1ERlVNVkpxVGxVNVJXSkhhRTlXTVZVd1YyMXdiMkZyTlRaUldIQmFWa2RPTlZReFozZFFVVDA5
base64
V20xNGFGb3pkR3RPYW14c1drZFZOVTFVYUd4WmVrMDFUMVJqTlU5RWJHaE9WMVUwV21wb2FrNTZRWHBaVkdONVQxZ3dQUT09
base64
Wm14aFozdGtOamxsWkdVNU1UaGxZek01T1RjNU9EbGhOV1U0Wmpoak56QXpZVGN5T1gwPQ==
base64
ZmxhZ3tkNjllZGU5MThlYzM5OTc5ODlhNWU4ZjhjNzAzYTcyOX0=
base64
flag{
d69ede918ec3997989a5e8f8c703a729}
一个神仙的脚本
from PIL import Image
from Crypto.Util import number
import base64
dic = {
0:'0',1:'1',2:

本文详细解析了zlib_rar、exif、YCrCb通道隐写、gif二维码、ASCII码水印等技术在网络安全比赛中的应用,展示了从图片分析到密码获取的全过程,包括解压缩、通道处理、隐写爆破等技巧。


&spm=1001.2101.3001.5002&articleId=121512575&d=1&t=3&u=c3bd4c474ee44a31a5b1dcb29714ca2f)
6559

被折叠的 条评论
为什么被折叠?



