1. 程式人生 > 其它 >[WUSTCTF2020]B@se

[WUSTCTF2020]B@se

題目附件內容:

 首先通過觀察題目字元特徵很明顯是base64編碼,第一行的密文是通過下面給的base64的變表,但是仔細觀察缺少了四個字元,因此我們需要寫指令碼把缺少的字元給還原出來

爆破指令碼:

import string
c = 'JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs****kxyz012789+/'
for i in string.ascii_letters + string.digits: # string.ascii_letters所有字母 string.digits所有數字
if(i not in c):
print(i,end='')

# ju34

很明顯爆破出來的是“ju34”,但是我們還不知道他的原始排列的順序是什麼?,因此需要我們對著四個字元與密文進行一個排列組合,並可以解出明文。
程式碼如下(這裡是參考了一些大佬的指令碼):
import binascii
import itertools
cipher = 'MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD' # 全排列組合
s = ['j','u','3','4']
for i in itertools.permutations(s,4): # 4就是把s列表裡的字母4個為一組排列
k = "JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs"+ "".join(i) + "kxyz012789+/" # "".join(i)排列的結果(join() 方法用於將序列中的元素以指定的字元連線生成一個新的字串)

a = ""
for j in cipher:
a += bin(k.index(j))[2:].zfill(6)
print(binascii.a2b_hex(hex(eval("0b"+a))[2:-1])) # a2b_hex和binascii.unhexlify可以為16進位制的 bytes 型別,也可以為十六進位制 str 型別
# 舉例:這裡轉為16進位制後會出現0x471L,所以只有去掉0x和L就有了[2:-1]

執行結果:

 很明顯圖中框出來的地方就是最後的flag值

總結:此題考察了缺損的base64變表,需要使用爆破指令碼破解出明文。