Easy_Encryption
安洵杯2019逆向
链接:https://pan.baidu.com/s/1w2ZTaNpzN-bI18cc0iRKdw
提取码:7cuc
复制这段内容后打开百度网盘手机App,操作更方便哦
首先是在函数中看到输入flag,我们重命名标记下,然后下面就是判定,看起来没有那么复杂的题目,
下面的基本上不需要管,我们简单分析下逻辑,首先时输入flag,然后再函数set
中flag和v9相联系,然后接下来v9再函数check
中用于判定,我们进入check
看下:
一个比较显眼的比较字符串,然后上面比较的字符串就是我们的a2即main中的v9在函数中处理得到的,
我们看下这个处理函数base64
:
这里是较为明显的位置,这个函数就是个base64的编码过程,
所以我们的v9就是那一串明文的base64解密:
import base64
s = "YXJ0cWtvZWhxcGtiaWh2"
print(base64.b64decode(s))
#b'artqkoehqpkbihv'
这个就是我们的v9了,我们再看main函数中的set
函数,
但是比较长我们就单独拿出来了较关键的部分
这里是先设置好了数组v15
这里是使用flag生成v9,我们可以看到相关的加密运算,
但是要注意一个位置:
if ( (flag[i_1] + v15[k] - 97) % 26 + 97 > 122 )
这里前面的一个%26
的运算结果只会是0–25,+97
在97–122之间,一定不会超过122,这个判断恒为false。
我们这一步唯一的点就在这个%26
会舍去n*26
,这里的n的确定,唯一的依据:
if ( flag[i_1] < 97 || flag[i_1] > 122 )
这里就一点点爆破吧,我是直接写出来,然后看了看有哪些不对的手动加加:
s = 'artqkoehqpkbihv'
arr = []
base = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
for i in range(64):
arr.append(abs(ord(base[i])-97))
print(arr)
a = b = c = 0
for i in range(len(s)):
a = ord(s[i])
c = a - 97
b = c + 97 - arr[i] + 26
print(b,end=',')
if b < 97 or b >122 :
print('---',b,'----',end=',')
然后最后得到:数据,然后再转化为字符为:umpnineissogood
然后师傅的wp中就比较优雅的:
v3 = [32, 31, 30, 29, 28, 27, 26, 25, 24, 23, 22, 21, 20, 19, 18, 17, 16, 15, 14, 13, 12, 11, 10, 9, 8, 7, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 49, 48, 47, 46, 45, 44, 43, 42, 41, 40, 54, 50]
j = 0
a2 = ''
for i in 'artqkoehqpkbihv':
tmp = ord(i) - 97
guess1 = tmp + 97 - v3[j]
print(chr(guess1))
if 97 <= guess1 and guess1 <= 122:
a2 += chr(guess1)
j += 1
continue
if 97 <= guess1 + 26 and guess1 +26 <= 122:
a2 += chr(guess1 + 26)
j += 1
continue
if 97 <= guess1 + 2 * 26 and guess1 + 2 * 26 <= 122:
a2 += chr(guess1 + 2 * 26)
j += 1
continue
if 97 <= guess1 +3 * 26 and guess1 +3 * 26 <= 122:
a2 += chr(guess1 + 3 * 26)
j += 1
continue
print(a2)
得到flag:umpnineissogood