2021年四川省ctf比赛 python反编译WP

1.python文件反编译

当一开始拿到题的时候,毫无头绪。这时想要看一下文件的源码,用记事本打开发现是乱码,回看文件类型发现是pyc文件。pyc文件是py文件变成exe文件的中间文件,可以理解为高级语言写的程序要先被编译为汇编语言后变为二进制程序。
那么我们有什么办法将pyc文件变成py文件呢?
这里要说的就是uncompyle工具,功能就是将pyc文件反编译成py文件,具体操作方法是将cmd命令行的指向指向pyc文件所在目录之后,输入如下指令

uncompyle6 -o *.py *.pyc

成功之后会是下图效果,要注意的是要在环境变量中配置的路径是python2的python3会反编译不成功
在这里插入图片描述

2.python代码审计

当你得到反编译之后的py文件,就可以用编译器或者记事本查看,得到如下源码

# uncompyle6 version 3.7.4
# Python bytecode 2.7 (62211)
# Decompiled from: Python 2.7.16 (v2.7.16:413a49145e, Mar  4 2019, 01:37:19) [MSC v.1500 64 bit (AMD64)]
# Embedded file name: 2.py
# Compiled at: 2020-10-14 11:00:14
import base64

def encode(yourflag):
    s = ''
    for i in yourflag:
        x = ord(i) ^ 62
        x = x + 6
        s += chr(x)

    return base64.b64encode(s)


tureflag = 'XlhlX0sMEWNiDxQQDgwTXl5eZRFgFWMOFBATXhMMYw8PD2UMZUk='
flag = ''
print 'input your flag:'
yourflag = raw_input()
if encode(yourflag) == tureflag:
    print 'OHHHHHH~ correct!'
else:
    print 'emmm.. wrong'

对源码进行审计,发现源码将真正的flag做了如下处理

Created with Raphaël 2.2.0 加密前的flag 将flag根据ascii编码取整型之后按位异或为一个新数 将上一步处理后的数值加六 处理后的新数根据ascii变成字符 对数值进行base64编码 加密后的flag

3.还原flag

还原flag,我们可以用以下思路

Created with Raphaël 2.2.0 加密后的flag 我对加密后的flag进行base64解码 按照ascii码取得数值之后减六 将上一步处理之后的数据按位异或62之后就能得到之前的数值 按照ascii将整型换成字符型输出 加密前的flag

按照如上的思路写脚本,得到如下

import base64

def encode(str):
    s = ''
    for i in str:
        x = ord(i) - 6
        x = x ^ 62
        s += chr(x)

    return s

Base64_Encode_Flag = 'XlhlX0sMEWNiDxQQDgwTXl5eZRFgFWMOFBATXhMMYw8PD2UMZUk='

Base64_Decode_Flag = base64.b64decode(Base64_Encode_Flag)

Flag=encode(Base64_Decode_Flag)

print Flag

运行之后如下图
在这里插入图片描述
得到flag

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

SuperForming

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值