CG re中py交易小白详解

232 阅读3分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。

首先,下载题目的文件

发现,是一个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)