第二届“奇安信”杯网络安全技能竞赛Reverse | pyre(需要用到反编译工具 pyinstxtractor.py)

news2024/9/22 15:35:37

赛题描述

这种exe文件怎么调用py的库?

题目附件:(下载可能会有问题,记得直接跳过下载就可以了)

抱歉无法处理您这个问题哦,您可以换个问题

PyInstaller Extractor 解包

  • 适用场景

制作exe后丢失源代码

  • 前提条件

使用pyinstaller 进行打包, 且未进行加密.

  • 安装

下载v2.0版本的PyInstaller Extractor

这是下载pyinstxtractor.py原地址:https://nchc.dl.sourceforge.net/project/pyinstallerextractor/dist/pyinstxtractor.py

计算机反编译是指通过对他人软件的目标程序(比如可执行程序)进行逆向分析和研究,以推导出他人软件所使用的思路、原理、结构、算法、处理过程、运行方法等设计要素,在某些特定情况下可能会推导出源码。

反编译可以作为开发软件时的参考,或者直接用于软件中。

如果找到了一个 Python 3.7 编译的 EXE 文件,则可以使用反编译获取源码,基本过程如下:

  • 将 EXE 文件转换成 PYC 文件;
  • 反编译 PYC 文件。


此过程需要反编译工具 pyinstxtractor.py,可以到 GitHub 官网下载,地址为:GitHub - extremecoders-re/pyinstxtractor: PyInstaller Extractor

图1

                               图1:GitHub官网中的 pyinstxtractor.py

反编译的具体步骤为:

1) 使用 pyinstxtractor.py 将 EXE 文件转换成 PYC 文件,在命令行界面中输入下面的命令:

python pyinstxtractor.py helloworld.exe

然后按下 Enter 键,如图2所示。
 

将 EXE 文件转换成 PYC 文件


图2:将 EXE 文件转换成 PYC 文件


解压成功后,同路径下会出现 helloworld.exe_extracted 文件夹,这里面就包含了 PYC 文件。

2) 使用 uncompyle6 将 PYC 文件反编译为 PY 文件。uncompyle6 需要单独安装,安装命令如下:

pip install uncompyle6

安装后,使用 uncompyle6 进行反编译,在命令行界面中输入下面的命令:
uncompyle6 12.5_01.pyc > main.py
按下 Enter 键,如图3所示。
 

使用 uncompyle6 进行反编译


图3:使用 uncompyle6 进行反编译


成功后,生成 main.py,这样就完成了反编译。

正式解题步骤:

  • 使用
  1. 将需解包的exe与下载的pyinstxtractor.py存入同级文件夹

2. 使用命令行输入如下指令, 得到exe的解包

python pyinstxtractor.py {exe路径}
示例: python pyinstxtractor.py CreatFoder.exe

运行后多出一个目录

3. 在解包的文件夹下, 找到主文件进行反编译得到源码.

4. 关于pyc的反编译, 本文使用uncompyle6库, 大家也可以使用下方的在线反编译。

  • 在线反编译工具

在线pyc,pyo,python,py文件反编译,目前支持python1.5到3.6版本的反编译-在线工具

  • 本地库安装
