首页 > 其他分享 >Bugku-不可破译的密码[wp]

Bugku-不可破译的密码[wp]

时间:2023-01-26 18:44:07浏览次数:78  
标签:Bugku utf uppercase 解密 破译 wp print 爆破 txt

一 题目分析

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爆破得到的内容组成新字典进行爆破~
  由于pass1-5文件大小只有6字节,可以考虑crc32爆破文件内容,例如:   将每个文件得到的值组成新的字典进行爆破.这里直接使用出题人的脚本,GitHub链接  
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

相关文章

  • 青少年CTF-Hanser!![wp]
    一题目描述 二解题步骤1.hanser.txtA‌‌​‎‏​‌​‎‏​‏‏‌​‎​‍‌​‍‍​‎‏​‏‏‌​‌‎​‌‏​‏‏‌​‍‏​‎​‏‎​‌‎​‎‍​‍‎​......
  • Bugku-ez_misc[wp]
     题目描述   1.拿到一份abc.rar文件,里面有一个加密call.png(1)通过file 、binwalk、伪加密一顿小输出都不行,于是放进16进制编辑器查看:文件头不对!(2)修改为后......
  • WPF-3D图形
    WPF-3D图形WPF的3D功能可以在不编写任何c#代码的情况下进行绘制,只需要使用xaml即可完成3D图形的渲染。本文主要讲述了WPF-3D中的关键概念,以及常用到的命中测试、2d控件如......
  • 2022ISCTF Crypto wp
    ISCTFCryptowp1.这是什么古典玩意题目:Theflagis:ISCTF{part1_part2_part3}example:part1:aaapart2:bbbpart3:!@#flag:ISCTF{aaa_bbb_!@#}-----------------......
  • wpf 空间坐标系下,画一个立方体轮廓
    代码:publicpartialclassMainWindow:Window{publicMainWindow(){InitializeComponent();Worignpt=newPoi......
  • WPS优缺点
    产品优点编辑 播报·WPS能够在网络中为接入点及WPS客户端设备自动配置网络名(SSID)及WPA安全密钥。·当连接WPS设备时,用户没有必要去了解SSID和安全密钥等概念。·......
  • SICTF_wp
    misc签到打卡完成附加下载完成之后可以看到是qsnctf的公众号使用010打开附件可以发现key,去公众号回复key即可获得flagSICTF{fb23cefd-487f-42dd-a343-2a06194efc60}......
  • CSS Units: large, small, dynamic viewport units All In One
    CSSUnits:large,small,dynamicviewportunitsAllInOneThelarge,small,anddynamicviewportunitsCSSUnitsvh/vwvw=1%ofthewidthoftheviewport......
  • SICTF2023 web_wp
    兔年大吉源码如下<?phphighlight_file(__FILE__);error_reporting(0);classHappy{private$cmd;private$content;publicfunction__construct($......
  • Use Database.GetViewports
    布局自己本身就是一个视口。UseDatabase.GetViewports(true)依次返回的是,模型空间中的视口、布局一本身、布局一中的视口、布局二本身、布局二中的视口。UseDatabase.......