参考nssctf网站的jay687,tywwwwwwwyt的wp

这部分是rc4的初始化和加密
18行进行了异或,将结果放在了res(一个列表)中
19行把结果放在cipher中
"".join(res) 的工作原理:
"" 是一个空字符串,用作连接符
.join()`方法将列表中的所有元素用指定的连接符连接起来
由于连接符是空字符串 "",所以元素会直接拼接在一起
例如:res = ['f', 'l', 'a', 'g', '{', 't', 'e', 's', 't', '}'] cipher = "".join(res) print(cipher) # 输出: "flag{test}"
20和21分别对cipher进行了base64的编码和解码,相当于没变
22行进行了url编码
URL 编码将特殊字符转换为 % 后跟两位十六进制数的形式
例如:空格 " " 编码为 "%20",中文字符 "中" 编码为 "%E4%B8%AD"
urllib.parse.quote()是 Python 标准库中用于 URL 编码的函数
针对这些我们可以把加密后的字符串先解开这个URL
再把字符串经过rc4,异或
得到结果
具体代码:文章 - [SWPUCTF 2021 新生赛]简简单单的解密 | NSSCTF
import base64
import urllib.parse
key = "HereIsFlagggg"
enc = "%C2%A6n%C2%87Y%1Ag%3F%C2%A01.%C2%9C%C3%B7%C3%8A%02%C3%80%C2%92W%C3%8C%C3%BA"
flag = ""
crypt =urllib.parse.unquote(enc)
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
for s in crypt:
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]
flag += chr(ord(s) ^ k)
print(flag)

被折叠的 条评论
为什么被折叠?



