安洵杯-Easy_Encryption-wp

Easy_Encryption

安洵杯2019逆向
链接:https://pan.baidu.com/s/1w2ZTaNpzN-bI18cc0iRKdw
提取码:7cuc
复制这段内容后打开百度网盘手机App,操作更方便哦

首先是在函数中看到输入flag,我们重命名标记下,然后下面就是判定,看起来没有那么复杂的题目,

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-VEwbGrax-1575295989529)(rec/image-20191202212643900.png)]

下面的基本上不需要管,我们简单分析下逻辑,首先时输入flag,然后再函数set中flag和v9相联系,然后接下来v9再函数check中用于判定,我们进入check看下:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-qn4Ud6iD-1575295989534)(rec/image-20191202212751802.png)]

一个比较显眼的比较字符串,然后上面比较的字符串就是我们的a2即main中的v9在函数中处理得到的,

我们看下这个处理函数base64:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HU9WQtG0-1575295989536)(rec/image-20191202212920298.png)]

这里是较为明显的位置,这个函数就是个base64的编码过程,

所以我们的v9就是那一串明文的base64解密:

import base64
s = "YXJ0cWtvZWhxcGtiaWh2"
print(base64.b64decode(s))
#b'artqkoehqpkbihv'

这个就是我们的v9了,我们再看main函数中的set函数,

但是比较长我们就单独拿出来了较关键的部分

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-Xfz0QEMS-1575295989540)(rec/image-20191202213420391.png)]

这里是先设置好了数组v15

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-T1FfflFC-1575295989549)(rec/image-20191202213601028.png)]

这里是使用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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值