ctfshow MISC 2023愚人杯做题笔记

2023愚人杯

1.奇怪的压缩包

下载的题目压缩包是ZIP伪加密,修改后,解开得一个图片文件black.png。使用01编辑器打开,发现尾部有一个压缩包。

 把尾部的压缩包另存后,发现该压缩包为加密包。再用01打开,发现尾部有一个base64码串eXVyZW5qaWU=,解码后得yurenjie,猜测为加密密码。

解压后,得到一个图片,打开显然只显示一半。使用01打开,图片文件高度203,修改为400,保存后,就能显示flag

2. 阿尼亚哇库哇库

压缩包为加密包,有提示信息,解压密码应该是这个级数的前12位有效数字。这里的坑是n是从0开始。2.71828182846

key = 2
n_jc=1
i = 1
keystr1 = ''
keystr2 = '1'
while True:
    i += 1
    n_jc  *= i
    key += 1 / n_jc
    keystr1 = keystr2
    keystr2 = str(key)
    print(i,'----------------------')
    print(keystr1)
    print(keystr2)
    
    if len(keystr2) > 15 and keystr1[:15] == keystr2[:15]:
        break
#17 ----------------------
#2.718281828459043
#2.7182818284590455

解压后,先看HINT.png,图片打不开

使用01打开:

 发现文件头有问题,前几位修改为89 50 4E 47后,图片打开依然不正常。发现长高尺寸不对。用脚本根据CRC值,爆破得长高值,填入后,打开正常。

 爆破脚本:

import zlib
import struct

#根据png的CRC校验值,爆破png图片的宽w高h
filename = 'HINT1.png'
with open(filename, 'rb') as f:
    all_b = f.read()
    crc32key = int(all_b[29:33].hex(), 16)
    data = bytearray(all_b[12:29])
    n = 4095  # 理论上0xffffffff,但考虑到屏幕实际/cpu,0x0fff就差不多了
    for w in range(n):  # 高和宽一起爆破
        width = bytearray(struct.pack('>i', w))  # q为8字节,i为4字节,h为2字节
        for h in range(n):
            height = bytearray(struct.pack('>i', h))
            for x in range(4):
                data[x + 4] = width[x]
                data[x + 8] = height[x]
            crc32result = zlib.crc32(data)
            if crc32result == crc32key:
                # 2021.7.20,有时候显示的宽高依然看不出具体的值,干脆输出data部分
                print(data.hex())
                print("宽为:", end="")
                print(width)
                print("高为:", end="")
                print(height)
                exit(0)

修补后打开:

除了GB2312,冒失没啥提示信息

把 阿尼亚哇库哇库!.doc中的内容转存为一个文本文件waku.txt

使用脚本,提取文件中的。?!,转存为.?!,然后解码得ctfshow{4niya_KaWa1i!}

f1 = open("./waku.txt", "r", encoding='utf-8')
f2 = open("./waku1.txt", 'w', encoding='utf-8')
text = f1.readlines()
text = list(text)
ls = []
for i in text:
    print(i[-2])
    if i[-2] =='。':
        f2.write('.')
    elif i[-2] =='?':
        f2.write('?')
    elif i[-2] == '!':
        f2.write('!')
f1.close()
f2.close()

3. 琴柳感

 打开压缩包里的qlg.txt,发现主要是四句话的重复:

'你有没有感受到城市在分崩离析?','你不曾注意阴谋得逞者在狞笑。','你有没有听见孩子们的悲鸣?,'你是否想过......朋友不再是朋友,家园不再是家园。'

猜测对应0,1,2,3.可能是base4编码。但不知是怎么对应,因此在脚本里爆破。ctfshow{xingbucengxing_yibuzaiyi_zaikelianyilianba}

####base4解码脚本base4.py
#base4编码:把每个字节八位二进制值切成4个2位,分别用0,1,2,3表示。
def b4decode(b4str):
    if len(b4str) % 4 != 0:
        print('必须是4的倍数')
        return ''
        
    res = [ chr( (int(b4str[i])<<6) + (int(b4str[i+1])<<4) + (int(b4str[i+2])<<2) + int(b4str[i+3]) )
            for i in range(0,len(b4str),4)]
    return ''.join(res)


####爆破脚本
import base4,itertools

strs = [['你有没有感受到城市在分崩离析?','0'],
        ['你不曾注意阴谋得逞者在狞笑。','1'],
        ['你有没有听见孩子们的悲鸣?','2'],
        ['你是否想过......朋友不再是朋友,家园不再是家园。','3'] ]

def decode(text,strs):
    str1 = ''
    while True:
        pos,val,length = 99999,None,None
        nofound = 0
        for i in range(4):
            try:
                pos1 = text.index(strs[i][0])
                #print(pos1)
                if pos > pos1:
                    pos = pos1
                    val = strs[i][1]
                    length = len(strs[i][0])
            except:
                nofound += 1
        if nofound >= 4:
            return str1
        str1 += val
        text = text[pos+length:]
        #print(text[0:100])
        #input()

with open('qlg.txt','r',encoding='gbk') as f:
    text = f.read()

#遍历每种对应的值
count = 0
for i in itertools.permutations('0123'):
    strs[0][1] = i[0]
    strs[1][1] = i[1]
    strs[2][1] = i[2]
    strs[3][1] = i[3]
    print('\n%d-------------------------------'%count)
    count += 1
    #print(strs)
    b4str = decode(text,strs)
    print(b4str)
    res = base4.b4decode(b4str)
    print(res)
    if 'ctfshow{' in res:
        exit()

4.低端的base64

发现flag.txt中的字符串非常象base64编码,但是没有大写字母。猜测所有大写字母都转成了小写。所以按4个字符一组,爆破所有字母。

import base64,itertools

with open("./flag.txt","r") as f:
    text = f.read()

for i in range(0, len(text), 4):
    item = text[i:i+4]
    itemlist = []
    for ch in item:
        if ch.isalpha():
            itemlist.append([ch,ch.upper()])
        else:
            itemlist.append([ch])
    for random_list in  itertools.product(itemlist[0],itemlist[1],itemlist[2],itemlist[3]):
        s = ''.join(random_list)
        try:
            res = base64.b64decode(s).decode()
            if res.isprintable():
                print(res,end='     ')
        except:
            pass
    print('')

ctfshow{base64_1s太难了!!I服了U!}

  • 8
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值