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代码分散隐藏到这些零零碎碎的空间中.

评论

python pyc文件解析_pyc文件相关推荐

  1. python分析pcap文件_利用Python库Scapy解析pcap文件的方法

    每次写博客都是源于纳闷,python解析pcap这么常用的例子网上竟然没有,全是一堆命令行执行的python,能用吗?玩呢? pip安装scapy,然后解析pcap: import scapy fro ...

  2. [299]python实现批量解析PDF文件提取内容并写入到Excel中

    摘要:最近需要将一批PDF文件中的某些数据整理到Excel中,因为文件数量接近20w+,手动更新几乎不现实,于是就提取关键词和内容动手写了个Python小工具,以实现自动完成上述目标. 要求: 读取P ...

  3. python 使用sax 解析xml 文件

    这里不是说xml 的所以如果xml 不了解,可以百度大致看下即可, SAX知识了解 SAX (simple API for XML )  有解析器和事件处理器 解析器负责读取XML文档,并向事件处理器 ...

  4. python使用ElementTree解析XML文件

    一.将XML网页保存到本地 要加载XML文件首先应该将网页上的信息提取出来,保存为本地XML文件.抓取网页信息可以python的urllib模块. 代码如下: from urllib import u ...

  5. python xml etree_python解析xml文件之xml.etree.cElementTree和xml.etree.ElementTree区别和基本使用...

    1.解析速度:ElementTree在 Python 标准库中有两种实现.一种是纯 Python 实现例如 xml.etree.ElementTree ,另外一种是速度快一点的 xml.etree.c ...

  6. python读取xml_python解析xml文件

    加载和读取xml文件 import xml.dom.minidom doc = xml.dom.minidom.parse(xmlfile) 获取xml文档对象(对子节点和节点node都适用) roo ...

  7. grib1文件解析 python_grib文件解析

    一.grib文件简介 WMO是世界气象组织,world meteorology organization. GRIB是WMO开发的一种用于交换和存储规则分布数据的二进制文件格式.最初GRIB表示&qu ...

  8. xpath修复html错误,【python】xpath解析html文件报错:lxml.etree.XPathEvalError: Invalid expression...

    使用xpath解析一个简单的html文件,想获取href属性的值: html = etree.parse('test.html',etree.HTMLParser()) print(html.xpat ...

  9. 【Python实现】解析Drugbank文件中的XML

    目录 1 样例一:xml直接提取 2 样例二:xml转json格式 3 提取drug-target信息 4 参考文献 1 样例一:xml直接提取   在做Drugbank数据处理时,发现的一个能够解决 ...

最新文章

  1. 第一次使用VS Code时你应该知道的一切配置
  2. boost::fusion::pop_back用法的测试程序
  3. tcp文件上传--多个客户端
  4. python开发的一些tips
  5. [html] 使用svg画一个爱心
  6. 遇见好链接(我还并没有看)
  7. Asp.net开发之旅--简单的引用母版页
  8. Linux Man手册的使用示例
  9. Kaggle比赛(二)House Prices: Advanced Regression Techniques
  10. mysql sslcipher_解决mysql数据库创建用户报错Field 'ssl_cipher' doesn't have a default value...
  11. 文本分析用GUI界面显示
  12. 弹幕服务器维护,分布式弹幕服务架构
  13. 那是飞扬的青春—小评《DOOM启示录》
  14. 【100个 Unity小知识点】☀️ | Unity 可以在编辑器中读取Excel,打包成exe后就无法读取的问题
  15. AllenNLP2.2.0:入门篇
  16. php解析shapefile,Fiona简介及Shapefile数据读取
  17. ASPEN.HYSYS.V7.1,Thermoflow软件分享下载
  18. NLPCC2013中文微博细粒度情感识别(二)
  19. RAW和QCOW2 两种存储设备格式区别
  20. 关于RFID电感耦合方式的射频前端工作原理,你了解吗?

热门文章

  1. android 课程表 ui,UICollectionViewLayout实现课程表布局
  2. 最新标准法规-涉及欧盟、沙特、巴西、南非市场
  3. linux串口返回条件,c – Linux – 串口读取返回EAGAIN
  4. 【LSSVM回归预测】基于自适应粒子群优化最小支持向量机优化实现数据回归预测附matlab代码...
  5. 计算几何学 | 圆与直线的交点 | Cross Points of a Circle and a Line | C/C++实现
  6. 领域建模应对软件复杂性初体验
  7. AspectJ中JoinPoint和ProceedingJoinPoint注解的使用
  8. buuctf-misc-小明的保险箱
  9. unc 目录不受支持_DOS批处理不支持将UNC 路径作为当前目录的解决方法
  10. 编程实现企业发放的奖金根据利润提成问题