攻防世界easychallenge
攻防世界easychallenge
python相关知识
ord('a')=97
chr(97)=a
^:是指异或运算
1^0=1
1^1=1
题目附件下载下来:是一个pyc文件
为了方便,后面改成test.pyc
经过搜索发现:
pyc是一种二进制文件,是由py文件经过编译后,生成的文件,是一种byte code,py文件变成pyc文件后,加载的速度有所提高,并且编译为pyc文件之后,可以防止源码泄露,所以一些商业软件就通过这种方式,将文件编译为pyc文件再发布
通过查询发现可以通过uncompyle6这个第三方库来进行反编译。
uncompyle6安装:
直接在命令行里
pip install uncompyle6
然后再pyc文件所在的文件夹下打开cmd用以下命令进行反编译(在该文件夹目录搜索框处,打cmd回车就可以)
uncompyle6 -o aaa.py test.pyc
这个aaa.py就是指要反编译生成的py文件的名字,自己随便取名就可以
test.py是下载下来的pyc文件的名称
(提示:这里由于python版本可能会出现问题,这里也给出解决方法)
可能会出现这样的错误
首先我们找到python的安装目录
忘记了的话可以用这样的命令查找
import sys
print(sys.path)
这样就会跳出你的python安装路径
然后在Python\Python310\Lib\site-packages\xdis路径下
找到op_imports.py这个文件打开
查找这个op_imports[canonic_python_version[vers_str]]错误
找到180行的内容
再打开
找到450行这个代码,添加上自己的版本号就可以
这两个代码
import sys
print(sys.version)
就可以查到自己的版本号了
接着打开生成的python文件
# uncompyle6 version 3.8.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)]
# Embedded file name: ans.py
# Compiled at: 2018-08-09 11:29:44
import base64
def encode1(ans):
s = ''
for i in ans:
x = ord(i) ^ 36
x = x + 25
s += chr(x)
return s
def encode2(ans):
s = ''
for i in ans:
x = ord(i) + 36
x = x ^ 36
s += chr(x)
return s
def encode3(ans):
return base64.b32encode(ans)
flag = ' '
print 'Please Input your flag:'
flag = raw_input()
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
if encode3(encode2(encode1(flag))) == final:
print 'correct'
else:
print 'wrong'
是这样的代码,会发现有一些错误,是由python版本引起的进行修改即可,具体修改如下
print('Please Input your flag:')
flag = input()
if encode3(encode2(encode1(flag))) == final:
print('correct')
else:
print ('wrong')
然后观察代码发现,这是一个加密的算法,并且已经给出最后的final值,我们要做的就是把这个final逆推回去,推出flag。
encode1中本来是+25,我们就改为-25,异或逆推的话就是再异或一次就可以,不过原先的加密顺序也要反过来,后面+25,这里就要先-25,然后再异或
所以encode1中就变为
def encode1(ans):
s = ''
for i in ans:
x = ord(i)-25
x = x^36
s += chr(x)
return s
encode2也是类似,原本+36,现在就-36,然后也再异或一次,然后再逆一下原先的加密顺序,也就是先异或,再-36
def encode2(ans):
s = ''
for i in ans:
x = ord(i)^36
x = x-36
s += chr(x)
return s
encode3的加密就变为解密
def encode3(ans):
return base64.b32decode(ans)
原来的那个加密顺序也要改一下要把encode3放在最里面,encode1放在最外面,然后修改后的代码就是
# uncompyle6 version 3.8.0
# Python bytecode 2.7 (62211)
# Decompiled from: Python 3.10.1 (tags/v3.10.1:2cd268a, Dec 6 2021, 19:10:37) [MSC v.1929 64 bit (AMD64)]
# Embedded file name: ans.py
# Compiled at: 2018-08-09 11:29:44
import base64
def encode1(ans):
s = ''
for i in ans:
x = ord(i)-25
x = x^36
s += chr(x)
return s
def encode2(ans):
s = ''
for i in ans:
x = ord(i)^36
x = x-36
s += chr(x)
return s
def encode3(ans):
return base64.b32decode(ans)
flag = ''
final = 'UC7KOWVXWVNKNIC2XCXKHKK2W5NLBKNOUOSK3LNNVWW3E==='
flag=encode1(encode2(encode3(final)))
print(flag)
此时发现会有错误
TypeError: ord() expected string of length 1, but int found
是类型不匹配的问题,通过搜索,可以用.decode()函数,也就是:
flag=encode1(encode2(encode3(final).decode()))
但是发现还是有问题
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xa0 in position 0: invalid start byte
通过搜索,应该是这样解决
flag=encode1(encode2(encode3(final).decode('ISO-8859-1')))
此时再运行代码就可以得到答案了
cyberpeace{interestinghhhhh}