前言
NSS上的[SWPUCTF 2021 新生赛]非常简单的逻辑题
知识点
python
爆破
题目
下载附件得到python源码
flag = 'xxxxxxxxxxxxxxxxxxxxx'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
s1 = ord(flag[i])//17
s2 = ord(flag[i])%17
result += s[(s1+i)%34]+s[-(s2+i+1)%34]
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for循环中,
执行次数为flag
的长度
s1
是对flag
的ASCll值取整得到的
s2
是对flag
的ASCll值取余得到的
result
由一个需要s1
,s2
的加密算法得到
思路
知识补充
python3 range()函数
返回的是一个可迭代对象(类型是对象),而不是列表类型, 所以打印的时候不会打印列表
for number in range(1, 6, 2):#开始值,结束值,步长(负数时从结束值生成序列)
print(number)
#1
#3
#5
操作
因为result
的获取需要同时对s1
和s2
进行运算,所以这里博主选择通过遍历字符的方式对flag
进行爆破
那么就要再套一层for循环用于遍历每个字符,即for j in range(255)
注意这里是将爆破出来的temp
与result
按位进行比较,而且加密算法中的+
是拼接字符的意思,所以第一层的for循环步长需为2
加密算法不变,但是由于i
的序列变化,所以这里需要再使用一个num
参数,在判断成功语句结尾使值+1
编写python脚本如下
flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
temp = ''
num = 0
for i in range(0, len(result), 2):
for j in range(255):
s1 = j // 17
s2 = j % 17
temp = s[(s1 + num) % 34] + s[-(s2 + num + 1) % 34]
if (temp == result[i:i + 2]):
flag += chr(j)
num += 1
print(flag)
这里还有大佬的非爆破解法一并贴上,好像是对模的逆运算(?
flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(0,len(result),2):
s1 = s.index(result[i]) - i//2
s2 = 34 - s.index(result[i+1]) -i//2 -1
flag += chr(s1*17+s2)
print(flag)
总结
年轻人的第一次爆破(