羊城杯MISC复现

并没有参加羊城杯,但是题目听说质量很高,对着WP复现一下。

hidden

这个题目附件下下来,有一个txt,再就是一个wav 。txt 这里给了提示是 60=()+(),可以想到rot13和rot47。这里我一开始是先rot13然后rot47发现解出来还是没什么用。所以就得换个方式,先rot47解码一下,然后再rot13解码一下。最后得到:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
import wave 

with open('flag.txt', 'rb') as f:
txt_data = f.read()
file_len = len(txt_data)
txt_data = file_len.to_bytes(3, byteorder = 'little') + txt_data

with wave.open("test.wav", "rb") as f:
attrib = f.getparams()
wav_data = bytearray( f.readframes(-1) )

for index in range(len(txt_data)):
wav_data[index * 4] = txt_data[index]

with wave.open("hiden.wav", "wb") as f:
f.setparams(attrib)
f.writeframes(wav_data)

其实就是要根据这段代码来进行逆向:

1
2
3
4
5
6
7
8
9
10
11
import wave

with wave.open("hiden.wav""rb"as wav_file:
    wav_data = bytearray(wav_file.readframes(-1))  # Read all audio frames
length_bytes = bytearray([wav_data[i * 4for i in range(3)])
data_length = int.from_bytes(length_bytes, 'little')
extracted_data = bytearray()
for i in range(data_length):
    extracted_data.append(wav_data[(i + 3) * 4])
extracted_text = extracted_data.decode('utf-8')
print("Content:\n", extracted_text)

不一样的数据库2

给了一个压缩包,里面是一个png和kdbx文件,不过都是加密了的。用winzip打开发现也是需要密码,可以排除掉伪加密。备注信息也没有啥东西,放到010去看一下,在末尾处发现:this is the 6 number,猜想可以用ARCHPR去爆破,爆破出来的密码是753951。然后就得到了一张残缺的二维码和一个kdbx文件。残缺的二维码可以直接PS补全。QR扫码之后得到:

NRF@WQUKTQ12345&WWWF@WWWFX#WWQXNWXNU,但是这个不是kdbx的密码。而是得先rot13解密一下,得到:AES@JDHXGD12345&JJJS@JJJSK#JJDKAJKAH ,这个密码才是kdbx文件的密码(其实这里照片的名字13也是一个提示,

进去之后可以看到:

misc7.png

给了提示:passisDASCTF

misc8.png

右击编辑记录,然后从历史里面找到第四条记录,高级选项里面编辑字符串,可以看到AES密文,然后联想前面的passisDASCTF。可以猜到密钥就是DASCTF。解密即可。

注:这个AES找个在线的解密网站,输入密文和KEY,解密就行了。不知道为啥用工具会解密不出来。

miaoro

题目附件给的是一个流量包,wireshark打开,然后去追踪TCP流量,一个一个流去看,看到第6个流的时候,cookie那里可以看到有一大串编码的字符串。这里可以联想到shiro。这里用到ABC_123大佬的工具去解密。流6一共有三段cookie数据,这里一个一个去试,去解码,可以在第三段cookie解密后看到:

misc9.png

可以发现一半的flag。这里继续往后面翻流。一个一个去看。从流7开始多了一个首部字段:GWHT,并且还是base64编码的,从流7开始解码,可以发现是在执行命令,whoami。翻到流10的时候,base64解码一下发现是:echo Th15_11111111s_pP@sssssw000rd!!!>pass.txt

misc10.png其实到这里我会想着去分离一下,看有没有有用的数据。然而并没有分离出啥有用信息,于是继续翻。流13执行的命令解码后是:

certutil -urlcache -f "http://192.168.1.3:801/secret.txt",感觉是有用的信息,也看到返回了一大串字符串,base64解码看一下:

misc11.png

可以看到结尾其实是压缩包的开头,倒叙一下就行了。这里全过程都可以通过cyberchef来实现。不过这里有个问题,直接在cyberchef去复制我画框的右半部分不行,这里是先把所有内容复制到vscode,然后按住鼠标中键滑轮进行选中,把我们需要的那个部分提取出来。

提取出来之后,注意有换行,然后需要逆序,然后还需要转16进制,这些都可以通过cyberchef一步到位:

misc12.png

保存为zip文件,密码就是我们之前从流量分析中提取到的那个。解压缩之后是一张图片。名字叫flag2。打开之后发现有些内容没显示出来,这里很明显是宽高问题,我直接跑之前存的那个修改宽高的脚本不太行。所以放到010去改,模板不知道为啥显示的有问题,直接通过模板去找宽高不太行,直接手动找吧。宽高的位置在:00A0 H 这里:

misc13.png

FF C0 00 11 08 后面跟着的就是宽高数据,我这里把宽高改成了一样,都是 05 7C ,改完之后就可以看到完整的图片了,后面就是一个设计好的密码体系了:

flag2.jpg

翻译过来就是,EBOFDELQDIAA} 。和之前的拼接在一起就是:DASCTF{B916CFEB-C40F-45D6-A7BC-EBOFDELQDIAA}

checkin

这个题目附件解压缩之后是一个flag.txt文件,里面是16进制,压缩包备注信息也给了一段base的编码。看到16进制自然而然的想到去转成文件,放到cyberchef里面去看看,不过这里要注意会有一些空格啥的,用cyberchef自带的remove whitespace功能去消除一下即可。可以看到有wireshark字样,所以导出来文件把后缀改成.pcap 。这个压缩包打开发现有很多TLS流量,这里会想着去给他解密,但是那个base编码格式不对,所以得再去找信息。这里是用到了wbStego4open 来对txt文件进行的隐写。猜测密码就是那个base解码后的。

这个base用的是base58 。所以还是可以下载一个爆破常见加密方式的,可以避免比赛的时候去一个一个试。这里随波逐流工具箱就可以实现。base58解码出来是Welcome2GZ 。用wbsteg4 decode出来是一个log文件,可以想到这个是tls的,导入到wireshark 。之前做的一个题目是导入私钥,这里是log。其实大差不差:编辑->首选项->protocol->TLS->导入log

misc14.png

TLS解密之后,很多HTTP流量就可以看了,我们可以一个一个去追踪HTTP流去翻,翻到流33的时候可以看到有个flag.gif,可以怀疑这里就是有用的信息,发现对应的分组是2016,于是我去导出HTTP对象,找到2016,把他进行导出。导出的是一个php文件,但是内容里面很明显的GIF信息,于是想着去分离,这里我一开始是扔到kali里面,foremost分离,发现分离出来一半的gif,是有点问题的。于是换了一个,用binwalk去分离,发现好用一些: binwalk -D=gif upload.php 分离出来的gif是正常的。

附binwalk常见命令:

1
2
3
binwalk -e firmware.bin   这个功能也是一个常用的功能,在CTF中很多文件分解的misc题都可以使用binwalk提高效率相对于使用winhex这类工具。可以使用-e选项提取它在固件映像中找到的任何文件。

binwalk -D=xx firmware.bin 指定分离的文件类型

最后一步就是gif时间间隔隐写,这里可以用脚本,也可以直接用kali自带的一个神器:identify

misc16.png

identify -format "%T " flag ,可以得到时间间隔, 3 换成 0 , 23换成 1,然后 01去转ascii即可。

misc15.png

最终output得到flag

so much

这个题目给的附件是一个.ad格式,首先这个名字看上去就像是被编码过的,拿过去base64解码一下发现:shift!

然后ad这种后缀的文件需要用到FTK来进行挂载,这里用的工具是:FTK Imager4.7.1.4_x64

misc17.png

File -> image mounting -> image file 选择我们要挂在的文件,发现需要password 。这里其实可以联想到一开始翻译出来的shift!,但是很遗憾是错的,这里把文件放到010去看,发现结尾处有一段提示:key is : 1234567 really ? 这里就是脑洞了。真实的密码有shift+数字 来得到:!@#$%^&

mount之后会产生一个新的磁盘,我这里是F盘:

misc18.png

可以发现时间上是存在规律的,从0.crypto文件开始,提取它的时间戳,提取19为0 , 20为1 ,脚本如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import os
flag=""
for i in range(344):
tmp_1=os.path.getmtime(str(i)+".crypto") #os.path.getmtime()Python中的方法用于获取指定路径的最后修改时间。此方法返回一个浮点值,该值表示自纪元以来的秒数。如果文件不存在或无法访问,则此方法引发OSError。
if "73009" in str(tmp_1):
flag+="0"
else:
flag+="1"
print(flag+"\n")
tmp=""
for j in range(len(flag)):
tmp+=flag[j]
if len(tmp) == 8:
print(chr(int(tmp,2)),end="")
tmp=""

可以得到:the_key_is_700229c053b4ebbcf1a3cc37c389c4fa

所以就只剩下最后一层了,文件是crypto后缀,这种是encrypto for win 这款软件加密生成的。所以我们用这个软件解密即可,密码是700229c053b4ebbcf1a3cc37c389c4fa ,然后依次解开 0.crypto1.crypto ,对应内容拼接即可DASCTF{85235bd803c2a0662b771396bce9968f}。注意这里的密码好像只能手输。。。

1z_misc

脑洞题,题目给了一个加密的压缩包和txt文件。

内容:

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.jpg:

misc19.png

这个题目的规律就是,里面一圈,即12个时辰,是顺时针顺序,子对应 1,丑对应 2 ,寅对应3 ,依次类推,最外面二十八星宿对应的是逆时针。若女可为11,可为1124……觜可为91,亦可为725……如此往复,周而复始。 即(1,1) 和 (11,24) 都对应女,这里也可以对上,1代表子,然后1代表最外圈逆时针开始也是女,11对应戌,24即从奎开始逆时针数24下,也可以到女。所以规律就清晰了,对[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] 进行一下编号即可:

(4,3) (10,1) (5,5) (1,6) (10,17) (2,8) (8,12),(8,24)(4,3)(5,5)(2,26)(10,1)(5,5)(5,5)(4,15)(10,17)(10,27)(2,8)(2,8)(6,17)(8,24)(2,8)(8,12)(10,27)(1,6)(10,1)(1,6)(5,5)(10,27)(2,8)(1,6)

翻译过来就是 心,胃,心,奎,奎,心,奎,心,胃,心,心,心,胃,心,心,胃,心,奎,奎,奎,奎,胃,奎,心,奎,奎,胃,奎,心,奎,心,奎,奎

对应三个元素,( . - 分隔符)可以想到摩斯密码,用到cyberchef的split模块

misc20.png

这里心对应.还是胃对应.还是奎对应.,这个得通过一个一个去尝试来看,得到的E@SI1Y! 拿过来解密:

图片是一个天琴座的图片,flag用010打开没看到什么有用信息。要用到一个叫lyra的工具,将flag后最改成.lyra,然后用lyra工具解码出.wav文件。网上语音转文字一下。最后是社会注意核心价值观编码。