题目描述

你能突破九大关卡修成神仙吗?

hint1:压缩包密码为比赛名称+8位什么来着?忘了。哈哈哈!

hint2:flag格式:XYCTF{md5(flag)}

hint3:第三层非夏多,看看交点

hint4:第六层键盘画图,狼蛛键盘最新版你值得拥有!

开头

由提示猜测压缩包密码XYCTF20240401

炼气

第一层是天书加密,用随波逐流就可以解出压缩包密码。

第二层是一张图片,修改高就可以看到flag的第一部分:

XYCTF{T3e_c0mb1nation_

筑基

第一层是BubbleBabble编码,在线解码就能解出压缩包密码。

第二层是一张图片,010看不出什么东西,用StegSolve通过LSB可以找到一串Base64编码,解码可得flag第二部分:

0f_crypt0_and_

结丹(全复现)

给出一张图片

hint3
hint3

hint说看交点,可能跟Begin CTF 2023的下一站上岸差不多,四个交点为”-”,三个交点为空格,一个交点为”.”,可以转化为:

- .... . ..--.- - .... .. .-. -..

摩斯密码解码就可以得到压缩包的密码

打开压缩包发现还有一层压缩包和一个txt,文本文件里面没有有用信息,但是压缩包带密码,用010打开看看,看到末尾有一段附加信息:

image-20240428173027310
image-20240428173027310

分析特征,显然是Base64,解码之后可以得到压缩包密码,解压发现里面有一个文本文件,由特征可知是Base32,解码就可以得到flag的第三部分。

misc_1s_re6lly_fun!!

元婴

hint4.txt打开一看发现是base64,解密一看salted,用这个网站解密:在线Triple DES加密 | Triple DES解密- 在线工具 (sojson.com)(一个个试出来的),密码是2024.

拿密码打开压缩包,有个hint.txt和一个db文件,hint内容如下:

wqk:1m813onn17o040358p772q37rm137qpnqppqpn38nr704m56n2m9q22po7r05r77

进行一个凯撒解密就可以得到一个key,

下面是在52上面找到的一个解密微信聊天数据库的脚本:

# -*- coding: utf-8 -*-
from Crypto.Cipher import AES
import hashlib, hmac, ctypes

SQLITE_FILE_HEADER = bytes("SQLite format 3",encoding='ASCII') + bytes(1)#文件头
IV_SIZE = 16
HMAC_SHA1_SIZE = 20
KEY_SIZE = 32
DEFAULT_PAGESIZE = 4096 #4048数据 + 16IV + 20 HMAC + 12
DEFAULT_ITER = 64000
#yourkey
password = bytes.fromhex("...".replace(' ',''))#这里填入上面求出的key

with open(r'...\\MSG0.db', 'rb') as f:#这里填入MSG0.db的文件路径
blist = f.read()
print(len(blist))

salt = blist[:16]#微信将文件头换成了盐
key = hashlib.pbkdf2_hmac('sha1', password, salt, DEFAULT_ITER, KEY_SIZE)#获得Key

first = blist[16:DEFAULT_PAGESIZE]#丢掉salt

# import struct
mac_salt = bytes([x^0x3a for x in salt])
mac_key = hashlib.pbkdf2_hmac('sha1', key, mac_salt, 2, KEY_SIZE)

hash_mac = hmac.new(mac_key ,digestmod = 'sha1')#用第一页的Hash测试一下
hash_mac.update(first[:-32])
hash_mac.update(bytes(ctypes.c_int(1)))
# hash_mac.update(struct.pack('=I',1))
if (hash_mac.digest() == first[-32:-12]):
print('Correct Password')
else:
raise RuntimeError('Wrong Password')

blist = [blist[i:i+DEFAULT_PAGESIZE] for i in range(DEFAULT_PAGESIZE,len(blist),DEFAULT_PAGESIZE)]
with open(r'...\\ChatMsg.db', 'wb') as f:#解密后的路径
f.write(SQLITE_FILE_HEADER)#写入文件头
t = AES.new(key ,AES.MODE_CBC ,first[-48:-32])
f.write(t.decrypt(first[:-48]))
f.write(first[-48:])
for i in blist:
t = AES.new(key ,AES.MODE_CBC ,i[-48:-32])
f.write(t.decrypt(i[:-48]))
f.write(i[-48:])

用打开数据库的软件打开解密之后的数据库(我用的Dbeaver),在MSG表里面就可以看到flag的第四部分:

L1u_and_K1cky_Mu

化神(第二部分复现):

hint5给出了一串字符和md5后的结果,进行爆破,爆破出压缩包密码,解压第五层.zip 看到flag.txt里面没有有用的东西.

serpent.txt文件里有东西,考虑serpent加密,用这个网站Serpent Encryption – Easily encrypt or decrypt strings or files (online-domain-tools.com)

通过文件输入,从头到尾没有密钥,猜测密钥是前面爆破得到的key,解密之后下载下来塞进Cyberchef可以看到

image-20240428172659005
image-20240428172659005

导出为txt并转换编码为UTF-8后可以得到:

image-20240428172642676
image-20240428172642676

字数比可以看到的多很多,考虑零宽字符隐写:

将文本转化为unicode编码后:

image-20240428172606982
image-20240428172606982
筛选发现,里面包含零宽unicode字符