文章来源 |MS08067 CTF实战1期作业
本文作者:dullydoll(CTF实战1期学员)
根据题目所提供的01序列,猜测可能是二维码,编写转换代码对其进行二维码转换,具体如下:
from PIL import Image
from zlib import *str = open("0和1能隐藏什么信息.txt").read()
# print(str)
MAX = 330
pic = Image.new("RGB", (MAX, MAX))
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 += 1
pic.show()
pic.save("m_3_1_flag.png")
转换结果如下图所示:
发现如果把上述结果划分为2*2的拼图,其位置需要调整。调整后得到真正的二维码如下图所示:
利用QR_Research工具扫描得到flag,如下图所示:
通过分析题目原始图片可以判断,图片显示不完整。将其载入010Editor编辑器可以看到,宽高值所在的数据区段CRC值报错,如下图所示:
因此编写相应代码对其宽高值进行爆破,具体如下:
import binascii
import struct
import datetimestart = datetime.datetime.now()
crcbp = open("1.png", "rb").read()
for i in range(2000):
for j in range(2000):
data = crcbp[12:16] + struct.pack('>i', i) + struct.pack('>i', j) + crcbp[24:29]
crc32 = binascii.crc32(data) & 0xffffffff
if crc32 == 0x6C7DB8B:
print(i, j)
print('hex: ', hex(i), hex(j))
end = datetime.datetime.now()
print("Running time: %s Seconds" % (end-start))
根据上述代码运行结果对原始图片宽高值进行修改,最终从完整图片中获得flag,如下图所示:
通过分析题目所提供的GIF图片,判断其应该是通过GIF时间轴的帧间间隔来隐藏信息。首先通过identify命令来查看帧间间隔,结果如下图所示:
由命令执行结果可知判断正确。之后通过shell命令组合将上述结果转换为01序列,如下图所示:
最后通过在线站点将上述结果转换为ASCII字符,最终获得flag,如下图所示:
查看题目所提供的GIF图片发现闪现一张二维码,因此首先利用StegSolve工具载入图片逐帧查看找到二维码,如下图所示:
我们发现上述二维码并不完整,缺少定位格。之后通过PS补全二维码,如下图所示:
最后利用QR_Research工具扫描二维码,获得flag,如下图所示:
lsb.png(LSB隐藏信息)
利用StegSolve工具载入题目图片,通过查看RGB各通道组合的图片效果,确定Red-0、Green-0、Blue-0通道有信息隐藏,如下图所示:
查看隐藏信息确定其为PNG格式的图片,将其保存查看,发现是一张二维码,如下图所示:
最后利用QR_Research工具扫描二维码,获得flag,如下图所示:
首先利用apngdis工具将题目图片切分为静态png图片集,如下图所示:
通过分析上述图片集发现每张图片上有像素值为(6,7,8)的点,因此编写相关代码将每张图片上的点提取组合,具体代码如下:
import os
from PIL import Imageflag_img = Image.new('RGB', (350, 400), "white")
path = r"./apng"
for root, dirs, files in os.walk(path):
for name in files:
png_path = os.path.join(root, name)
image = Image.open(png_path)
image = image.convert("RGB")
width, height = image.size
for w in range(width):
for h in range(height):
if image.getpixel((w, h)) == (6,7,8):
flag_img.putpixel((h, w), 0)
flag_img.save("flag.png")
flag_img.show()
代码执行结果如下图所示:
结果获取一张不完整的二维码图片。利用PS将其补全,然后利用QR_Research工具扫描,最终获取flag,如下图所示:
利用PS工具将二维码碎片调整拼接,最终获得一张二维码,如下图所示:
利用手机扫描上述二维码,最终获得flag,如下图所示:
分析题目所提供的数据,发现每行三个数值为一组,且所有数值没有超过255,因此判断其为RGB值集合。编写相应代码对原始数据进行还原,具体代码如下:
from PIL import Imagex = 2305
y = 1181
image = Image.new("RGB",(x,y))
f = open("怎么全是数字.txt")
for i in range(0, x):
for j in range(0, y):
line = f.readline()
rgb = line.split(" ")
image.putpixel((i,j), (int(rgb[0]),int(rgb[1]),int(rgb[2])))
image.show()
image.save("flag.png")
代码执行结果如下图所示:
题目所提供的JPG图片,右下角即存在QQ号水印,如下图所示:
如果你也想零基础开启CTF之路
看这里👇👇👇
— 实验室旗下直播培训课程 —