2024年春秋杯网络安全联赛冬季赛WRITEUP
本比赛持续三天,一天比一天难了属于是,最终排名可惜只有 145,没有进入前 10%
day1
day1 隐写比较简单,就差一个内存取证的题没有写出来,最后结果发现要用 vol3 才可以解出来,最终只能错失了
See anything in these pics?
拿到文件后能看到 Aztec.png 和 YVL.zip 文件,压缩文件被加密,通过解码图片文件能找到压缩文件密码为 5FIVE,解压后存在文件 YVL.jpg
通过 010Editor 发现文件末尾存在额外图片,通过命令foremost YVL.jpg
进行分离
发现分离出来了之后是全黑,经过 ps 与 StegSolve 进行处理都无法找到 flag,猜测是图片宽高问题,于是使用 python 脚本进行 crc 宽高爆破
import zlib
def main():
buff = open("./output/png/00000149.png", 'rb').read()
src_hash = "".join([hex(i)[2:] for i in buff[29:33]])
width = bytes2int(buff[16:20])
height = bytes2int(buff[20:24])
for i in range(height, height + 5000):
for j in range(width, width + 5000):
cut_bytes = buff[12:29]
cut_bytes = ins(cut_bytes, int.to_bytes(i, 4), 4)
cut_bytes = ins(cut_bytes, int.to_bytes(j, 4), 8)
final_hash = hex(zlib.crc32(cut_bytes))[2::]
print(f"{
i}x{
j} {
src_hash} <== {
final_hash}")
if src_hash == final_hash:
return
def ins(b: bytes, i_b: bytes, iv: int) -> bytes:
return b[:iv] + i_b + b[(iv + len(i_b)):]
def bytes2int(b: bytes) -> int:
return int.from_bytes(b, 'big')
if __name__ == '__main__':
main()
最终得出宽高为1440x1800
,在 010 中进行修改,从图片冲可以看出 flag:flag{opium_00pium}
简单镜像提取
拿到文件发现存在 data.pcapng,使用 wireshark 进行流量分析发现存在一个文件上传的数据包,数据包为 zip 格式
将数据包通过“导出分组字节流”到本地,打开压缩包发现存在文件 disk-recovery.img,根据题目提示,使用 R-Studio 对 img 镜像文件进行恢复,找到存在一张 xlsx 表格文件,右键进行文件恢复
打开表格发现 flag:flag{E7A10C15E26AA5750070EF756AAA1F7C}
压力大,写个脚本吧
拿到文件发现压缩包中存在两个文件zip_99.zip
与password_99.txt
,打开zip_99.zip
文件发现被加密,使用password_99.txt
进行解密,发现 txt 文件 base64 解密后为解压密码,猜测是循环嵌套,于是写出脚本得到最终文件 flag-hint.txt 获得提示:PASSWORD+PASSWORD.png
,猜测为将所有密码进行组合,得到最终的图片
import base64
import zipfile
z = zipfile.ZipFile("zip_99.zip")
pa = base64.b64decode(open("password_99.txt", "rb").read())
pass_list = [pa]
while True:
zi = None
pa_ = None
if len(z.filelist) != 2:
break
for f in z.filelist:
if f.filename.endswith(".txt"):
pa_ = z.extract(f.filename, pwd=pa)
elif f.filename.endswith(".zip"):
f