CTFShow愚人杯|Misc-WriteUp1

目录

  • 链接
  • 前言
  • WriteUp1
    • 1.奇怪的压缩包
    • 2.哇库哇库2
    • 3.琴柳感


链接

Web
Misc2


前言

每天下午六点定时更新
这次CTFShow的愚人杯,第一晚勉强上榜了,第二天睡醒还没掉下去,不过第二天打了另一场比赛,所以没有继续上分了,后面第三天补了反序列化和flask。现在来补一补题,顺便写一写


WriteUp1

1.奇怪的压缩包

打开附件,发现需要密码,先试试伪加密

CTFShow愚人杯|Misc-WriteUp1_第1张图片

用010editor打开压缩包,查找504B0102,将后面第五位的09修改成00

CTFShow愚人杯|Misc-WriteUp1_第2张图片

再打开压缩包,不需要密码,解压也没有报错,确实是伪加密

解压得到图片,发现只有一部分,猜测为高度修改

CTFShow愚人杯|Misc-WriteUp1_第3张图片

010打开,修改高度

CTFShow愚人杯|Misc-WriteUp1_第4张图片

得到一串乱码

CTFShow愚人杯|Misc-WriteUp1_第5张图片

010打开图片,搜索flag

CTFShow愚人杯|Misc-WriteUp1_第6张图片

又是一个压缩包,保存到新文件,在最后面发现了key,是base64编码

CTFShow愚人杯|Misc-WriteUp1_第7张图片

用密码yurenjie解压新的压缩包,得到一张图片,还是高度修改,改回来后得到flag

CTFShow愚人杯|Misc-WriteUp1_第8张图片

2.哇库哇库2

提示密码,结果是自然常数e,2.71828182846解密

T2附件

解压得到HINT.png发现损坏,010打开观察,发现是把png的头改成了jpg的
CTFShow愚人杯|Misc-WriteUp1_第9张图片

CTFShow愚人杯|Misc-WriteUp1_第10张图片

顺便看到宽高都是1,显然是被改过了,使用脚本爆破

import binascii
import struct
import sys

file = sys.argv[1]
fr = open(file,'rb').read()
data = bytearray(fr[0x0c:0x1d])
crc32key = eval('0x'+str(binascii.b2a_hex(fr[0x1d:0x21]))[2:-1])

n = 4095
for w in range(n):
    width = bytearray(struct.pack('>i', w))
    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 = binascii.crc32(data) & 0xffffffff
        if crc32result == crc32key:
            print(f'高度为:{h}\n宽度为:{w}')
            newpic = bytearray(fr)
            for x in range(4):
                newpic[x+16] = width[x]
                newpic[x+20] = height[x]
            fw = open('result.png', 'wb')
            fw.write(newpic)
            fw.close
            sys.exit()

CTFShow愚人杯|Misc-WriteUp1_第11张图片

修复后的HINT提示GB2312

CTFShow愚人杯|Misc-WriteUp1_第12张图片

打开另一个文件,docx,发现这些,打开文档上方的视频,发现字幕对不上,下面语句排列顺序是有隐藏信息的,后面知道了是Ook编码,还是脚本+在线工具

CTFShow愚人杯|Misc-WriteUp1_第13张图片

import docx

doc = docx.Document('wkwk.docx')
dict0 = { # 把中文标点改为英文,因为Ook是英文标点
    '。': '.',
    '?': '?',
    '!': '!',
}
flag = ''
for para in doc.paragraphs:
    if len(para.text) > 0:
        if para.text[-1] in dict0: # 前面加Ook,后面记得加空格
            flag += f'Ook{dict0[para.text[-1]]} '
print(flag)

得到flag
CTFShow愚人杯|Misc-WriteUp1_第14张图片

3.琴柳感

又是一段文本

CTFShow愚人杯|Misc-WriteUp1_第15张图片

发现有规律,猜测是每一句对应一个数字,编写脚本:

from Crypto.Util.number import *
import re
import itertools

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

with open('qlg.txt', 'r') as fr:
    content = fr.read()
# 剪掉最后一句
content = content[:-23]

# 找出所有要提取的语句,re.findall返回一个数组
sentences = re.findall('你.*?[。?]', content)
for it in itertools.permutations(stringSet, 4): # 对stringSet的所有排列情况遍历
    flag = ''
    for s in sentences:
        flag += str(it.index(s)) # flag加上这一句对应的编号
    try:
        result = long_to_bytes(int(flag, 4)).decode() # 四进制
        print(result)
    except:
        pass

最后得到flag

CTFShow愚人杯|Misc-WriteUp1_第16张图片

你可能感兴趣的:(python,开发语言)