下载附件后看到源码
# flag = 'xxxxxxxxxxxxxxxxxxxxx'
# s = 'wesyvbniazxchjko1973652048@$+-&*<>'
# result = ''
# for i in range(len(flag)): # 循环的次数是flag的长度
# s1 = ord(flag[i])//17 # 计算s1
# s2 = ord(flag[i])%17 # 计算s2
# result += s[(s1+i)%34] + s[-(s2+i+1)%34] # 这是字符的链接,循环一次得到的是两个字符
# print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
解释先关函数和运算符......:
flag = "xxxxxxxxxxxxxxxxxxxx" (这21个x是占位符,等于告诉了我们flag长度是21)
s = 'wesyvbniazxchjko1973652048@$+-&*<>' (这是加密表,就和base64的加密表一样)
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i' (这是加密后的flag)
len()函数:返回字符串、列表、字典、元组等长度
ord()函数:是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值,如果所给的 Unicode 字符超出了 Python 定义范围,则会引发一个 TypeError 的异常
range() 函数: range函数说白了就是产生一组列表,这个列表是一个可迭代对象
所以 for index in range(0,10):才能开始循环
加密过程:
加密结果:
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
方法一:直接爆破
就是去猜flag,把可能的flag(字符)拿去加密过程加密,之后把加密的结果和result对比如果相同这就是flag
exp如下:
flag = " "
result = "v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i"
s = "wesyvbniazxchjko1973652048@$+-&*<>"
for i in range(len(result) // 2): # 循环次数其实就是flag的长度(21)
for j in range(32, 127): # Aiscll码可打印字符的范围,因为flag是一串字符,里面的字符是在Aiscll表上的
s1 = j // 17
s2 = j % 17
if result[2 * i] == s[(s1 + i) % 34] and result[2 * i + 1] == s[-(s2 + i + 1) % 34]:
flag += chr(j)
print(flag)
方法二:直接求解
result += s[(s1+i)%34]+s[-(s2+i+1)%34] 这里的“ + ”是起连接字符的作用
第一次循环,当i等于1时 [(s1+i)%34] 等于[( )%34]
[-(s2+i+1)%34] 都代表的是S的位数
暂时写道这里有空再写(*^_^*)
NSSCTF{Fake_RERE_QAQ}