Python pickle 中的 POP 指令码

Python Pickle反序列化进阶:Opcode过滤绕过与手工构造实战 序列化与反序列化是数据持久化和网络传输的核心技术,Python的pickle模块通过基于栈的虚拟机(PVM)执行操作码(opcode)来实现这一过程。其技术价值在于高效处理复杂对象,但反序列化过程本质上是执行一段程序,若数据可控则可能引发任意代码执行风险,常见于Web应用和CTF赛题。应用场景包括分布式计算和数据缓存,但安全漏洞常出现在处理不可信数据时。本文聚焦于**opcode过滤绕过**和**手工构造**,深入探讨当标准利用方法(如`__reduce__`)被禁用时,如何通过理解PVM原理、分析`BUI 阅读详情

事情起源于笔者 2019 年的一篇文章:

从零开始python反序列化攻击:pickle原理解析 & 不用reduce的RCE姿势

前言 不经意间就起了这么长一个题目。昨晚用了4h左右的时间看皮ckle源码(主要是_Unpickler部分),发掘出了几种新的漏洞利用方式,目前网上暂未见资料,因此我们决定写一篇文章分享一下。本文详细介绍了pyckle.l...

正在上传…重新上传取消​知乎专栏阮行止上海洛谷网络科技有限公司 讲师

文中提到,注入恶意对象引发 RCE 之后,常常由于返回的反序列化对象不符合业务代码的预期,造成程序 crash。解决方案是使用 POP 指令码(字节码是数字 )把恶意对象弹出,再压一个正常的对象进去,这样 返回的就是普通的对象,以达成无副作用 RCE 的目的。如下图所示:0pickle.dumps

▲ 先构造恶意对象,再弹出,最后压入正常对象。绿色框内为恶意对象

然后今天收到私信,问 POP 这个指令码有什么用。

这个问题笔者当年确实没有想过。今天翻了一下源码,发现 POP 指令主要是为了防止无限递归构造对象的。下面我们根据 源码进行说明。pickler

0x00 Unpickler 对 POP 的处理方式

首先,我们知道 Unpickler 是一个图灵完备的虚拟机。它的指令编码方式如下:先是一个字节的 op code,然后紧跟操作数。至于操作数的表示方式,也是首先用一个字节表示类型,然后紧跟着操作数。这个虚拟机的语言大体上是一个 LL(1) 型文法,所以 Unpickler 仅通过简单地重复执行「读入一个字节的操作数 - 调用对应 handler」,就可以完成反序列化工作。

Unpickler 每次读入操作数,就查表找到 handl

Python对象持久化实战:Pickle序列化原理与安全使用指南 序列化是将内存对象转换为可存储或传输格式的基础技术,其核心在于保留对象状态(数据+类型+关系)并支持反向重建。Pickle作为Python原生序列化工具,基于协议版本实现高效字节流编解码,兼顾速度与兼容性,但存在跨版本加载失败、不可信源执行风险等典型问题。相比JSON的轻量安全和joblib对NumPy的深度优化,Pickle的价值聚焦于同一Python环境内复杂对象(如自定义类、模型实例)的低开销快照保存。本文结合协议选择、循环引用处理、安全反序列化及生产级路径管理等实践要点,系统解析如何在NLP预处理、 阅读详情

相关推荐

python基础:字典,函数和pickle模块

为什么需要python字典? 字典与列表和元组最大的区别是,它可以用数字之外的数据结构来做索引。这有什么好处呢?举个例子,你需要在一个大型数据库中查找人名及对应的信息,一般你需要取遍历这个数据库来搜索这个人名。但是如果这个数据库是用字典表示的,那么你只需要把人名当作索引,直接找到它对应的信息。也就是说,字典自动实现了一个hash算法,能大大提高增,删,改,查等操作的效率。 先回顾一下,给列表赋初值使用中括号[ ],给元组赋初值使用小括号( ),那给字典赋值使用什么呢?嗯,大括号{ }。 dict={

277

Effective Python 读书笔记: 第44条: 用copyreg实现可靠的pickle操作

# -*- encoding: utf-8 -*- import copy_reg import pickle ''' 第44条: 用copyreg实现可靠的pickle操作 关键: 1 pickle模块 作用: 能够将Python对象序列转化为字节流,并反序列化为Python对象 开发者可以在自己控制的各个程序之间传递python对象 定义: pickle.dump(obj, f...

qingyuanluofeng的专栏 577

别再只看K线了!用Python自制筹码分布图,可视化Winner函数帮你判断支撑压力

本文详细介绍了如何用Python自制筹码分布图,通过数据清洗、算法实现和动态可视化,帮助投资者更准确地判断股票支撑压力位。文章重点讲解了Winner函数的应用,结合筹码分布与交易策略,提升交易决策的精准度。

weixin_42520796的博客 312

从零抓包分析AVDTP:用Wireshark解密蓝牙音频传输全流程

本文详细介绍了如何使用Wireshark抓包工具分析AVDTP协议,解密蓝牙音频传输的全流程。从实验环境搭建到信令交互解析,再到媒体流传输深度分析,逐步揭示蓝牙音频传输的技术本质,帮助开发者深入理解AVDTP协议的工作机制。

sun99的博客 202

3U 与 SV630A 伺服实现 CANLINK 通讯

SD410这组参数特别重要,这个32位特别重要,是防止数值乱码的关键。

weixin_42714122的博客 2694

Unity+ARFoundation 探坑之路

前两天想要上手Unity来AR方面的项目东东 ,探索过程中出现了各种各样的问题,现在将这个过程中遇到的各种各样问题梳理一下,希望后来者能开开心心上手Unity+AR。 注意:这是一篇踩坑博客,具体搭建还请自行百度。 一、ARFoundation or ARCore or ARKit Unity作为一个平台,不直接提供XR(包括VR、AR和MR)的开发包,这时就需要其他公司提供各种各样的SDK工具包...

qq_43575926的博客 7134

当传统CFD遇上AI:PINN如何帮我们省下90%的仿真计算时间?

本文探讨了物理信息神经网络(PINN)在计算流体力学(CFD)中的应用,如何通过无网格方法节省90%的仿真计算时间。PINN将物理定律编码到神经网络中,显著减少传统CFD中的网格生成和计算时间,同时保持高精度。文章还对比了PINN与传统方法的性能,并讨论了其独特优势和当前局限。

weixin_32678995的博客 319

IPOP 使用详解 (附IPOP工具包)

IP 地址动态绑定功能;路由信息查询和配置功能;MAC 地址信息查询和修改功能;MAC 、主机信息扫描功能;本机网络报文统计功能;本机端口列表、远程端口扫描功能;端口映射功能;网卡流量统计功能;本机 IP 报文捕获和发送功能;终端控制功能(支持 telnet 、 dos、 ssh、 sftp 、ftp、com 等协议);TCL 脚本支持;多种服务功能( tcp/udp/ping/telnet/ftp/tftp/web/team/syslog/smtp );

悦分享 1万+

AI自瞄原理剖析(四)从Yolo推理坐标到屏幕坐标:基于FOV视角与焦距的坐标变换与精准瞄准

从Yolo推理框架得到的坐标到屏幕坐标的转换是一个涉及到FOV视角、焦距以及分辨率的复杂过程。通过数学公式,我们可以将推理框坐标反推为游戏内的实际坐标,并最终映射到屏幕坐标系中。利用这些信息,AI自瞄系统能够精确计算出准星从当前位置移动到敌人位置的距离,实现精准的自动瞄准。通过这种方法,AI自瞄系统能够在不同的游戏环境下灵活应对,提供高度精确的操作体验。在AI自瞄系统中,目标检测仅仅是第一步,获取到预测框的坐标后,我们还需要将这些坐标转换为实际屏幕上的精确位置。

代码简单说 Vue、JAVA、PHP、Node.js 熟练运用,接口、架构、性能全搞定。 1332

《UDS协议从入门到精通》系列——到底什么是DTC?

到底什么是DTC?看这里,深度图解DTC格式,详述DTC状态位、快照信息和扩展信息!!

车载系统攻城狮 1万+

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

上一篇: 最强最炫的Python数据可视化神器,没有之一
下一篇: Selenium2+python自动化65-js定位几种方法总结
Python_xiaowu
博客等级 码龄5年 3096粉丝 178原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值