在网上看了很多类似解题步骤和说明,感觉对小白都不友好,于是决定搜集整理下,做个详尽的解题步骤:
压缩包解压得到36个无后缀名文件和一个flag.zip压缩包
再看压缩包,解压发现有压缩密码,用winhex查看是不是伪加密,在末尾发现一串可疑字符串,
拷贝下来留用:
GNATOMJVIQZUKNJXGRCTGNRTGI3EMNZTGNBTKRJWGI2UIMRRGNBDEQZWGI3DKMSFGNCDMRJTII3TMNBQGM4TERRTGEZTOMRXGQYDGOBWGI2DCNBY
再用winhex打开几个无后缀名文件,发现都是一些jpg图片文件,
---------------------------------------------------------------------------------------------------------------------------------
笔者系统是win11,决定使用powershell命令给所有无后缀名文件添加.jpg后缀名,命令如下
注意:要切换到你真实图片所在路径执行命令
Get-ChildItem -File | Where-Object { -not $_.Extension } | Rename-Item -NewName { $_.Name + ".jpg" }
发现是一些二维码碎片,一共36个需要拼图,真头疼,不会直接去拼图吧!用winhex查看我上图标记的三个好识别三个特殊位置的图片,发现了规律在尾部FFD9文件尾部有字符串编号,按顺序拼图即可
先借用 大佬的python脚本把36个图片按尾部字符串排序为标准把文件改名排序
import os
# 获取目录下文件名列表
dir_list = os.listdir('./')
# 从列表中依次读取文件
for file in dir_list:
if '.jpg' in file:
f = open('./' + file, 'rb') # 使用二进制打开文件,此处注意'./'代表在当前目录,脚本必须拷贝在当前目录运行
n1 = str(f.read()) # 读取文件
n2 = ''
# 这里是尝试后发现最后一位为单引号,对于序号为一位数的文件倒数第三位为9,所以限制条件
if '1' <= n1[-3] <= '3':
n2 += n1[-3]
if '0' <= n1[-2] <= '9':
n2 += n1[-2]
f.close() # 先关闭文件才能重命名,否则会报`文件被占用`错误
os.rename('./' + file, n2 + '.jpg') # 重命名文件
1 | 2 | 3 | 4 | 5 | 6 |
7 | 8 | 9 | 10 | 11 | 12 |
13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 |
31 | 32 | 33 | 34 | 35 | 36 |
使用ps把每个图批量修改为100X100大小
按上图拼图即可,网上好多人用ps拼图,太烦人了,找chatgpt搞了个脚本,略微修改下就可以用
from PIL import Image, ImageDraw
# 创建新的正方形图像
result_image = Image.new('RGB', (600, 600))
# 循环遍历36张图片
for i in range(1, 37):
# 生成文件名
filename = f"image{i:02d}.jpg"
# 打开图片
image = Image.open(filename)
# 缩放图片
image = image.resize((100, 100))
# 计算图片在正方形图像中的位置
x = (i - 1) % 6 * 100
y = (i - 1) // 6 * 100
# 将图片粘贴到正方形图像上
result_image.paste(image, (x, y))
# 保存拼接后的正方形图像
result_image.save("result_image.jpg")
改脚本容易出错,直接改文件名也可,先把1-9文件拷贝到别处
再拷回原处
---------------------------------------------------------------------------------------------------------------------------------
综上所述,我需要把36张二维码图片,先添加jpg后缀名,再根据文件末尾的二进制字符串编号修改文件名按照image01.jpg、image02.jpg...image10.jpg、image11....修改,下面是我修改的jhzzfpx.py可以实现。这样就越过了繁琐的改名过程。可以在原始下载目录直接运行。
import os
# 获取目录下文件名列表
dir_list = os.listdir('./')
# 从列表中依次读取文件
for file in dir_list:
if '.' not in file: # 判断文件名中是否包含'.'
os.rename('./' + file, file + '.jpg') # 为无后缀名的文件加上'.jpg'后缀名
# 获取目录下文件名列表
dir_list = os.listdir('./')
# 从列表中依次读取文件
for file in dir_list:
if '.jpg' in file:
f = open('./' + file, 'rb') # 使用二进制打开文件,此处注意'./'代表在当前目录,脚本必须拷贝在当前目录运行
n1 = str(f.read()) # 读取文件
n2 = ''
# 这里是尝试后发现最后一位为单引号,对于序号为一位数的文件倒数第三位为9,所以限制条件
if '1' <= n1[-3] <= '3':
n2 += n1[-3]
if '0' <= n1[-2] <= '9':
n2 += n1[-2]
f.close() # 先关闭文件才能重命名,否则会报`文件被占用`错误
if len(n2) == 1:
n2 = '0' + n2 # 如果n2是个位数,前面加0
os.rename('./' + file, 'image' + n2 + '.jpg') # 重命名文件
#这样,文件名将会按照"image01.jpg"、"image02.jpg"、"image03.jpg"等形式进行修改。
上拼图代码awjmpt.py,具体内容如下:
from PIL import Image, ImageDraw
# 创建新的正方形图像
result_image = Image.new('RGB', (600, 600))
# 循环遍历36张图片
for i in range(1, 37):
# 生成文件名
filename = f"image{i:02d}.jpg"
# 打开图片
image = Image.open(filename)
# 缩放图片
image = image.resize((100, 100))
# 计算图片在正方形图像中的位置
x = (i - 1) % 6 * 100
y = (i - 1) // 6 * 100
# 将图片粘贴到正方形图像上
result_image.paste(image, (x, y))
# 保存拼接后的正方形图像
result_image.save("result_image.jpg")
在cmd命令切换到图片目录,执行python awjmpt.py执行后
估计这拼图是所有类似解题最精准的,毕竟人工有误差
扫码得
貌似是压缩包注释的哪串字符串加密方式,反过来解密,解密顺序为:
base32-base16-rot13-ascii85-base64-ascii85
base32密文(即flag.zip里的注释)如下:
使用basecrack解密所有base密文
1、base32-base16,在basecrack.py所在目录运行powershell
rot13-base85
flag.zip密码
解压得到flag :
标签:文件,BUUCTF,python,image,jpg,result,file,贝斯,图片 From: https://blog.csdn.net/weixin_34979095/article/details/141030814