0%

BUUCTF 每日打卡 2021-4-13

BUUCTF 每日打卡 2021-4-13

引言

又是昏昏沉沉的一天

密码学的心声

题目描述如下: 在这里插入图片描述 附件内容: 在这里插入图片描述 从歌词可知,这是八进制加密,要用 ascii 码解密 尝试把全部内容八进制转十进制解密:

1
2
3
4
5
6
from Crypto.Util.number import *

c = '111114157166145123145143165162151164171126145162171115165143150'
h = int(c, 8)
print(h)
print(long_to_bytes(h))

结果为:b'92a)99LgS8y+19NG92i6h' ??? 参考wp后得知要三个数字一组八进制转十进制解密 代码如下:

1
2
3
4
5
6
c = '111114157166145123145143165162151164171126145162171115165143150'
list_c = []
for i in range(0, len(c), 3):
list_c.append(chr(int(c[i:i+3], 8)))
m = ''
print('flag{' + m.join(list_c) + '}')
结果为:flag{ILoveSecurityVeryMuch}

rot

附件内容:

1
2
3
破解下面的密文:
83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112
flag格式flag{}
看到题目知道是 rot 移位加密 尝试根据 flag 的格式进行移位 代码如下:
1
2
3
4
5
6
7
8
9
10
11
c = '83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112'
list_c = c.split(' ')
print(list_c)
k = list_c[0]
list_m = []
for i in range(len(list_c)):
list_c[i] = chr(int(list_c[i]) + ord('f') - int(k))
list_m.append(ord(list_c[i]))
print(list_m)
m = ''
print(m.join(list_c))
结果为:flag@is@†Œ‡›———“ˆ‰™Ž‚’ƒ‰“– ’™‡„____*mdUZSX TƒSURXPY QUPQXVYRPƒSWQYPƒ‚ƒ

flag is '一串乱码' ____ '一串乱码' 盯着这串字符琢磨了半天 最后求助wp,但是只告诉我们会得到一串带 "?" 的 flag,和一串 MD5 具体怎么得到的讲的很含糊 后来受 dl 指点,尝试将前四位向大写的 “FLAG” 移位 代码如下:

1
2
3
4
5
6
7
8
9
10
11
c = '83 89 78 84 45 86 96 45 115 121 110 116 136 132 132 132 108 128 117 118 134 110 123 111 110 127 108 112 124 122 108 118 128 108 131 114 127 134 108 116 124 124 113 108 76 76 76 76 138 23 90 81 66 71 64 69 114 65 112 64 66 63 69 61 70 114 62 66 61 62 69 67 70 63 61 110 110 112 64 68 62 70 61 112 111 112'
list_c = c.split(' ')
print(list_c)
k = list_c[0]
list_m = []
for i in range(len(list_c)):
list_c[i] = chr(int(list_c[i]) + ord('F') - int(k))
list_m.append(ord(list_c[i]))
print(list_m)
m = ''
print(m.join(list_c))
结果为: FLAG IS flag{www_shiyanbar_com_is_very_good_????} MD5:38e4c352809e150186920aac37190cbc (移位的时候中间产生了换行符) 这波啊,这波出题人在第五层 拿 MD5 在线解密在这里插入图片描述 啊这(这也在你的计算之中吗?出题人)

容易想到要用哈希碰撞 代码如下:

1
2
3
4
5
6
7
8
9
10
flag = 'flag{www_shiyanbar_com_is_very_good_????}'
md_5 = '38e4c352809e150186920aac37190cbc'
for i in range(33, 127):
for j in range(33, 127):
for s in range(33, 127):
for t in range(33, 127):
k = flag.replace('????', chr(i) + chr(j) + chr(s) + chr(t))
x = hashlib.md5(k.encode()).hexdigest()
if x == md_5:
print(k)
根据 ascii 码表减少了循环次数 跑了几分钟结果出来了:flag{www_shiyanbar_com_is_very_good_@8Mu}

结语

晚上还有机器学习 溜了溜了 希望继续坚持

欢迎关注我的其它发布渠道

-------- 本文结束 感谢阅读 --------