考点:
图片隐写、zlib解压、二进制转二维码
题目:
1.拿到题目先使zsteg查看png图片内容,发现zlib数据。
2.使用010edit分离zlib文件到独立文件。
3.解压zlib文件
import zlib
with open('download.zlib', 'rb') as f:
compressed_data = f.read()
decompressed_data = zlib.decompress(compressed_data)
# 将解压后的内容保存到新的文件中
with open('decompressed_file.txt', 'wb') as output_file:
output_file.write(decompressed_data)
4.解压后为二进制文件
111111100000010010111111110000010110100101010000011011101001111110101011101101110101100011000101110110111010101010000010111011000001001010100001000001111111101010101010111111100000000111111000000000000101111010110001111011110111110000001000100011001011010110110001011111000010011110100001000110000101001011100011011110100000101010100101011111001101000011101000011011011111011010010011001100010001011001001110001011011111101100000000011101111100010010111111100100001010101010110000010111001101000110011011101011011001111111011101110101101010010110111110111010001010111000110111000001010111101001100111111111100011110110101000
5.在二进制数最后任意填充一位0或1,使为变为偶数,再使用随波逐流工具生成图片
或用脚本进行二进制转图片操作:
#-*- coding:utf-8 -*-
import binascii
from PIL import Image
string = '1111111000000100101111111100000101101001010100000110111010011111101010111011011101011000110001011101101110101010100000101110110000010010101000010000011111111010101010101111111000000001111110000000000001011110101100011110111101111100000010001000110010110101101100010111110000100111101000010001100001010010111000110111101000001010101001010111110011010000111010000110110111110110100100110011000100010110010011100010110111111011000000000111011111000100101111111001000010101010101100000101110011010001100110111010110110011111110111011101011010100101101111101110100010101110001101110000010101111010011001111111111000111101101010001'
MAX_num = len(string)
#对数据数目开平方根,因为二维码是正方形。
MAX=int(MAX_num ** 0.5)
pic = Image.new("RGB", (MAX, MAX))
i = 0
for y in range(0, MAX):
for x in range(0, MAX):
if(string[i] == '1'):
#putpixel将坐标为(x,y)的像素点变为(0,0,0)
pic.putpixel([x, y], (0, 0, 0))
else:
#putpixel将坐标为(x,y)的像素点变为(255,255,255)
pic.putpixel([x, y], (255, 255, 255))
i = i + 1
pic.show()
pic.save("qr.png")
输出的图片如图,放大直接用微信扫得到flag
本题坑点:
二进制数少一位,造成直接转换的话图片为乱码如下图:
因篇幅问题不能全部显示,请点此查看更多更全内容