Writeup部分

Writeup

Additional Statement:

written by X1cT34m

复现部分

个人感觉这次羊城杯的misc实在是有点需要脑洞了,做到最后真的是感到穷途末路了,根本不知道接下来应该往什么方向走。。。现在看了其他师傅的wp,感到有的地方确实挺脑洞,但还是有的地方是自己的技术不过关,要学的还有很多。

Checkin

下载下来的压缩包有个注释,是base58编码

image-20240828232334149 image-20240828232441329

FLag.txt中明显是某个文件的十六进制形式,cyberchef用hex转出来导入010可以看出这是个pcapng文件

image-20240828233209162

当时比赛的时候就是卡在这里了。。。结果没想到接下来的某个步骤其实正好是我最近研究过的一个东西。。。

前面的FLag.txt其实还藏着一层wbstego隐写,密码就是上面zip中的注释

image-20240828234413048

image-20240828234524260

一看就是SSLKEYLOGFILE,导入解密tls流量

image-20240828235009581

发现多出来的http流量中有个GIF,导出

image-20240828235420564

简单写个脚本可以发现得到的gif帧与帧之间间隔时间有两种,0.3和2.3,分别对应0和1,得到的二进制串转文本即可得到flag

脚本:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
from PIL import Image
from Crypto.Util.number import long_to_bytes
def read_gif_frames(gif_file):
im = Image.open(gif_file)
im.seek(0)
delay_times = []
try:
while True:
delay_time = im.info.get('duration', 0) / 100.0
delay_times.append(delay_time)
im.seek(im.tell() + 1)
except EOFError:
pass
return delay_times
gif_file_path = '1.gif'
delays = read_gif_frames(gif_file_path)
s=''
for i, delay in enumerate(delays):
#print(delay)
if delay==0.3:
s+='0'
else:
s+='1'
print(long_to_bytes(int(s,2)))

image-20240829003649950

miaoro

追踪tcp流,不难发现,GWHT中是请求,后面$$$…$$$之间的是返回的结果。在tcp流13处可以找到有用的东西

image-20240829114444805

经过base64解码不难发现,这是一个倒置的zip文件

image-20240829151126046

写个脚本回复一下这个zip文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
f=open('download.txt','r')
f.readline()
f.readline()
f.readline()
raw=''
a=f.readline().strip()
while a[:4]!='c8d0':
raw+=a[-16:]
a=f.readline().strip()
raw+='4030b405'
raw=raw[::-1]
ff=open('1.zip','wb')
for j in range(0,len(raw),2):
ff.write(bytes.fromhex(raw[j:j+2]))

发现需要密码,再回到流量包去找,最终在tcp流10的GWHT中找到压缩包密码

image-20240829151721392

image-20240829151737624

解压出的图片看起来错位了,猜测是宽被修改过,这里将宽和高改成一样即可

image-20240829151911027

image-20240829152017519

得到的是猫猫编码,在网上可以找到[对照表](https://www.behance.net/gallery/76299757/CAT-font-alphabet?tracking_source=search_projects_recommended|cat alphabet),对应着可以解出后半个flag:EBOFDELQDIAA}

image-20240829151911027

image-20240829152017519

得到的是猫猫编码,在网上可以找到对照表,对应着可以解出后半个flag:EBOFDELQDIAA}

image-20240829152154193

比赛的时候卡在了这儿,怎么也找不到前半个flag。。。对shiro_attack还是不熟悉。。。

既然这题考了shiro_attack,那肯定得有点shiro的东西。前半个flag其实就藏在shiro的rememberMe里面,在这题里面叫作nekoMiao。

image-20240829153223632

用工具解一下就可以看到前半个flag:DASCTF{B916CFEB-C40F-45D6-A7BC-

image-20240829153349040

1z_misc

这题感觉是最抽象的一题,上来纯属猜谜。。。难就难在需要的脑洞太大了。。。反正我是被这个猜谜困住了(T0T)

题目

1
2
3
天地玄黄,宇宙洪荒;日月盈昃,辰宿列张;万物芸芸,息息相关;是以十二岁而行二十八宿,其间奥妙,待探寻,显真章。
若女可为11,可为1124......觜可为91,亦可为725......如此往复,周而复始。
祈解其秘:[43,101,55,16,16,1017,28,812,824,43,55,226,101,55,55,415,1017,1027,28,28,617,824,28,812,1027,16,101,16,55,1027,1017,28,16]

另外还有一个压缩包

hint

e865c9738431f6d9b72e663f116f8dc

先来解释一下11和91。11的前一个1指的是地支的第一位子,后一个指的是子对应的三个星宿的第一位女;91的9指的是地支的第九位申,1指的是申对应的三个星宿的第一位觜。

再来解释一下1124和725。1124的11指的是地支的第十一位戌,24指的是从戌的第一位奎开始逆时针数二十四个正好到女;725的7指的是地支的第七位午,25指的是从午的第一位柳开始逆时针数25个正好到觜。

因此我们可以解密题目中给的数组,得到如下结果:

1
心,胃,心,奎,奎,心,奎,心,胃,心,心,心,胃,心,心,胃,心,奎,奎,奎,奎,胃,奎,心,奎,奎,胃,奎,心,奎,心,奎,奎

总共只有三种元素,很容易想到摩斯电码,其中,心为.,胃为/,奎为-

image-20240829161715362

这就是解题目给的压缩包的密码,解压得到一张hint.jpg和一个不明二进制文件flag。用010查看flag,再结合hint.jpg中提示的天琴座,不难猜到这是lyra隐写,将flag改名为flag.lyra。

image-20240829162759993

后面的步骤跟ISCC2024的有人让我给你带个话这题是一样的,由于lyra工具的安装有点困难,我目前没安装成功,就先不复现下去了(T0T),以后再用到的时候再研究吧

flag: DASCTF{W0w!_You_d0_4_g00d_j0b!}