menu Ga1@xy's Wor1d
buuctf_crypto部分wp(6.21更)
670 浏览 | 2020-04-21 | 阅读时间: 约 3 分钟 | 分类: wp,CRYPTO,BUUCTF | 标签: 刷题wp,BUUCTF,Crypto
请注意,本文编写于 546 天前,最后修改于 485 天前,其中某些信息可能已经过时。

[BJDCTF2020] 这是base??

  • 考点:换表base64

题目附件中给出的文档明确指出本题的考点,并且给了一个码表,我们需要对照给的密文和码表还原出原来的base64密文才能进行解密

附原表

写脚本还原以下即可

dict={0: 'J', 1: 'K', 2: 'L', 3: 'M', 4: 'N', 5: 'O', 6: 'x', 7: 'y', 8: 'U', 9: 'V', 10: 'z', 11: 'A', 12: 'B', 13: 'C', 14: 'D', 15: 'E', 16: 'F', 17: 'G', 18: 'H', 19: '7', 20: '8', 21: '9', 22: 'P', 23: 'Q', 24: 'I', 25: 'a', 26: 'b', 27: 'c', 28: 'd', 29: 'e', 30: 'f', 31: 'g', 32: 'h', 33: 'i', 34: 'j', 35: 'k', 36: 'l', 37: 'm', 38: 'W', 39: 'X', 40: 'Y', 41: 'Z', 42: '0', 43: '1', 44: '2', 45: '3', 46: '4', 47: '5', 48: '6', 49: 'R', 50: 'S', 51: 'T', 52: 'n', 53: 'o', 54: 'p', 55: 'q', 56: 'r', 57: 's', 58: 't', 59: 'u', 60: 'v', 61: 'w', 62: '+', 63: '/', 64: '='}
a=''
for i in range(65,91):
    a+=chr(i)

for i in range(97,123):
    a+=chr(i)

for i in range(48,58):
    a+=chr(i)

ch='FlZNfnF6Qol6e9w17WwQQoGYBQCgIkGTa9w3IQKw'
s=''
for i in ch:
    s+=a[list(dict.values()).index(i)]

print s.decode('base64')

运行脚本得到flag:flag{D0_Y0u_kNoW_Th1s_b4se_map}

[WUSTCTF2020] B@se

  • 考点:未知位置换表base64

下载附件得到txt文件,其中给了密文和换了表的base64码表,但是表中缺失了四位

手动查一下发现缺少了j u 3 4这四位,通过对比密文,可以发现在缺少的四位中,密文只含有j 3这两项,所以我们只需要枚举这两个字符在缺失的四位中的排列位置,写个脚本每次手动改一下就行

d='JASGBWcQPRXEFLbCDIlmnHUVKTYZdMovwipatNOefghq56rs3**jkxyz012789+/'
a=''
for i in range(65,91):
    a+=chr(i)

for i in range(97,123):
    a+=chr(i)

for i in range(48,58):
    a+=chr(i)

ch='MyLkTaP3FaA7KOWjTmKkVjWjVzKjdeNvTnAjoH9iZOIvTeHbvD'
s=''
for i in ch:
    s+=a[d.index(i)]

s+='=='
print s.decode('base64')

经过多次尝试,最终发现3在第一位,j在第四位的时候可以成功解得flag

flag:flag{base64_1s_v3ry_e@sy_and_fuN}

rot

  • 考点:rot13 & md5爆破

下载附件得到txt文件,其中写了一长串的数字,第一个想法就是将每个数字都转换成对应的ASCII码,但是写脚本时每行一个数字比较方便,所以我们先将txt中多余内容删去,然后将空格替换为回车,此处就涉及到了如何替换成回车:回车在替换时可用^p表示

替换后写脚本,将数字转换为对应的ASCII码,由于正常转换会出现不可显示的字符,而且本题题目的rot,我们尝试rot13

out=''
f=open('rot.txt','r')
while 1:
    a=f.readline().strip()
    if a:
        out+=chr(int(a)-13)
    else:
        break

print out

得到结果如下

FLAG IS flag{www_shiyanbar_com_is_very_good_????}
MD5:38e4c352809e150186920aac37190cbc

刚开始我以为上面的就是flag,但是交上去后却不对,而且还给了md5值,想到需要通过下面的md5值将完整的flag爆破出来,即求出flag中表示的字符,而且在线网站也无法还原这道题中的MD5,所以写脚本

import hashlib

count=0
md5='38e4c352809e150186920aac37190cbc'
str='flag{www_shiyanbar_com_is_very_good_'
while count==0:
    for i in range(32,127): # 可显示字符ASCII码的对应值为32~126
        a=chr(i)
        for i in range(32,127):
            b=chr(i)
            for i in range(32,127):
                c=chr(i)
                for i in range(32,127):
                    d=chr(i)
                    flag=str+a+b+c+d+'}'
                    m=hashlib.md5(flag)
                    m=m.hexdigest()
                    if cmp(m,md5)==0:
                        count=1
                        print flag

运行脚本得到flag:flag{www_shiyanbar_com_is_very_good_@8Mu}

[ACTF_2020] crypto-classic1

  • 考点:键盘密码 & 维吉尼亚密码

下载附件得到hint.txt和一个加密过的压缩包,查看hint.txt,是键盘密码的一种,由空格分隔的每个字符串都包上了键盘的一个字母,比如xdfv包上了c,将这留个字母解出来拼在一起得到压缩包密码:circle

压缩包名字提示为维吉尼亚加密,但是没有给密钥,我们已知flag的格式为ACTF{},即密文中的SRLU对应明文的ACTF,而维吉尼亚加密有一个特点(划重点),可以通过密文和明文来推导出密钥,我们将已知对应明文部分的密文(本题中即为SRLU,对应ACTF)作为明文,将已知的明文(即ACTF)作为密钥进行解密

将得到的内容去重,即为加密的密钥,本题中即sp,再用sp作为密钥解密即可得到flag,不过需要注意的是在解密时我们需要将那几个特殊符号{}_用相同的字母替换掉,比如我都用b替换掉

再将得到的明文中对应的位置换回原来的符号即可得到flag

flag:flag{what_a_classical_vigenere}

yxx

  • 考点:xor

本题和异性相吸那题差不多,可能题目名字里少了个x(2333

下载附件得到两个txt文件,用010editor打开发现长度相同,直接尝试xor,即可得到flag

a = '6C 6F 76 65 6C 6F 76 65 6C 6F 76 65 6C 6F 76 65 6C 6F 76 65 6C 6F 76 65 6C 6F 76 65 6C 6F 76 65'.replace(' ','')
b = '0A 03 17 02 56 01 15 11 0A 14 0E 0A 1E 30 0E 0A 1E 30 0E 0A 1E 30 14 0C 19 0D 1F 10 0E 06 03 18'.replace(' ','')
flag = ''
for i in range(0,len(a),2):
    x = '0x' + a[i:i+2]
    y = '0x' + b[i:i+2]
    flag += chr(int(x,16) ^ int(y,16))

print flag

flag:flag{xor_xor_xor_biubiubiu}

全部评论

info 评论功能已经关闭了呐!