python pyc文件解析_pyc文件

python pyc文件解析_pyc文件codeobject¶在我们导入python脚本时在目录下会生成个一个相应的pyc文件,是pythoncodeobj的持久化储存形式,加速下一次的装载。文件结构¶pyc文件由三大部分组成最开始4个字节是一个Maigcint,标识此pyc的版本信息接下来四个字节还是个int,是pyc产生的时间序列化的PyCodeObject,结构参照include/code.h,序列化方法pyth…

大家好,又见面了,我是你们的朋友全栈君。

code object¶

在我们导入 python 脚本时在目录下会生成个一个相应的 pyc 文件,是pythoncodeobj的持久化储存形式,加速下一次的装载。

文件结构¶

pyc文件由三大部分组成

最开始4个字节是一个Maigc int, 标识此pyc的版本信息

接下来四个字节还是个int,是pyc产生的时间

序列化的 PyCodeObject,结构参照include/code.h,序列化方法python/marshal

pyc完整的文件解析可以参照

关于co_code

python3.6 以上参数永远占1字节,如果指令不带参数的话则以0x00代替,在运行过程中被解释器忽略,也是Stegosaurus技术原理;而低于python3.5的版本中指令不带参数的话却没有0x00填充

例题¶

首先尝试pycdc反编译失败

# Source Generated with Decompyle++

# File: imgenc.pyc (Python 2.7)

import sys

import numpy as np

from scipy.misc import imread, imsave

def doit(input_file, output_file, f):

Unsupported opcode: STOP_CODE

img = imread(input_file, flatten = True)

img /= 255

size = img.shape[0]

# WARNING: Decompyle incomplete

注意到是python2.7,也就是说指令序列共占1字节或3字节(有参数无参数)

使用pcads得到

imgenc.pyc (Python 2.7)

67 STOP_CODE

68 STOP_CODE

69 BINARY_DIVIDE

70 JUMP_IF_TRUE_OR_POP 5

73 LOAD_CONST 3: 0

76 LOAD_CONST 3: 0

79 BINARY_DIVIDE

定位到出错的地方,观察发现 LOAD_CONST LOAD_CONST BINARY_DIVIDE STORE_FAST opcodes (64 03 00 64 03 00 15 7d 05 00)被破坏了,根据上下文线索修复后

00000120 64 04 00 6b 00 00 72 ce 00 64 03 00 64 03 00 15 |d..k..r..d..d…|

00000130 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d…}..d..|

00000140 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d…}..d..d…}.|

00000150 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d…}..d..d.|

00000160 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 |..}..d..d…}..d|

00000170 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 |..d…}..d..d…|

00000180 7d 05 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 |}..d..d…}..d..|

00000190 64 03 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 |d…}..d..d…}.|

000001a0 00 64 03 00 64 03 00 15 7d 05 00 64 03 00 64 03 |.d..d…}..d..d.|

000001b0 00 15 7d 05 00 64 03 00 64 03 00 15 7d 05 00 6e |..}..d..d…}..n|

接下来根据修复好的python源代码得到flag即可

延伸:

Tools¶

将python字节码转换为可读的python 源代码,包含了反汇编(pycads)和反编译(pycdc)两种工具

允许我们在Python字节码文件(pyc或pyo)中嵌入任意Payload。由于编码密度较低,因此我们嵌入Payload的过程既不会改变源代码的运行行为,也不会改变源文件的文件大小

原理是在python的字节码文件中,利用冗余空间,将完整的payload代码分散隐藏到这些零零碎碎的空间中.

评论

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/147972.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • 学员管理系统(完整版附带源码)

    学员管理系统(完整版附带源码)学员管理系统是刚接触python时算是一个比较难的小项目,毕竟第一次接触这样的思维逻辑,不过用心学起来还是很有趣的,发现乐在其中,也就不觉得难了。下面给大家分享一下学员管理系统较为完整的代码1.主程序importsys,datetimestulist=[]stuNumlist=[]userdata={}whileTrue:userInput=showmenu()ifuserInput==”1″:addStu().

  • Vue生成二维码_vue视频软件怎么生成二维码

    Vue生成二维码_vue视频软件怎么生成二维码1.在vue中安装qrcodejs2npminstall–saveqrcodejs22.在项目中引用qrcodejs2importQRcodefrom’qrcodejs2’3.使用到项目中<viewid=”qrCode”res=”qrCodeDiv”></view>methods:{bindQRcode(){ newQRcode(this.$refs.qrCodeDiv,{ text:”https://www..

  • jvm类的加载机制_java类加载流程及原理

    jvm类的加载机制_java类加载流程及原理1.类加载器的组织结构转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52301541类加载器ClassLoader是具有层次结构的,也就是父子关系。其中,Bootstrap是所有类加载器的父亲。(1)Bootstrapclassloader:启动类加载器当运行Java虚拟机时,这个类加载器被创建,…

  • MySQL中MyISAM与InnoDB区别及选择

    MySQL中MyISAM与InnoDB区别及选择

    2021年10月30日
  • python注入_Python——dll注入

    python注入_Python——dll注入dll攻击原理分析什么是dll动态链接库,是在微软Windows操作系统中实现共享函数库概念的一种方式。这些库函数的扩展名是”.dll”、”.ocx”(包含ActiveX控制的库)或者”.drv”(旧式的系统驱动程序)。为何有dll由于进程的地址空间是独立的(保护模式),当多个进程共享相同的库时,每个库都在硬盘和进程彼此的内存存放一份的话,对于早期的计算机来说,无疑是一种极大的浪费,于是win…

  • 微信推送消息遇到的坑 – 返回error code 40008,并且发送不成功[通俗易懂]

    微信推送消息遇到的坑 – 返回error code 40008,并且发送不成功[通俗易懂]api文档就是这里啦。https://work.weixin.qq.com/api/doc#90000/90135/90236/%E6%96%87%E6%9C%AC%E6%B6%88%E6%81%AF我感觉腾讯并没有把这个errorcode做得很细,反之,非常笼统,让你看到这个err不知所措不晓得到底啥问题。我这边要用微信接收系统发出来的alert,比如哪个服务器cpu负荷…

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号