ISCC2019-digdigdig

终于做出来这道题了,一共三段加密,不了解各加密方式的算法吃了大亏。。。

第一层:

base64需要用到的字符,再看后面的取余3,替换为=,更加确定了,经过动态调试,验证了确实是。

第二层:

一味的逆算法,却没动脑子,直到拿到flag看到提示才知道这是rot13,我是真的菜。也很好辨认,取余26很明显的特征,当时不知道想啥呢。

第三层:

现在还不知道什么加密,希望有大佬指点。

i是长度,v12就是解密的第一个字符,可以很容易知道我们最终是与‘@1DE!440S9W9,2T%Y07=%<W!Z.3!:1T%S2S-),7-$/3T ’这段字符串比较,第一个是@,剩余44个字符进行解密。因为长度是32,我们先解密前40个字符,最后4个特殊,另解。

下面给出代码:

第一步:

stri = '1DE!440S9W9,2T%Y07=%<W!Z.3!:1T%S2S-),7-$/3T '
s = string.ascii_letters + string.digits
i3 = ''
o = [0, 0, 0, 0]
i = 0
while i < 40:
    break_flag = 0
    print(i)
    for x in s:
        for y in s:
            for z in s:
                o[0] = (ord(x) >> 2) + 32
                o[1] = ((16 * ord(x) & 0x30) + 32) | (ord(y) >> 4)
                if i == 40:
                    o[2] = ((4 * ord(y) & 0x3c) + 32) | (0 >> 6)
                    o[3] = 32
                else:
                    o[2] = ((4 * ord(y) & 0x3c) + 32) | (ord(z) >> 6)
                    o[3] = (ord(z) & 0x3f) + 32
                if o[0] == ord(stri[i]) and o[1] == ord(stri[i+1]) and o[2] == ord(stri[i+2]) and o[3] == ord(stri[i+3]):
                    i3 += x + y + z
                    print(i3)
                    i += 4
                    break_flag = 1
                    break
            if break_flag == 1:
                break
        if break_flag == 1:
            break
print(i3)
最后4个解密:
for i in s:
for j in s:
o[0] = (ord(i) >> 2) + 32
o[1] = ((16 * ord(i) & 0x30) + 32) | (ord(j) >> 4)
o[2] = ((4 * ord(j) & 0x3c) + 32) | (0 >> 6)
if o[0] == ord('/') and o[1] == ord('3') and o[2] == ord('T'):
i3 += i + j
break

  第二步:

tmp = ''
for i in range(len(ou)):
    for j in range(255):
        if j <= 64 or j > 90:
            if j <= 96 or j > 122:
                o1 = j
            else:
                o1 = (j - 84) % 26 + 97
        else:
            o1 = (j - 52) % 26 + 65
        if chr(o1) == ou[i]:
            tmp += chr(j)
            break
print(tmp)
或者直接rot13

  第三步:

base64解密吧,不写脚本了麻烦,哈哈哈。

 

posted @ 2019-05-17 16:21  s1lenc3  阅读(286)  评论(0编辑  收藏  举报