一 题目分析
flag.txt
cipher.txt
(1)密码表形式和维吉尼亚密码一样
(2)看到504Q0304 很容易想到 504B0304 Zip文件头。
二 解题步骤
2.1 解密密文
根据分析(2)得知和压缩包有关,查看Q对应的明文,观察是否为B。
列对应的是明文,行是密钥。即 明文B + 密钥A -> 密文Q
该密码表和原维吉尼亚密码相比,映射的关系有所差别,所以考虑使用一个新的解密规则将cipher.txt文件中的字母解密出来替换掉。脚本如下:
from string import ascii_uppercase as uppercase from itertools import cycle # 创建密码表 table = dict() dictories=[['P', 'Q', 'L', 'N', 'E', 'Y', 'O', 'D', 'H', 'R', 'J', 'M', 'B', 'K', 'C', 'T', 'F', 'U', 'A', 'Z', 'S', 'X', 'I', 'W', 'V', 'G'], ['H', 'R', 'V', 'K', 'E', 'I', 'Y', 'B', 'J', 'G', 'M', 'Q', 'P', 'C', 'X', 'D', 'F', 'N', 'Z', 'T', 'U', 'O', 'L', 'A', 'W', 'S'], ['S', 'N', 'U', 'K', 'R', 'T', 'P', 'B', 'O', 'E', 'X', 'G', 'A', 'V', 'Z', 'Q', 'D', 'J', 'H', 'W', 'C', 'Y', 'I', 'M', 'L', 'F'], ['J', 'T', 'K', 'Q', 'V', 'F', 'L', 'X', 'D', 'Z', 'W', 'U', 'O', 'A', 'M', 'I', 'E', 'B', 'Y', 'G', 'P', 'R', 'S', 'H', 'C', 'N'], ['J', 'Z', 'B', 'L', 'E', 'P', 'K', 'G', 'N', 'O', 'A', 'C', 'R', 'U', 'I', 'S', 'D', 'M', 'F', 'V', 'X', 'H', 'Q', 'T', 'W', 'Y'], ['X', 'F', 'Y', 'Q', 'W', 'G', 'I', 'R', 'V', 'S', 'O', 'C', 'L', 'E', 'J', 'T', 'B', 'M', 'K', 'U', 'P', 'Z', 'A', 'N', 'H', 'D'], ['U', 'P', 'L', 'A', 'Y', 'T', 'Q', 'K', 'F', 'M', 'O', 'Z', 'I', 'G', 'S', 'H', 'J', 'B', 'E', 'N', 'X', 'R', 'W', 'D', 'V', 'C'], ['U', 'F', 'C', 'Q', 'P', 'A', 'I', 'W', 'R', 'Y', 'G', 'H', 'T', 'Z', 'V', 'B', 'K', 'S', 'J', 'O', 'M', 'X', 'D', 'N', 'L', 'E'], ['S', 'Q', 'A', 'T', 'P', 'R', 'N', 'X', 'Y', 'L', 'H', 'B', 'W', 'Z', 'F', 'U', 'O', 'K', 'E', 'C', 'G', 'V', 'I', 'M', 'J', 'D'], ['R', 'L', 'M', 'P', 'Z', 'Y', 'T', 'H', 'F', 'U', 'A', 'S', 'J', 'N', 'I', 'K', 'G', 'V', 'X', 'Q', 'B', 'E', 'W', 'C', 'D', 'O'], ['Y', 'U', 'I', 'K', 'S', 'Z', 'W', 'A', 'R', 'T', 'J', 'E', 'Q', 'C', 'P', 'M', 'L', 'D', 'H', 'B', 'G', 'O', 'N', 'V', 'X', 'F'], ['Q', 'W', 'J', 'S', 'T', 'K', 'R', 'P', 'B', 'O', 'V', 'U', 'L', 'N', 'H', 'F', 'X', 'D', 'G', 'A', 'M', 'Z', 'I', 'E', 'Y', 'C'], ['X', 'G', 'H', 'Y', 'Q', 'W', 'R', 'Z', 'K', 'M', 'P', 'N', 'E', 'V', 'L', 'C', 'D', 'U', 'J', 'F', 'T', 'S', 'I', 'A', 'O', 'B'], ['G', 'A', 'P', 'S', 'M', 'B', 'E', 'W', 'N', 'X', 'R', 'I', 'L', 'Y', 'C', 'F', 'O', 'K', 'Z', 'T', 'D', 'V', 'U', 'J', 'H', 'Q'], ['G', 'N', 'B', 'Z', 'Q', 'Y', 'U', 'R', 'C', 'H', 'L', 'V', 'E', 'A', 'I', 'O', 'M', 'F', 'P', 'X', 'W', 'S', 'K', 'T', 'D', 'J'], ['D', 'B', 'G', 'U', 'N', 'A', 'S', 'Q', 'F', 'R', 'E', 'Y', 'L', 'O', 'T', 'I', 'J', 'P', 'K', 'C', 'Z', 'X', 'H', 'M', 'W', 'V'], ['Z', 'V', 'S', 'X', 'C', 'G', 'J', 'Q', 'O', 'H', 'A', 'W', 'R', 'N', 'M', 'L', 'U', 'T', 'Y', 'P', 'D', 'K', 'I', 'B', 'F', 'E'], ['E', 'X', 'R', 'F', 'M', 'Y', 'W', 'L', 'P', 'H', 'C', 'N', 'B', 'J', 'Z', 'S', 'G', 'D', 'I', 'O', 'Q', 'V', 'U', 'A', 'T', 'K'], ['V', 'Q', 'M', 'K', 'A', 'X', 'R', 'S', 'Z', 'E', 'B', 'H', 'I', 'O', 'D', 'L', 'Y', 'T', 'N', 'C', 'G', 'F', 'J', 'W', 'U', 'P'], ['R', 'G', 'Y', 'D', 'F', 'A', 'J', 'L', 'B', 'V', 'K', 'P', 'H', 'Z', 'Q', 'S', 'O', 'X', 'E', 'C', 'T', 'M', 'U', 'N', 'W', 'I'], ['P', 'W', 'B', 'X', 'H', 'Q', 'E', 'J', 'I', 'G', 'A', 'D', 'S', 'F', 'O', 'U', 'T', 'V', 'C', 'Z', 'N', 'M', 'Y', 'K', 'L', 'R'], ['S', 'P', 'E', 'F', 'Q', 'N', 'R', 'X', 'U', 'D', 'M', 'Y', 'I', 'A', 'V', 'H', 'B', 'T', 'C', 'G', 'K', 'L', 'O', 'J', 'Z', 'W'], ['O', 'F', 'E', 'X', 'L', 'J', 'Z', 'I', 'B', 'G', 'Q', 'R', 'N', 'D', 'K', 'M', 'Y', 'S', 'P', 'V', 'A', 'T', 'C', 'W', 'H', 'U'], ['H', 'S', 'J', 'E', 'Q', 'L', 'I', 'R', 'N', 'O', 'C', 'F', 'V', 'T', 'B', 'G', 'Z', 'Y', 'D', 'A', 'W', 'U', 'P', 'M', 'K', 'X'], ['I', 'S', 'B', 'U', 'Z', 'R', 'L', 'V', 'Q', 'C', 'Y', 'E', 'K', 'P', 'J', 'G', 'F', 'T', 'W', 'O', 'A', 'H', 'X', 'D', 'M', 'N'], ['M', 'X', 'D', 'E', 'W', 'L', 'R', 'Q', 'V', 'S', 'U', 'I', 'F', 'G', 'N', 'P', 'C', 'A', 'O', 'Z', 'H', 'K', 'T', 'Y', 'B', 'J']] lines=[] cnt=0 for d in dictories: # print(d) tmp ='' for c in d: tmp +=c lines.append(tmp) cnt +=1 # print(lines) for ch in uppercase: index = uppercase.index(ch) table[ch] = lines[index] print(table) # print(uppercase) # # 加密/解密 def encrypt(plainText, key): result = [] # 创建cycle对象,支持密钥字母的循环使用 currentKey = cycle(key) # print(currentKey) for ch in plainText: if 'A' <= ch <= 'Z': index = uppercase.index(ch) # 获取密钥字母 ck = next(currentKey) # print('ck:',ck) for i in range(26): if ch == table[ck][i]: result.append(uppercase[i]) else: result.append(ch) return ''.join(result) # 解密 fp = open(r'C:\Users\PC\Desktop\ctf\cipher_text.txt','r')#密文文件 op = open(r'C:\Users\PC\Desktop\ctf\res1.txt','w') #输出文件 q=fp.read() # print(q) key = 'ABCDE' op.write(encrypt(q,key)) op.close() fp.close()
将解密后的文件写入16进制编辑器,得到resul.zip
2.2 解压zip
思路 :
- 1.直接ARCHPR爆破密码
- 2.crc32爆破
- 遗憾的是都不行,后来请教其他师傅得知是根据crc32爆破得到的内容组成新字典进行爆破~
python main.py -f result.zip
#得到output.dic字典,再使用ARCHPR字典爆破即可.密码自行尝试就不贴了
2.3解密flag.txt
这个是base解密,网上找了个base循环解密脚本.
#-*- coding:utf-8 -*- import base64 s='' with open(r'C:\Users\PC\Desktop\ctf\flag1.txt', 'r', encoding='UTF-8') as f: #输入文件 s="".join(f.readlines()).encode('utf-8') src=s while True: try: src=s s=base64.b16decode(s) str(s,'utf-8') continue except: pass try: src=s s=base64.b32decode(s) str(s,'utf-8') continue except: pass try: src=s s=base64.b64decode(s) str(s,'utf-8') continue except: pass break with open(r'C:\Users\PC\Desktop\ctf\flag2.txt','w', encoding='utf-8') as file: #输出文件 file.write(str(src,'utf-8')) print("ok!")
得到flag2.txt
拿到flag!!
标签:Bugku,utf,uppercase,解密,破译,wp,print,爆破,txt From: https://www.cnblogs.com/stickonit/p/17068043.html