[SWPUCTF 2021 新生赛]简简单单的解密

发布时间 2023-05-09 12:27:11作者: TFOREVERY

拿到一个.py的文件,查个壳:

进入看看是怎么个解密:

挺长,感觉还有点像RC4的加密方式(这个不讨论),往下看逻辑:

首根据输出,我们能知道,加密后的文档应该是enc,enc又是由crypt而来,crypt又是由cipher而来,而cipher又是由res而来:

看看res怎么来的:

res可以知道是由flag跟k异或而来的,

接着往下看,cipher = "".join(res) 简单来说就是讲res 赋给了 cipher,

?经过base64编码后 又解码? == 可有可无,即整个程序可以这样看:

经过urllib.parse.quote加密,(urllib.parse.quote这玩意是个啥?不懂就查:)

urllib.parse.quote:


查清楚了,那么可以开始写脚本了:

key = "HereIsFlagggg"
flag = "xxxxxxxxxxxxxxxxxxx"

s_box = list(range(256))
j = 0
for i in range(256):
    j = (j + s_box[i] + ord(key[i % len(key)])) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
res = []
i = j = 0
enc1 = '%C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA'
Des = urllib.parse.unquote(enc1)
flag1 = ''
for s in Des:
    i = (i + 1) % 256
    j = (j + s_box[i]) % 256
    s_box[i], s_box[j] = s_box[j], s_box[i]
    t = (s_box[i] + s_box[j]) % 256
    k = s_box[t]
    flag1 += chr(ord(s) ^ k)
print(flag1)

拿到NSSCTF