整理一下比赛里学到的新姿势
S7_analysis
这个题不是很懂,网上搜的时候在大佬的博客里提到可以使用s7comm.header.rosctr == 1过滤,我过滤完之后只剩了三个流量,一个一个编号试,最后用399试出来了
hsnctf{39}
extract
这题运气比较好,拿了二血,学了些新姿势。
题目附件是一个Cloakify.txt.zip,解压后得到了一个Cloakify.txt,里面是一堆emoji:
网上百度了一下,发现了一个叫Cloakify-Powershell的工具,可以基于文本的隐写术输出来掩盖文件,其中就包括通过emoji进行隐写,使用方法为先在powershell里.\cloakifyFactory.ps1启动(如果启动失败可能是脚本信任的问题,复制报错去百度一下就可以找到解决方法),然后如下操作即可:
然后可以看到我们在指定路径输出了一个flag.txt
看到PK就知道一眼zip,我们把它重名为1.zip,解压出来得到一个f2332.zip,然后解压出来又得到一个f2331.zip,一眼套娃zip题,改改之前红岩杯那个脚本就行了:
import zipfile
import os
for i in range(2330,1,-1):
zfile=zipfile.ZipFile(f"./f{i}.zip","r")
zfile.extractall(path=".")
if i!=1000 or i !=2000 or i !=500 or i !=50:
os.remove(f"f{i+1}.zip")
最后解压到f1.zip拿到flag
对于这种持续解压的套娃题,建议不要在解压中停止,因为这样可能导致文件损坏压缩包没法继续解压,所以写脚本的时候千万不要解压一个删一个,最好保持文件夹里至少有两个压缩包同时存在,这样最新的那个寄了还能用上一个,或者直接用我这个脚本改改得了。
外星电波
附件是一个flag.zip压缩包,2.3mb,解压出来是一个flag.rar,也是2.3mb,但再解压就只剩下一个flag.txt了,只有1kb,显然这里面有问题,我试了常见的foremost,binwalk之类的啥也没分出来,只好把视线投向这个flag.txt了,里面只有一行:
UEsDBBQAAQAAAJWWe1X3LRmUOAAAACwAAAAHAAAAa2V5LnR4dC07SzAm0/65DjqdNiRlBKXO92+KgkCxomKGJLjsGcV7Fue2z4K1sKgxXqQAQJ7R+MbJWT8Zvan2UEsBAj8AFAABAAAAlZZ7VfctGZQ4AAAALAAAAAcAJAAAAAAAAAAgAAAAAAAAAGtleS50eHQKACAAAAAAAAEAGACLClJfTgLZAYsKUl9OAtkBnjjX+k0C2QFQSwUGAAAAAAEAAQBZAAAAXQAAAAAA
这个/还有+看起来眼熟的一批,用base64解码了一下,发现了PK,看来是zip,但直接解码会有一大堆奇奇怪怪的字符,显然格式有问题,最后求助于万能的ChatGPT,写了一个可以将base64解码后的数据以16进制保存的python脚本:
import base64
# 获取需要解码的base64字符串
base64_str = 'UEsDBBQAAQAAAJWWe1X3LRmUOAAAACwAAAAHAAAAa2V5LnR4dC07SzAm0/65DjqdNiRlBKXO92+KgkCxomKGJLjsGcV7Fue2z4K1sKgxXqQAQJ7R+MbJWT8Zvan2UEsBAj8AFAABAAAAlZZ7VfctGZQ4AAAALAAAAAcAJAAAAAAAAAAgAAAAAAAAAGtleS50eHQKACAAAAAAAAEAGACLClJfTgLZAYsKUl9OAtkBnjjX+k0C2QFQSwUGAAAAAAEAAQBZAAAAXQAAAAAA'
# 将base64字符串解码
decoded_data = base64.b64decode(base64_str)
# 将解码后的数据转换为16进制
hex_data = decoded_data.hex()
# 将转换后的16进制数据写入文件
with open('data.hex', 'w') as f:
f.write(hex_data)
然后将那个data.hex里的16进制数据像之前菜狗杯的一样在010editor里新建一个文件,然后粘贴自16进制,最后保存并重命名为1.zip,这样就是一个正常的压缩包了,里面有一个key.txt,但有压缩包密码,而且还不是伪加密,当时爆破了很久也没爆破出来,赛后复现才知道不是用来爆破的,那个从rar到txt里消失的数据其实是被NTFS隐藏了。
这里要注意一下,只能用winrar解压那个flag.rar,否则会因为损失数据导致检测不出来被ntfs隐藏的文件,我就因为这个赛后复现浪费了很多时间。成功解压后我们使用ntfs神器ntfsstreamseditor即可找到那个flag.txt里消失的数据,原来是隐藏了一个wav文件:
导出来之后稍微听一下就知道是SSTV,真的是太太太太常见了,这学期开始接触misc之后,比赛里至少遇到了五次sstv了,参考我之前菜狗杯的教程用虚拟声卡,或者电脑打开音频,手机放旁边用Robot36嗯听也可以,就是有点吵:
passwd@hillstone
用这个密码解压那个压缩包即可拿到flag:
vigenere
#enc.py
import string
from secret import flag
from secret import encrypt
import random
dicts = string.ascii_lowercase +"{}"
key = (''.join([random.choice(dicts) for i in range(4)])) * 8
assert(len(flag) == 32)
assert(len(key) == 32)
cipher = encrypt(flag, key)
print(cipher)
# {mvjk}gbxyiutfchpm}ylm}a}amuxlmg
#table.tsv
a b c d e f g h i j k l m n o p q r s t u v w x y z { }
a a b c d e f g h i j k l m n o p q r s t u v w x y z { }
b b c d e f g h i j k l m n o p q r s t u v w x y z { } a
c c d e f g h i j k l m n o p q r s t u v w x y z { } a b
d d e f g h i j k l m n o p q r s t u v w x y z { } a b c
e e f g h i j k l m n o p q r s t u v w x y z { } a b c d
f f g h i j k l m n o p q r s t u v w x y z { } a b c d e
g g h i j k l m n o p q r s t u v w x y z { } a b c d e f
h h i j k l m n o p q r s t u v w x y z { } a b c d e f g
i i j k l m n o p q r s t u v w x y z { } a b c d e f g h
j j k l m n o p q r s t u v w x y z { } a b c d e f g h i
k k l m n o p q r s t u v w x y z { } a b c d e f g h i j
l l m n o p q r s t u v w x y z { } a b c d e f g h i j k
m m n o p q r s t u v w x y z { } a b c d e f g h i j k l
n n o p q r s t u v w x y z { } a b c d e f g h i j k l m
o o p q r s t u v w x y z { } a b c d e f g h i j k l m n
p p q r s t u v w x y z { } a b c d e f g h i j k l m n o
q q r s t u v w x y z { } a b c d e f g h i j k l m n o p
r r s t u v w x y z { } a b c d e f g h i j k l m n o p q
s s t u v w x y z { } a b c d e f g h i j k l m n o p q r
t t u v w x y z { } a b c d e f g h i j k l m n o p q r s
u u v w x y z { } a b c d e f g h i j k l m n o p q r s t
v v w x y z { } a b c d e f g h i j k l m n o p q r s t u
w w x y z { } a b c d e f g h i j k l m n o p q r s t u v
x x y z { } a b c d e f g h i j k l m n o p q r s t u v w
y y z { } a b c d e f g h i j k l m n o p q r s t u v w x
z z { } a b c d e f g h i j k l m n o p q r s t u v w x y
{ { } a b c d e f g h i j k l m n o p q r s t u v w x y z
} } a b c d e f g h i j k l m n o p q r s t u v w x y z {
本人不太懂密码学,这个脚本来自时维嘉大佬
import random
import string
import itertools
dicts = string.ascii_lowercase +"{}"
print(dicts)
# key = (''.join([random.choice(dicts) for i in range(4)])) * 8
enc = '{mvjk}gbxyiutfchpm}ylm}a}amuxlmg'
for k in itertools.product(dicts,repeat=4):
key = ''.join(k)
# print(key)
numenc = [dicts.index(i) for i in enc]
numkey = [dicts.index(i) for i in key]
flag = ''
for i in range(len(enc)):
# assert len(numenc) == len(numkey)
ans = (numenc[i] - numkey[i % 4]) % 28
flag += dicts[ans]
if 'hsnctf' in flag:
print(flag)
break
#b'hsnctf{wecanalwaystrustvigenere}'
后记
六道web四道零解,还有一道到比赛最后才有一个人做出来,真的属实有点难绷,web我后面专门写个详细分析,有机会把那些题都研究研究。
不过训练营里发的那个MISC思维导图是真的好用,也算不虚此行了,而且那上面关于rar也写了ntfs,可惜当时我没放在心上