代码解密题
flag = 'xxxxxxxxxxxxxxxxxxxxx'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = ''
for i in range(len(flag)):s1 = ord(flag[i])//17s2 = ord(flag[i])%17result += s[(s1+i)%34]+s[-(s2+i+1)%34]
print(result)
# result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
这道题 看大家都是通过一个 爆破的方式来做的
我第一次没想到这个要咋整 看了wp发现 爆破确实ok
这里解释一下命令
for i in range(len(flag)):s1 = ord(flag[i])//17s2 = ord(flag[i])%17result += s[(s1+i)%34]+s[-(s2+i+1)%34]先查看加密的方法 首先根据flag的长度 获取i然后 将 flag的i位 分别 // 和 % 一个地板除 一个取余数然后result的取证 是两个 s 字符串相加 并且 第一个 s 是通过 (s1+i)%34 第二个 s 是通过-(s2+i+1)%34 两个获得 s的位数
分析完这个后 我们思考一下如何爆破
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
flag = ''
for i in range(len(result)//2):for j in range(33,125):s1 = j//17s2 = j%17a=(s1+i)%34b=-(s2+i+1)%34if (result[2 * i] == s[a] and result[2 * i + 1] == s[b]):flag += chr(j)breakprint(flag)
我们来解释一下
首先 len()//2 的原因是 result= s[x]+s[y]所以是2倍长 我们需要//2其次for i in range(32,128)是在ascii a-z1-9进行爆破s1 s2 我们通过爆破的方式确定然后a b 就是s的位数最后通过 result 进行比对 [2*i ] 也是因为其中存在2位
这里就知道了 因为是2个2个加的 所以我们比对 也需要 *2
如果第一位和第二位都和 result一样 那么这个时候 取的flag[i] 也就符合flag的值了