ISCC2025|MISC

一、校级赛

1、书法大师

解压缩得到图片,尾部有zip文件,爆破解压缩密码

得到解压缩密码:L9k8JhGfDsA,解压缩后得到TXT

石上 巧圾 少慢 为中 石乙 巾卫 找片 找〇 尖右 年海 生圾 作一 生市 少国 时〇 女尖 丙一 众普 丙刀 工那 虫虫 石一 个蓝 马睡

ISCC{iz5jPzzBTz}

2、反方向的钟

题目附件给了3个文件,只有TXT文件有用,0宽隐写得到XOR密钥,TXT文本Base64解码后异或得到flag

3、碎片真相

‍不会,有哪位佬做出来,望赐教

二、区域赛

1、返校之路

压缩包里套着2个zip文件,part1.zip伪加密,7z直接查看

掩码爆破part2_3.zip

解压缩密码:bfsYfx,解压缩后得到3张图片

1.JPG尾部有PNG,导出是PNG的二维码图片

扫码得到提示

picture2.png是LSB隐写

MNVUM2KXIRUFQU2VN46Q====
Base32,Base64
rAbX8WIJ

3.JPG右键可以看到提示

朝阳站到魏公村站,就是3号线-10号线-4号线

ISCC{rAbX8WIJ3104}

2、取证分析

题目给了hint.vmem和attachment-19.docx,R-STUDIO加载恢复桌面的hahaha.zip文件

发现需要解压缩密码,寻找镜像里没找到解压缩密码,尝试字典爆破失败。联想到上一道题目btf???的密码格式,继续掩码爆破

得到解压缩密码bfs775,解压缩后得到3个TXT文件,从hint.txt里rxms{ husqzqdq oubtqd }

得到提示是维吉亚尼解密,从Alphabet.txt里

(2,10) (4,8) (2,4) (3,4) (11,13) (2,11) (1,1) (10,26) (5,6) (5,9)
杨辉三角是一种经典的数学数表,以中国古代数学家杨辉的名字命名。它是一个三角形数组,其中每个数字都是其上方两个数字的和。杨辉三角在组合数学、概率论和二项式定理等领域有广泛应用

盲猜括号里代表杨辉三角的列和行,(2,10)即第10行的第2个数字,脚本

from math import comb

def number_to_letter(num):
    """将数字转换为字母,1->A, 2->B, ..., 26->Z,超过26的取模"""
    mod = (num - 1) % 26 + 1  # 确保结果在1-26之间
    return chr(ord('A') + mod - 1)

# 原始坐标数据 (列, 行)
coordinates = [
    (2, 10), (4, 8), (2, 4), (3, 4), (11, 13),
    (2, 11), (1, 1), (10, 26), (5, 6), (5, 9)
]

# 计算字母序列
letters = []
for coord in coordinates:
    col = coord[0]
    row = coord[1]

    # 检查列是否超过行
    if col > row:
        calc = "无效(列>行)"
        value = "N/A"
        letter = "?"
    else:
        calc = f"C({row-1}, {col-1})"
        value = comb(row - 1, col - 1)
        letter = number_to_letter(value)
        letters.append(letter)  # 添加到字母序列

    print(f"行:{row:2},列:{col:2},组合数:{calc:10},最终值:{str(value):<7},字母:{letter}")

# 输出最终字母序列
print("\n最终字母序列:", end=" ")
for letter in letters:
    print(letter, end="")

运行结果

行:10,列: 2,组合数:C(9, 1)   ,最终值:9      ,字母:I
行: 8,列: 4,组合数:C(7, 3)   ,最终值:35     ,字母:I
行: 4,列: 2,组合数:C(3, 1)   ,最终值:3      ,字母:C
行: 4,列: 3,组合数:C(3, 2)   ,最终值:3      ,字母:C
行:13,列:11,组合数:C(12, 10) ,最终值:66     ,字母:N
行:11,列: 2,组合数:C(10, 1)  ,最终值:10     ,字母:J
行: 1,列: 1,组合数:C(0, 0)   ,最终值:1      ,字母:A
行:26,列:10,组合数:C(25, 9)  ,最终值:2042975,字母:Y
行: 6,列: 5,组合数:C(5, 4)   ,最终值:5      ,字母:E
行: 9,列: 5,组合数:C(8, 4)   ,最终值:70     ,字母:R

