技术内容 / 本科的一些学习笔记和wp / ISCC擂台赛misc之开开眼界
ISCC擂台赛misc之开开眼界
https://blog.csdn.net/qq_42880719/article/details/124574934套神tql
扫!
最近聊到批量扫二维码,正好前段时间收集到一个批量解码的工具
我就说“梭啊一把梭”,于是星爷就给我找来了一个题让我梭梭试试
扫了一会全是简单的假flag,就没思路了
去搜了搜,在套神博客里发现这居然是ISCC2022的擂台题
考查知识点:QR CODE的mask pattern、Rar4伪加密(带非预期)、ImageIN
氪金测试(?
首先直接解压,能解压出3w+的文件夹和8w+的二维码
随便进入一个文件夹,如0,发现下面有三个文件,尝试分别扫描
结果分别是no_flag no_flag flag_where?
全部扫描后去重,即可将8种内容全部得到,为['flag_not_here','no_flag','flag{fake_flag}','whereisflag','<NA>','flag_where?','flag_other_file','flag_zipped']
And then,可以计算一下有多少种不同的二维码,这一步是当天就有师傅做了的,有64种。
继续看第0个文件夹能够发现这三张二维码一共使用了两种不同的mask pattern,但都是L模式
怎么说呢,一共8种内容,正好64/8=8,也正好说明使用了8种mask pattern
这三张的pattern根据1.png 2.png 3.png的顺序进行排序,分别为1 2 2
pattern的范围为0-7,正好每个文件夹下只有最多3张二维码,将122从8进制转到ascii之后,能得到字符’R’
多转换几个之后,发现正好是rar的文件头Rar
因此编写一个脚本,取所有的pattern并转换成16进制后写入文件
from PIL import Image
from tqdm import tqdm
import os
f = open('output.rar','w+')
pattern = ['001000111','110011111','010101101','101110101','111101100','000110100','100000110','011011110']
for i in tqdm(range(31091)):
path = f'./challs/{str(i)}/'
file_list = os.listdir(path)
this_bit = ''
for j in file_list:
img = Image.open(f'{path}{j}')
tmp = ''
for k in range(9):
if(img.getpixel((8,k)) == 0):
tmp += '1'
else:
tmp += '0'
ind = pattern.index(tmp)
this_bit += str(ind)
this_bit = hex(int(this_bit,8))[2:].zfill(2)
f.write(this_bit)
# print(chr(int(this_bit,16)))
okey,此时得到了他的hex数后,使用cyberchef或notepad++草convert功能进行转换,即可得到一个rar
直接打开此rar,发现需要密码,可是刚刚明明没有得到密码呢?
用010查看,发现该rar为rar4,而且没有报错,难道是真加密吗?
这里查看一下加密位,发现虽然需要密码,但并没有加密
因此猜测为伪加密,将上面的1改成0后,save,再f5刷新一下,提示crc错误
将7088改成5b5d
即可正常解压,为什么要加粗呢,是应该用winrar等软件,在输入密码的时候直接按确定,也可以直接解压。算是非预期吧,Tokeii发现的,我只用360所以没发现。
解压出来后是一张logo,文件尾有一串base64,解码
flag{this_is_flag?}
Maybe SomeThing IN it!
最后锁定ImageIn,拖到软件里即出flag