pip install uncompyle6

  • 使用
  1. 在解包的文件夹下, 找到主文件

    2. 在同级目录下使用命令行输入如下指令

    uncompyle6.exe {pyc文件路径} >{py文件输出路径}
    示例: uncompyle6.exe .\CreatFoder.pyc >ppi.py 

    3. 解压完成, 源码get~

  2. 版本差异
  3. 使用PyInstxtractor 2.0以下版本进行解包, 需对目标文件补充magic head(表示python的版本和编译时间), 才能正确进行反编译.

    使用16进制模式查看主文件与主文件目录下的 struct 文件,需要在主文件头插入16个字节与 struct文件保持一致, 再使用uncompyle6进行反编译.

    (注意, 此说明来自网络, 答主并未按此步骤成功操

让我们思考如何优化这段代码:

  • struct文件第一行复制到1文件第一行1更名为1.pyc后在线工具进行编译在线工具

  • check = "flag{"
    c = [
        144,
            163,
            158,
            177,
            121,
            39,
            58,
            58,
            91,
            111,
            25,
            158,
            72,
            53,
            152,
            78,
            171,
            12,
            53,
            105,
            45,
            12,
            12,
            53,
            12,
            171,
            111,
            91,
            53,
            152,
            105,
            45,
            152,
            144,
            39,
            171,
            45,
            91,
            78,
            45,
            158,
            8
    ]
    tmp = []
    for i in range(len(check)):
        for j in range(1, 1000):
            if ord(check[i]) * 33 % j == c[i]:
                tmp.append(j)
    b = max(tmp, key=tmp.count)
    List = "0123456789abcdeflg{}-"
    for i in range(42):
        for tmp in List:
            if ord(tmp) * 33 % b == c[i]:
                print(tmp, end="")

  • 运行得到flag:flag{2889e7a3-0d6b-4cbb-b6e9-04c0f26c9dca}

  • 代码分析:

    首先,这段代码的主要目的是通过对给定的数字数组c进行某种转换,以找到与check字符串相匹配的字符,并最终输出一个结果字符串。

    让我们逐步分析这段代码:

  • 一个名为check的字符串被初始化为"flag{"
  • 一个名为c的数组被初始化,包含了一系列的数字。
  • 首先,我们可以注意到,在第一个嵌套循环中,对于每个字符,我们都重复进行了相同的计算多次,这是不必要的。我们可以直接计算每个字符的结果,并存储在一个字典中,以便后面直接使用。
  • 其次,由于最终要输出的字符是来自于List中的,我们可以在初始化时就将这个列表转换为一个字典,以ord(char)为键,char为值,这样就可以直接通过计算结果来查找对应的字符
    • 一个名为tmp的空列表被初始化,用于存储临时结果。
    • 第一个嵌套的for循环遍历check字符串的每个字符,并在内部循环中与数字1到1000进行某种运算。这里的主要目的是找到一个数字j,使得ord(check[i]) * 33 % j的结果等于c[i]。如果找到这样的数字,就将其添加到tmp列表中。
    • 找到tmp列表中出现次数最多的数字b
    • 在最后的循环中,通过遍历一个名为List的字符串列表,并再次使用相同的运算逻辑,找到一个字符,其ord(tmp) * 33 % b的结果等于c[i]。如果找到这样的字符,就打印出来。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1316187.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

基于中小微企业_个体工商户的信贷评分卡模型和用户画像(论文_专利_银行建模_企业调研)

背景介绍 信用贷款是指由银行或其他金融机构向中小微企业和个体工商户提供的一种贷款产品。该贷款的特点是无需提供抵押品或担保,主要依据借款人的信用状况来进行评估和审批。 中小微企业和个体工商户信用贷款的申请流程相对简单,申请人只需要提供个人…

Zebec 推出由 Visa、万事达网络支持的即时支付卡

“Zebec 现已推出全新的加密支付卡,该卡由 Visa、万事达网络支持,具备即时、多链、非托管、无需 KYC、免费等特性,其能够通过加密钱包与多条主流公链链接并直接调用支付,这将是加密支付领域的里程碑事件。” 在 2023 年的 12 月 8…

冗余备份组网——HSRP和GLBP协议

目录 HSRP(思科私有协议) HSRP基本概念 HSRP工作过程 HSRP的状态 HSRP的可靠性 HSRP相关配置 GLBP协议 HSRP(思科私有协议) HSRP基本概念 HSRP(Host Standby Router Protocol)为主机备份路由协议 …

B037-Mybatis基础

目录 为什么需要Mybatis?mybatis简介入门案例其余见代码查询流程增删改流程 - 变动数据要加事务去持久化抽取公共类 mapper接口开发规则概述代码 mapper.xml引入本地约束文件别名日志管理作用log4j的使用规范 井大括号与dollar大括号的区别 框架:半成品&…

C# OpenVINO 直接读取百度模型实现图片旋转角度检测

目录 效果 模型信息 代码 下载 C# OpenVINO 直接读取百度模型实现图片旋转角度检测 效果 模型信息 Inputs ------------------------- name:x tensor:F32[?, 3, 224, 224] --------------------------------------------------------------- Ou…

[RTOS移植]--STM32F767移植RTThread

文章目录 通过STM32cube创建一个工程选择要移植的RTOS源下载到本地如果没有重启软件选择对应配置后续补充 通过STM32cube创建一个工程 选择要移植的RTOS源 下载到本地 如果没有重启软件 选择对应配置 Build started: Project: STM32F767 *** Using Compiler V5.06 update 7 (b…

Self-Attention的学习

文章目录 Self-Attention模型的输入与输出1.为什么引入Self-Attention?2.Self-attention(重点)2.1 整体架构2.2 计算单个输出的原理2.3 整体的矩阵计算 3.Multi-head Self-attention4.Self-attention的缺点5.Self-attention与CNN的对比6.Self…

selenium 与 chromedriver安装

本文章向大家介绍selenium 安装与 chromedriver安装,主要包括selenium 安装与 chromedriver安装使用实例、应用技巧、基本知识点总结和需要注意事项供大家参考。 一、安装selenium 1、Selenium简介 Selenium是一个Web的自动化测试工具,最初是为网站自动化测试而开…

msvcr100.dll丢失的多种解决方法,哪个方法更合适你呢

我们打开电脑程序的时候,系统提示电脑丢失msvcr100.dll,无法启动此程序,这该怎么办?msvcr100.dll是电脑一个重要的文件,丢失了就会导致一些应用程序打不开。下面我们就来看看详细的解决步骤。 msvcr110.dll为Visual St…

IS-IS原理与配置

IS-IS原理与配置 • IS-IS(Intermediate System to Intermediate System,中间系统到中间系统)是ISO (International Organization for Standardization,国际标准化组织)为它的CLNP (ConnectionL…

MySQL——库,表基础操作

目录 一.库的操作 1.显示当前的数据库列表 2.创建数据库 3.字符集和校验规则 4.操纵数据库 5.删除数据库 6.数据库备份与还原 7.查看连接情况 二.表的操作 1.创建表 2.查看表结构 3.修改表 4.删除表 一.库的操作 1.显示当前的数据库列表 show databases; 2.创建数…

PyQt6 QSpacerItem弹簧控件

锋哥原创的PyQt6视频教程: 2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili2024版 PyQt6 Python桌面开发 视频教程(无废话版) 玩命更新中~共计46条视频,包括:2024版 PyQt6 Python桌面开发 视频教程(无废话版…

QT案例 使用WMI获取win_32类的属性值,包括Win32提供程序类中的属性

最近涉及到读取WINDOWS 系统电脑设备的各种信息,在一些特殊的PE或者简化系统中是没有WMI查询工具的,所以就自己写了个查询大部分WMI属性值的工具,免去了查网站的功夫。涉及到的方法内容就汇总做个总结。 PS:因为工作中软件基本都是我一个人开…

关于react native项目中使用react-native-wechat-lib@3.0.4

关于react native项目中使用react-native-wechat-lib3.0.4 插件官网安装依赖包(Android和iOS下载插件完成后记得更新依赖,)Android中配置1.在项目文件夹下面创建文件夹wxapi(如上图)2.在文件MainApplication.java中如下…

软件设计师——法律法规(三)

📑前言 本文主要是【法律法规】——软件设计师——法律法规的文章,如果有什么需要改进的地方还请大佬指出⛺️ 🎬作者简介:大家好,我是听风与他🥇 ☁️博客首页:CSDN主页听风与他 &#x1f304…

JAVA代码审计之深入XXE漏洞挖掘与防御

文章目录 前言WebGoat1.1 Docker环境搭建1.2 Leve1-XXE回显1.3 代码审计与溯源1.4 Jaxb的反序列化1.5 Level2-格式校验1.6 Level3-XXE盲注 挖掘与防御2.1 XMLReader2.2 SAXBuilder2.3 SAXReader2.4 SAXParserFactory2.5 Digester2.6 DocumentBuilderFactory2.7 XXE挖掘技巧小结…

strlen的三种模拟实现方法

首先&#xff0c;我们要了解strlen函数的参数以及返回值&#xff0c;还有使用方法。 1. 计数器方法 #include <stdio.h>size_t my_strlen(const char* str) {int count 0;while (*str) {count;}return count; } int main() {char arr[] "abcdef";int len …

Angular+Nginx区域HIS医院信息管理系统源码

医院管理信息系统&#xff08;HIS&#xff09;是医院基本、重要的管理系统&#xff0c;是医院大数据的基础。“云”指系统采用云计算的技术和建设模式&#xff0c;具有可扩展、易共享、区域化、易协同、低成本、易维护、体验好的优势。“H”是医疗卫生&#xff0c;由原来医院 (…

Flask学习四:补充

插件 flask-caching 简介 Flask-Caching 是一个 Flask 扩展&#xff0c;旨在为 Flask 应用程序添加缓存功能。缓存是一种提高应用性能的技术&#xff0c;通过将常用数据暂时存储在一个快速访问的位置&#xff08;如内存或磁盘&#xff09;&#xff0c;从而减少对较慢资源&…

ssm基于MVC的舞蹈网站的设计与实现论文

摘 要 随着科学技术的飞速发展&#xff0c;社会的方方面面、各行各业都在努力与现代的先进技术接轨&#xff0c;通过科技手段来提高自身的优势&#xff0c;舞蹈网站当然也不能排除在外。舞蹈网站是以实际运用为开发背景&#xff0c;运用软件工程开发方法&#xff0c;采用Java技…