最终字母序列: IICCNJAYER

根据提示这应该是维吉尼亚的密钥,密文应该在DOCX中,docx修改后缀为zip,找了半天在[Content_Types].xml中找到一段类似密文的注释:luaauosenfts

维吉尼亚解密

ISCC{dmyyhfsgjolk}

3、签个到吧

题目附加解压缩得到1个二维码flag_is_not_here.jpg,扫码提示:都说了这里没有flag,另一个ZIP文件修复头部

解压缩后得到PNG,打开一眼Arnold变换,变换参数未知

LSB隐写:ArnoldEncryption1112

1112一开始以为参数是1、1、12或1、11、2或11、1、2,但都不对,脑洞是1、1、-2

观察还原出来的二维码,发现定位块位置有问题,需要向左旋转90度

颜色反相

反相后的图片与flag_is_not_here.jpg异或,可以得到完整的二维码图片

异或后的图片无法扫码识别,反相后可以正常扫码识别

ISCC{mfrxhZYGfAw8}

4、睡美人

开局一张图,图片尾部有zip文件,分离出来,解压缩需要密码,盲猜密码要从PNG图片中获取

分析图片未发现隐写,此处脑洞,题目提示:红红红红红红绿绿绿蓝,一共10个字,红是60%,绿30%,红10%,计算出所有像素的R、B、A值,然后乘百分值,最后相加,脚本分析

解压缩密码:1375729349.6,解压缩后,得到normal_speech_32.wav文件

发现WAV分成两部分,第一部分是很正常的语音,提示有隐藏信息,能否找出来,第二部分从第6秒开始,类似于脉冲声音,工具分析

频域解码:10111100100111101001001010010000100010101001100110010011
时域解码:01000011011000010110110101101111011101010110011001101100
联合解码:01000011011000010110110101101111011101010110011001101100

时域解码的比特值可以二进制转可见字符

ISCC{Camoufl}

5、神经网络迷踪

import torch
import sys
import re
from libnum import n2s

def analyze_pth_file(pth_file):
    # 加载模型文件
    try:
        state = torch.load(pth_file, map_location="cpu", weights_only=True)
    except Exception as e:
        print(f"加载文件失败: {e}")
        return None
    return state

def display_tensor_info(state):
    # 显示基本信息
    print("\n=== 模型张量概览 ===")
    for name in state:
        tensor = state[name]
        print(f"{name:20} | shape={str(tuple(tensor.shape)):15} | dtype={str(tensor.dtype):10}")

    # 显示每个张量的详细数据
    print("\n=== 张量详细数据 ===")
    for name in state:
        tensor = state[name]
        print(f"\n【张量名称】:{name}")

        # 处理张量数据
        t_flat = tensor.flatten()
        if t_flat.is_floating_point():
            t_flat = t_flat.round()

        # 转换为整数列表
        ints = []
        tensor_ints = t_flat.to(torch.int64)
        for i in range(len(tensor_ints)):
            ints.append(tensor_ints[i].item())

        print(f"整数值:{ints}")

        # 转换为字节表示
        byte_data = b""
        for i in ints:
            tmp = n2s(i)
            if len(tmp) == 0:
                byte_data = byte_data + b"\x00"
            else:
                byte_data = byte_data + tmp

        print(f"Bytes (hex):{byte_data.hex()}")
        print(f"Bytes (repr):{repr(byte_data)}")

        # 尝试UTF-8解码
        try:
            decoded = byte_data.decode('utf-8', errors='strict')
            print(f"UTF-8解码:{decoded}")
        except UnicodeDecodeError:
            print("UTF-8解码失败")
        except:
            print("解码时发生错误")

