【CTF】BUUCTFCrypto 部分题解(持续更新)

Crypto 1

还原大师
佛说:只能四天

还原大师

题目

我们得到了一串神秘字符串:TASC?O3RJMV?WDJKX?ZM,问号部分是未知大写字母,为了确定这个神秘字符串,我们通过了其他途径获得了这个字串的32位MD5码。但是我们获得它的32位MD5码也是残缺不全,E903???4DAB???08???51?80??8A?,请猜出神秘字符串的原本模样,并且提交这个字串的32位MD5码作为答案。 注意:得到的 flag 请包上 flag{} 提交

解题思路

题目表示神秘字符串未知的问号部分为大写字母,我们可以将每一个位置替换成可能的字母(共262626种可能结果),计算MD5加密后的值,与题目所给的MD5比较。

解题脚本

import hashlib

s = "TASC?O3RJMV?WDJKX?ZM"
s_md5 = "E903???4DAB????08?????51?80??8A?"
for i in range(26):
    # 替换第一个?
    s1 = s.replace("?", chr(65 + i), 1)
    for j in range(26):
        # 替换第二个 ?
        s2 = s1.replace("?", chr(65 + j), 1)
        for k in range(26):
            # 替换第三个 ?
            s3 = s2.replace("?", chr(65 + k), 1)
            # 将替换后的字符串进行MD5加密
            c = hashlib.md5(s3.encode("utf-8")).hexdigest().upper()
            if c.startswith(s_md5[0:4]):
                 print("flag{" + c + "}")

运行结果
flag{E9032994DABAC08080091151380478A2}

注:

 c = hashlib.md5(s3.encode("utf-8")).hexdigest().upper()
  • 在使用 hashlib 计算 md5 值时,需要将字符串先转换为字节类型,然后再计算其 md5 值。
  • hexdigest 函数是 hashlib 库中 md5 函数的一个方法,用于将 md5 函数计算出来的二进制数据转换为 16 进制字符串。
    思路来源于大佬原文链接

[WUSTCTF2020]佛说:只能四天

题目

题目描述:圣经分为《旧约全书》和《新约全书》
题目:尊即寂修我劫修如婆愍闍嚤婆莊愍耨羅嚴是喼婆斯吶眾喼修迦慧迦嚩喼斯願嚤摩隸所迦摩吽即塞願修咒莊波斯訶喃壽祗僧若即亦嘇蜜迦須色喼羅囉咒諦若陀喃慧愍夷羅波若劫蜜斯哆咒塞隸蜜波哆咤慧聞亦吽念彌諸嘚嚴諦咒陀叻咤叻諦缽隸祗婆諦嚩阿兜宣囉吽色缽吶諸劫婆咤咤喼愍尊寂色缽嘚闍兜阿婆若叻般壽聞彌即念若降宣空陀壽愍嚤亦喼寂僧迦色莊壽吽哆尊僧喼喃壽嘚兜我空所吶般所即諸吽薩咤諸莊囉隸般咤色空咤亦喃亦色兜哆嘇亦隸空闍修眾哆咒婆菩迦壽薩塞宣嚩缽寂夷摩所修囉菩阿伏嘚宣嚩薩塞菩波吶波菩哆若慧愍蜜訶壽色咒兜摩缽摩諦劫諸陀即壽所波咤聞如訶摩壽宣咤彌即嚩蜜叻劫嘇缽所摩闍壽波壽劫修訶如嚩嘇囉薩色嚤薩壽修闍夷闍是壽僧劫祗蜜嚴嚩我若空伏諦念降若心吽咤隸嘚耨缽伏吽色寂喃喼吽壽夷若心眾祗喃慧嚴即聞空僧須夷嚴叻心願哆波隸塞吶心須嘇摩咤壽嘚吶夷亦心亦喃若咒壽亦壽囑囑
Hint:

  1. 虽然有点不环保,但hint好像是一次性的,得到后就没有利用价值了。

  2. 凯撒不是最后一步,by the way,凯撒为什么叫做凯撒?

解题思路

题目套路多少是有点深,确实是得认真思考一下题目

1.参悟佛的真意

题目中全部是佛文,尝试使用佛曰加密
【CTF】BUUCTFCrypto 部分题解(持续更新)_第1张图片

2.社会主义价值观加密

得到的结果全是社会主义价值观相关的内容,一问度娘确实有社会主义核心价值观加密
【CTF】BUUCTFCrypto 部分题解(持续更新)_第2张图片

3.栅栏加密
通过doyouknowfence可知道需要经过栅栏密码解密
【CTF】BUUCTFCrypto 部分题解(持续更新)_第3张图片

4.凯撒加密 AND Base32
同样的,看到doyoukonwCaesar可知需要进行凯撒密码解密,并且借助Hint可知凯撒加密并不是最后一步,观察前面的字符串,都是大写字母以及2-7的数字,盲猜一波Base32
解题脚本:

import base64


def caesarCrack(c, n):
    alpha = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
    c = c.upper()
    m = ""
    for i in c:
        index = alpha.find(i)
        if index != -1:
            index = (index + n) % 26
            m += alpha[index]
        else:
            m += i
    return m


if __name__ == '__main__':
    c = "R5UALCUVJDCGD63RQISZTBOSO54JVBORP5SAT2OEQCWY6CGEO53Z67L"
    # 用'='填充字符串使其长度为8的倍数, 方便后序进行Base32解密
    lenPadding = 8 - (len(c) % 8)
    c += lenPadding * "="
    for i in range(1, 26):
        ca = caesarCrack(c, i)
        m = base64.b32decode(ca)
        try:
            m = m.decode()
            print(m)
        except UnicodeDecodeError:
            continue

结果

wctf2020{ni_hao_xiang_xiang_da_wo}

由此可知FLAG IS flag{ni_hao_xiang_xiang_da_wo}

题目思考

  1. 佛说:只能四天,开始笔者认为是使用了四种加密方法,实际过程中则是使用了五种,那四天到底指什么呢?
  2. 圣经分为《旧约全书》和《新约全书》,可以看到使用栅栏密码以及凯撒密码解密之前,都是删除了doyoukonwxxxx,大概这就是指“新旧”。
  3. 眼看wp是如此的一帆风顺,实则笔者做了各种尝试,心情正如flag所言。

你可能感兴趣的:(CTF,Buuctf,Crypto,python)