给了一个py脚本,先看到源码分析部分:
大概逻辑,就是我依次读我的flag值,s1进行除的运算,s2进行余,然后读s拼成最后的结果。
并且要注意的是针对这里的result += s[(s1+i)%34]+s[-(s2+i+1)%34]这一步,其实实现的是字符上的拼接而不是直接的数值相加,相当于s1构成结果的第一位,s2构成结果的第二位
而我们的除数和余数可以共同构成我们的一个数,所以flag的每一位=s1*17+s2
所以这里最后有两种解题的思路:第一种是顺着解,直接逆向运算;第二种就是顺着我们的脚本直接爆破。
首先是第一种方法:看到源码:
flag = ''
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):
s1 = ord(flag[i])//17
#数值和17的除数
s2 = ord(flag[i])%17
#数值和17的余数(注意这里肯定是一个0-9的数字)
result += s[(s1+i)%34]+s[-(s2+i+1)%34]
#这里是字符的拼接
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
这里我们顺着这个逻辑来一下result第一位是v对应s中4(从0开始),也就是说(s1+i)%34=4,所以s1=4,第二位23,所以s2=10
最终我们对应的flag第一位:4*17+10=78,就是N(所以这里对我们的s2有一层负数的校验在里面)
这里对应的exp:
flag = ' '
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
for i in range(21):
a1 = s.find(result[i*2])
#找索引
s1= a1 - i
#逆向算s1
a2 = s.find(result[i*2+1])
#找索引
s2 = 34 - a2 -i -1
#逆向算s2
if s2 < 0:
s2 = s2+34
else:
flag += chr(s1*17 + s2)
#得到还原flag的每一位
print(flag)
第二种解法纯爆破,我觉得没啥意思就不留了,大概就是写好然后遍历结果相等。