def extract_potential_flags(state):
    print("\n=== 尝试从所有张量中提取数据 ===")

    def tensor_to_text(tensor, scale):
        """将张量转换为文本,尝试不同的缩放方法"""
        nums = [int(torch.round(v*scale)) & 0xFF for v in tensor.flatten()]
        try:
            return bytes(nums).decode('utf-8')
        except UnicodeDecodeError:
            return ''

    flag_pattern = re.compile(r'[ -~]{4,20}')  # 放宽长度限制

    found_flags = False

    for tensor_name, tensor in state.items():
        print(f"\n检查张量:{tensor_name}")
        # 尝试不同的缩放方法
        scales = [0.01, 0.1, 1, 100, 255, 500, 1000]  # 多种可能的缩放因子
        for scale in scales:
            text = tensor_to_text(tensor, scale)
            if text and flag_pattern.fullmatch(text):
                print(f"发现可打印字符 (scale={scale}):{text}")
                found_flags = True

        # 检查原始整数值
        if tensor.dtype in (torch.int32, torch.int64):
            try:
                int_text = bytes([x & 0xFF for x in tensor.flatten().tolist()]).decode('utf-8')
                if int_text and flag_pattern.fullmatch(int_text):
                    print(f"发现潜在可打印字符 (原始整数值):{int_text}")
                    found_flags = True
            except:
                pass

    if not found_flags:
        print("未在任何张量中发现符合格式的可打印字符")

pth_file = "attachment-38.pth"
state = analyze_pth_file(pth_file)
if state is not None:
    display_tensor_info(state)
    extract_potential_flags(state)

另外有非预期解,就是用7z直接打开pth文件,就能看见model_xxxx的文件夹,xxxx就是对应的flag,后续修复了。

ISCC{awtd}

6、八卦

时序乾坤震巽坎离艮兑

010 Editor查看是GIF文件,添加后缀,尾部还有1个7z文件,直接分离

7z文件解压缩需要密码,盲猜密码从GIF文件获取,工具导出GIF信息

一共导出6帧图像,每帧图像间隔时间不同

第[0]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间200
第[1]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间300
第[2]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间200
第[3]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间300
第[4]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间200
第[5]帧,图像大小408x403,帧大小408x403,X偏移0,Y偏移0,间隔时间300

200 300 200 300 200 300

0、1、2、4帧图像上存在Base编码

0帧:5Lm+5Li65aSp
乾为天 乾乾

1帧:4WY3DZVQWTUJFGl=
山水蒙 艮坎

2帧:5rC06Zu35bGv
水雷屯 坎震

4帧:42YLJZNEVHUZZAA=
水天需 乾坎

每一帧都存在LSB隐写

坤为地 坤坤

至此获得了六十四卦中的五卦,且是前五卦

第一卦 乾 乾为天 乾上乾下
第二卦 坤 坤为地 坤上坤下
第三卦 屯 水雷屯 坎上震下
第四卦 蒙 山水蒙 艮上坎下
第五卦 需 水天需 坎上乾下

方法一:根据Hint一共就七卦,穷举所有密码组合

import itertools

bagua = ["乾","兑","离","震","巽","坎","艮","坤"]
pwd = "乾乾坤坤坎震艮坎坎乾"

out = ""
for i in itertools.product(bagua,repeat=4):
    out = out + pwd + "".join(i) + "\n"
print(out)

可以得到4096个密码组合,保存成字典,中文字典ANSI编码,直接爆破

解压缩密码:乾乾坤坤坎震艮坎坎乾艮坤兑兑

方法二:开脑洞,帧时间间隔分析:200 300 200 300 200 300,指的是第二十三卦艮坤;帧内容分析:0、1、2、4帧图像上存在Base编码,111010,二进制转十进制;第五十八卦兑兑

U1ZORFEzdFlUMnA1YVdGaWVuTm1ORE00ZlE9PQ==,连续2次Base64解码

ISCC{XOjyiabzsf438}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值