Web
Misc2
每天下午六点定时更新
这次CTFShow的愚人杯,第一晚勉强上榜了,第二天睡醒还没掉下去,不过第二天打了另一场比赛,所以没有继续上分了,后面第三天补了反序列化和flask。现在来补一补题,顺便写一写
打开附件,发现需要密码,先试试伪加密
用010editor打开压缩包,查找504B0102,将后面第五位的09修改成00
再打开压缩包,不需要密码,解压也没有报错,确实是伪加密
解压得到图片,发现只有一部分,猜测为高度修改
010打开,修改高度
得到一串乱码
010打开图片,搜索flag
又是一个压缩包,保存到新文件,在最后面发现了key,是base64编码
用密码yurenjie解压新的压缩包,得到一张图片,还是高度修改,改回来后得到flag
提示密码,结果是自然常数e,2.71828182846解密
解压得到HINT.png发现损坏,010打开观察,发现是把png的头改成了jpg的
顺便看到宽高都是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()
修复后的HINT提示GB2312
打开另一个文件,docx,发现这些,打开文档上方的视频,发现字幕对不上,下面语句排列顺序是有隐藏信息的,后面知道了是Ook编码,还是脚本+在线工具
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)
又是一段文本
发现有规律,猜测是每一句对应一个数字,编写脚本:
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