蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)

蓝帽越来越离谱
争分夺秒,101分排到前70
Ball_sigin + slient + 冬奥会_is_coming + 复现I_will_but_not_quite + 根据T佬复现嫌疑人x的硬盘整理

1.web:Ball_sigin
纯玩游戏,会出现3个单词缺一个字母,分别吃到对应字母即可出flag
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第1张图片
2.PWN:slient
既然是原题,就可以直接算杂项了吧(雾
直接参考这个:https://www.lintstar.top/2020/12/784edd2e的slient,改掉端口和ip即可,flag都没变

3.冬奥会_is_coming
png文件尾有rar,foremost分离,分离出来个mp3,并且rar的注释里面提示8个数字
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第2张图片
文件尾发现密文,将其16进制导出后转hex http://stool.chinaz.com/hex
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第3张图片
然后使用emoji-aeshttps://aghorler.github.io/emoji-aes/生成一个flag{},发现与密文前几位相同,锁定emoji-aes,寻找秘钥
有mp3并且提示八位数字,猜测与本次主题有关,尝试歌曲的发布时间和冬奥会开始时间,发现20220204这个数字拿去mp3stego能解出来
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第4张图片
将\x替换为空,再去刚刚hex
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第5张图片
bugku做过,wingdings(闹酒狂欢)
使用https://lingojam.com/WingdingsTranslator

蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第6张图片
最后找到了这个https://github.com/Tr0jAnV1rU4/1cePeak/blob/main/A/post-checkout
下载下来记事本打开
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第7张图片
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第8张图片在这里插入图片描述
(复现)4.I_will_but_not_quite
vmem,明显内存取证题,还给了个加密python就离谱啊
先进行常规操作
先查profile
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第9张图片
然后查一下进程
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第10张图片
可以发现最后使用的是winrar,猜测进行了压缩,|grep rar和zip试试
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第11张图片
这两名字奇怪还出现在桌面上,必须得dump出来看看,(另一个没用
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第12张图片
kali其实看不到注释,这里当时是师兄dump出来然后发qq,windows看到了注释
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第13张图片
密码猜测成功弱密码123456
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第14张图片
然后这里盲区其实没碰到过,是双⼗六进制编码https://www.calcresult.com/misc/cyphers/twin-hex.html
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第15张图片

Vnw3HC07BDgbBWNRGTx2fSckf399V1Z9CxIvHVd6fHsaEnR8fX40NyQ7JhM8CWV5fgMNN24=

然后看那个加密函数

#!/user/bin/python2
import random
def r(s, num):
	l=""
	for i in s:
		if(ord(i) in range(97,97+26)):
			l+=chr((ord(i)-97+num)%26+97)
		else:
			l+=i
	return l

def x(a, b):
	return chr(ord(a)^ord(b))

def encrypt(c):
	secret = c
	n=random.randint(1,1000)
	for i in range(n):
		secret = r(secret, random.randint(1,26))
	secret = secret.encode('base64')

	l = ""
	for i in range(len(secret)):
		l += x(secret[i], secret[(i+1)%len(secret)])
	return l.encode('base64')

flag = "#################"
print "secret =", encrypt(flag)

#secret = The key you got


encrypt相当于主函数,是随机一个n然后进入r凯撒加密,加密之后将其base64编码,然后对编码后的字符串每两位进行异或,最后得到的值再base64编码就得到了刚刚解出来的函数。

其中,虽然r里面获取了随机数n,还有对小写字母+num,但是由于是一起增加,所以最后只需要将0-26全部遍历一遍即可,所以暂时可忽略掉此等会再来写

问题出在x(secret[i], secret[(i+1)%len(secret)])
这里因为将最后一位也与第一位异或了,所以不能倒过来异或回去(因为极大可能会损失高位数据,事实也证明的确如此)

那么现在只需要得到第一次加密的base串,那串base解密用try-except,并循环1,26即可。但是如何得到那串base?

其实可以知道,虽然我之前说过了,因为每一位都进行了异或,所以不能逆回去,但是可以爆破啊。其实这里先将那串base解码之后看第一位和最后一位,一个110一个86,很容易将范围缩小,暂且尝试遍历(86,128),这样我们就相当于得到了最后一位的ascii码十进制值,再逆回去的时候,当长度达到我们解出来的base64串时,停止,并try base64.b64decode(s).decode("utf-8),如果能解码,则再执行r函数(或者上bugku去凯撒解密遍历,即可找到flag。

写脚本:

import base64
import random
secret = "Vnw3HC07BDgbBWNRGTx2fSckf399V1Z9CxIvHVd6fHsaEnR8fX40NyQ7JhM8CWV5fgMNN24="
dec = base64.b64decode(secret).decode("utf-8")
# for i in range(len(dec)):
# 	print(ord(dec[i]))
def r(s, num): #凯撒
	l=""
	for i in s:
		if(ord(i) in range(97,97+26)):
			l+=chr((ord(i)-97+num)%26+97)
		else:
			l+=i
	return l

for i in range(86,128):
	j = 1
	tmp = [""]*len(dec)
	tmp[-1] = chr(i)#爆破恢复最后一位,即可恢复所有
	while j != len(dec):
		tmp[-j-1] = chr(ord(dec[-j])^ord(tmp[-j])) #反着进行异或
		j += 1
	s = tmp[-1] #因为最后一位是最后一位和第一位异或,所以刚开始异或的其实是最后一位
	for i in range(len(tmp)-1):
		s += tmp[i]#这里即是将第2位至最后一位拼接起来加在第一位后面
	try:
		s = base64.b64decode(s).decode("utf-8")
		for i in range(1,26):#遍历凯撒
			flag = r(s,i)
			print(flag)
	except:
		pass

蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第16张图片

5.嫌疑人x的硬盘整理
不会,稍微写一点再引一点最后T佬解出来的解题过程

将x.vmdk放进取证大师,提示需要bitlocker,取证完后查看取证结果
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第17张图片
然后右击c盘,点击bitlocker解密
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第18张图片

蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第19张图片

解开C盘之后,重新取证
在这里插入图片描述
在这里插入图片描述
取出这两个文件,xlsx未发现宏,chat1.exe为关键,并且最后提示不要逆chat1.exe,更加锁定了在chat1.exe里,而且调试后发现有反调试,其实猜测flag在内存中,根据T佬说用sharpOD反反调试操作一波
首先x64dbg安装这个插件,勾选如下
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第20张图片

然后运行程序,F9到达第一个断点处,此时在内存中找不到东西,发现再F9达到几处断点后程序关闭,根据正常运行的时候弹出connect fail!可以知道那4处断点时有connect fail!弹出,在最后一个断点处查看内存中的字符串(虽然之后发现第二个断点处已经有值了)
蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第21张图片

蓝帽杯2021初赛 writeup+赛后复现(misc123+pwn2+web1)_第22张图片

最后找到flag,这样解可能是作者留下的后门解出来的

你可能感兴趣的:(ctf,python,信息安全)