本文已参与「新人创作礼」活动,一起开启掘金创作之路。
首先,下载题目的文件
发现,是一个Py.pyc文件,然后看这个的话应该是和Python有关的;下载之后,对这个一点也不知道,所以我就直接双击运行,发现一闪而过,那就要想其他方法了,用了ida,od(有点傻),都不行 所以就在网上查了一下,pyc文件,网上的定义是这样的: 简单来说,pyc文件就是Python的字节码文件,我们都知道Python是一种全平台的解释性语言,全平台其实就是Python文件在经过解释器解释之后(或者称为编译)生成的pyc文件可以在多个平台下运行,这样同样也可以隐藏源代码。其实,Python是完全面向对象的语言,Python文件在经过解释器解释后生成字节码对象PyCodeObject,pyc文件可以理解为是PyCodeObject对象的持久化保存方式。pyc文件只有在文件被当成模块导入时才会生成。也就是说,Python解释器认为,只有import进行的模块才需要被重用。 生成pyc文件的好处显而易见,当我们多次运行程序时,不需要重新对该模块进行重新的解释。主文件一般只需要加载一次不会被其他模块导入,所以一般主文件不会生成pyc文件。
emmm,相当于一个函数(俺也不知道,但这不重要了)
然后在网上找了一下pyc逆向,发现了py在线逆向工具
然后逆向之后的代码是这样的
#!/usr/bin/env python
# encoding: utf-8
# 如果觉得不错,可以推荐给你的朋友!http://tool.lu/pyc
import base64
def encode(message):
s = ''
for i in message:
x = ord(i) ^ 32
x = x + 16
s += chr(x)
return base64.b64encode(s)
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct:
print 'correct'
else:
print 'wrong'
下面是我分析的代码,带有注释: 带注释的py文件链接:pan.baidu.com/s/18NvSu5DV… 提取码:6bea
import base64 # 一个base64库
def encode(message): #自定义了一个函数
s = '' #字符串
for i in message: #遍历链表
x = ord(i) ^ 32 #ord函数是chr的配对函数,返回A单个字符SCII码 然后异或32
x = x + 16 #然后加上16
s += chr(x) #合并到s上
return base64.b64encode(s) #返回加密后的编码
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt' #正确的编码
flag = ''
print 'Input flag:'
flag = raw_input()
if encode(flag) == correct: #判断
print 'correct'
else:
print 'wrong'
那么分析过代码之后,发现有一个base64不懂,百度一下之后,发现这就是个很简单的加密,解密的话就可以直接调用就行,所以这个就先不管,然后这个代码的话是先捕获输入,之后判断是否等于correct,那么我们就要反向来说,所以从正确的编码出发,先base64.b64decode(correct),然后按照反顺序去-16,再次异或32(因为两次异或同一个数,相当于不异或),那么就可以用Python再次编写一个文件,得到flag;nctf{d3c0mpil1n9_PyC} 文件如下: 链接:pan.baidu.com/s/1gPindNrZ… 提取码:rypc
import base64
correct = 'XlNkVmtUI1MgXWBZXCFeKY+AaXNt'
flag=''
s=base64.b64decode(correct)
for i in s:
i-=16
i=i^32
flag+=chr(i)
print(flag)