exe文件转py文件 exe -> pyc -> py 详细步骤(例题)

题目连接 链接:https://pan.baidu.com/s/1s9J89ppouArOR8XdCoG_ug
提取码:7szc

准备

在这里插入图片描述
还是基本操作先查一下基本面
64位 无壳

静态分析(py文件特征)

首先看到反编译之后的主函数
在这里插入图片描述

拖入ida后查看字符串但是发现有好多python函数
在这里插入图片描述
通过主函数和字符串
那么我们就可以推测出这是用python编写的文件
那么需要将exe文件还原为py文件
看到这里让我想到之前做过一道 ‘新年快乐’ 的例题看起来两道题目的思路应该是相同的
所以多做例题还是很有好处的

当然其实图标也是很重要的如果图标如下图所示的话
在这里插入图片描述
那就很明显为py文件了

解包exe文件(exe > pyc)

下载python解包exe项目

链接: https://github.com/pyinstxtractor/pyinstxtractor-ng

主要使用其中的pyinstxtractor-ng.py文件

解包exe

pyinstxtractor-ng.py文件移动到想要解包的文件目录下 并在当前目录下输入cmd打开终端
在这里插入图片描述
在终端输入以下命令进行解包

python pyinstxtractor-ng.py white_give.exe

在这里插入图片描述解包后会发现在当前目录下生成了名为white_give.exe_extracted文件夹 即解包完成
进入该文件夹会发现和解包文件相同名称的pyc文件 white_give.pyc
接下来就是要将pyc文件转为可以正常阅读的py文件

pyc文件 > py文件

安装uncompyle6

在终端输入

pip install uncompyle6

如果新版本出现问题可以更换老版本试试

pip install uncompyle6==3.7.4

pyc > py

进入刚才解包完成的目录

并在此目录下运行cmd输入

uncompyle6 white_give.pyc

运行成功后可以看到源代码
在这里插入图片描述
只能在终端看到源代码的话还是不太方面
让我们继续将文件转为py文件

当前目录再次运行cmd输入

uncompyle6 white_give.pyc > white_give.py

在这里插入图片描述
运行成功后即可看到生成了white_give.py
在这里插入图片描述
打开white_give.py后即可看到源代码

算法逆向

接下来只要对代码进行分析即可分析出flag

# uncompyle6 version 3.7.4
# Python bytecode 3.8 (3413)
# Decompiled from: Python 3.8.5 (tags/v3.8.5:580fbb0, Jul 20 2020, 15:57:54) [MSC v.1924 64 bit (AMD64)]
# Embedded file name: white_give.py
# Compiled at: 1995-09-28 00:18:56
# Size of source mod 2**32: 272 bytes
import base64

def main():
    flag = input('请输入flag:')
    out = checkflag(flag)
    print(out)


def checkflag(flag):
    if len(flag) != 22:   //flag长度为23
        return 'error!!!'
    else:
        if flag[0:5] != 'flag{': //flag前五位为 flag{
            if flag[(-1)] != '}': //flag最后一位为 }
                return 'error!!!'
        if 'welcome' != flag[5:12]: //flag6到11位为welcome
            return 'error!!!'     //flag{welcome_****_***}
        if ord(flag[12]) != ord(flag[17]) != 95: //ord()函数=char()函数
            return 'error!!!'           //ASCⅡ95表示的字符为'_'
    temp = flag[13:17] + flag[18:21]    //13 18位为'_'
    temp = temp.encode(encoding='utf-8')   //temp为flag的14位到18位 
    print('base64:', base64.b64encode(temp)) // 19位到22位 且为
    if base64.b64encode(temp) != b'UUxOVUNURg==': //'UUxOVUNURg=='的
        return 'error!!!'                         //base64解密
    return 'good!!!you got it!!!!'    //'UUxOVUNURg=='的解密为QLNUCTF
        // flag{welcome_QLNU_CTF}

main()

flag{welcome_QLNU_CTF}

  • 11
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 8
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值