对 Python 加密时可能会有两种形式,一种是对Python转成的exe进行保护,另一种是直接对.py或者.pyc文件进行保护。
所以对这个.pyc文件我们直接在python在线反编译工具(https://tool.lu/pyc/) 打开,得到了如下的代码:
#!/usr/bin/env python
# visit http://tool.lu/pyc/ for more information
import base64
def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)
return base64.b64encode(s)#对s进行base64编码
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()#输入flag
if encode(flag) == correct:#如果flag调用上面的函数后值等于 correct,就输出correct
print 'correct'
else:
print 'wrong'
分析上述代码,我们只要将这个串”XlNkVmtUI1MgXWBZXCFeKY+AaXNt”解一次base64
再将每个字符ascii码都减下16,接着与32异或即可得到flag。
用python编写脚本如下:
import base64
correct='XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
s = base64.b64decode(correct)#对correct进行解码
flag =''
for i in range(len(s)):
x=ord(s[i])
x=x-16
flag += chr(x^32)
print flag
python2中进行base64编码和解码
import base64
s = ‘我是字符串’
a = base64.b64encode(s)#编码
print a
ztLKx9fWt/u0rg==
print base64.b64decode(a)#解码
我是字符串
python3不太一样:因为3.x中字符都为unicode编码,而b64encode函数的参数为byte类型,所以必须先转码。
import base64
encodestr = base64.b64encode(‘abcr34r344r’.encode(‘utf-8’))
print(encodestr)
打印结果为
b’YWJjcjM0cjM0NHI=’
结果和我们预想的有点区别,我们只想要获得YWJjcjM0cjM0NHI=,而字符串被b”包围了。
b 表示 byte的意思,我们只要再将byte转换回去就好了。。。源码如下
import base64
encodestr = base64.b64encode(‘abcr34r344r’.encode(‘utf-8’))
print(str(encodestr,’utf-8’))
打印结果为
YWJjcjM0cjM0NHI=
补充:
base64模块真正用的上的方法只有8个,分别是encode, decode, encodestring, decodestring, b64encode,b64decode, urlsafe_b64decode,urlsafe_b64encode。他们8个可以两两分为4组,encode,decode一组,专门用来编码和 解码文件的,也可以对StringIO里的数据做编解码;encodestring,decodestring一组,专门用来编码和解码字符串; b64encode和b64decode一组,用来编码和解码字符串,并且有一个替换符号字符的功能。这个功能是这样的:因为base64编码后的字符除 了英文字母和数字外还有三个字符 + / =, 其中=只是为了补全编码后的字符数为4的整数,而+和/在一些情况下需要被替换的,b64encode和b64decode正是提供了这样的功能。至于什 么情况下+和/需要被替换,最常见的就是对url进行base64编码的时候,urlsafe_b64encode和urlsafe_b64decode 一组,这个就是用来专门对url进行base64编解码的,实际上也是调用的前一组函数。