BUUCTF:[MRCTF2020]千层套路

题目描述

在这里插入图片描述

解题思路

在这里插入图片描述
打开压缩包后发现有Hint,使用Ziperello爆破一下密码,可以看到压缩包的四位数字名称就是解压压缩包的密码,通过写一个python脚本应该就能解决。脚本我放在后面了。
在这里插入图片描述解压出一个qr.txt的文本文件。
在这里插入图片描述这个可以通过RGB转图片,随波逐流的这个功能做出来显示的长:宽=4:1,需要自己写脚本重写。最后出来的二维码如图:
在这里插入图片描述flag{ta01uyout1nreet1n0usandtimes}

解压脚本

解压缩脚本

这个需要解压很多个压缩包,需要注意路径问题,最好使用相对路径写脚本。如果使用绝对路径的话很容易出现问题。如图:
在这里插入图片描述以下是可以运行的解压代码,将解压过程中的路径设置为相对于当前工作目录的路径。这样可以有效减少路径长度并避免 WinError 206 错误。

import zipfile
import os
import shutil


def extract_all_layers(zip_file, max_layers=100):
    current_file = zip_file
    layer_count = 0

    # 设置一个临时的工作目录,尽量减少路径长度
    base_dir = os.path.join(os.getcwd(), "temp_extraction")
    os.makedirs(base_dir, exist_ok=True)
    relative_path = os.path.basename(current_file)

    # 复制初始压缩文件到临时目录
    shutil.copy(current_file, os.path.join(base_dir, relative_path))
    current_file = os.path.join(base_dir, relative_path)

    while True:
        if layer_count >= max_layers:
            print("达到最大解压层数限制")
            break

        try:
            # 获取当前压缩包名称作为密码
            password = os.path.basename(current_file).replace('.zip', '')
            extract_folder = os.path.join(base_dir, password)

            os.makedirs(extract_folder, exist_ok=True)

            with zipfile.ZipFile(current_file, 'r') as zip_ref:
                try:
                    zip_ref.extractall(extract_folder, pwd=bytes(password, 'utf-8'))
                except RuntimeError:
                    print(f"解压失败,可能是密码错误: {password}")
                    break
                extracted_files = zip_ref.namelist()
                print(f"解压到: {extract_folder}, 解压文件: {extracted_files}")

            if len(extracted_files) == 1:
                extracted_file = os.path.join(extract_folder, extracted_files[0])
            else:
                print("无法处理多个文件或文件结构异常")
                break

            # 删除已解压的 zip 文件
            os.remove(current_file)

            # 更新当前文件为解压后的文件
            current_file = extracted_file
            layer_count += 1

            if not zipfile.is_zipfile(current_file):
                print(f"最终解压的文件: {current_file}")
                break

        except (zipfile.BadZipFile, FileNotFoundError, OSError) as e:
            print(f"解压失败: {e}")
            break

    # 完成后将最终文件移动到工作目录外的目标路径
    final_output = os.path.join(os.path.dirname(zip_file), os.path.basename(current_file))
    shutil.move(current_file, final_output)
    print(f"最终解压文件移动到: {final_output}")

    # 删除临时工作目录
    shutil.rmtree(base_dir, ignore_errors=True)


# 初始压缩包路径
initial_zip = r'C:\Users\wzying\Downloads\0573\0573.zip'
extract_all_layers(initial_zip, max_layers=10000)

RGB转图片脚本

这个是在别人的wp里面找的脚本,很好用

from PIL  import Image
string=''

file=open('qr.txt')
MAX=200

picture=Image.new("RGB",(MAX,MAX))
for y in range(MAX):
    for x in range(MAX):
        string =file.readline()
        picture.putpixel([x,y],eval(string)) #直接使用eval()可以转为元组
picture.show()
  • 3
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Wzying233

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值