第五届蓝帽杯-I_will_but_not_quite WriteUp

‌‌‌‌‌‬‌‌ 2021-05-23 11:51:47 2391 0


vmem,明显内存取证题,先进行常规操作:
先查profile

在这里插入图片描述

查一下pslist

最后使用的是winrar,猜测进行了压缩,|grep rar和zip试试

这两名字奇怪还出现在桌面上,必须得dump出来看看

kali其实看不到注释,这里当时是师兄dump出来然后发qq,windows看到了注释

密码猜测成功弱密码123456

然后这里盲区以前其实没碰到过,是双⼗六进制编码(外网)

https://www.calcresult.com/misc/cyphers/twin-hex.html

然后看那个加密函数

#!/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

flag{0946b1c23d7fe85afa951e7b2640dc83}

分类:MISC
image
作者:‌‌‌‌‌‬‌‌

7

提交

135

收入

相关WriteUP

  • ISCC2021 世间套娃与你环环相扣

    参考2017_Dating_in_SingaporeISCCVERYNICE解压出来是个rar,打开报错,010查看,应该是个zip,改一下拓展名,还是打不开。winrar修一下修复之后可正常解压3pm明显是mp3怕有套路,先010查看,果然CRC被改了。修改高度488https://pan.baidu.com/s/1YOCs-GWsPEi5DCLW2rzeQAMP3是慢TV扫描,rxsstv扫反...

    • MISC
    • 3年前
  • ISCC2021-抽象の艺术

    解压得到图片解压密码calc.exe,解压Message首先base100解码猜测emoji-aes查看hint,发现是G语图解码:http://grompe.org.ru/static/wingdings_gaster.html然后!https://aghorler.github.io/emoji-aes/ISCC{Ta0wa_1s_so_Ta0wa}

    • MISC
    • 3年前
  • 2021年ISCC-veryeasy-writeup

    1.拿到附件密文,很容易发现前半部分数值很像一组密文,为加密后的结果,从中间分开,研究后半部分数列,后半部分为4×4的矩阵,符合此特征的有希尔密码[35,8,6,23,2,34,9,8,15,17,24,20,17,0,24,32,5,2,0,0,2,1,0,0,0,0,8,3,0,0,5,2]上脚本fromnumpyimportlinalg#输入矩阵并判断是否存在逆矩阵definputMatri...

    • MISC
    • 3年前
问题反馈