Pickle 反序列化学习
Drunkbaby Lv6

好久没有更新博客学新东西了,最近一直沉迷于挖 SRC。前段时间强网杯出了一道 pickle 反序列化的题目,估计。。。pyjail 没什么可玩的了,开始折腾 pickle 了,行吧那就学一学。

前置知识

pickle 是 Python 中一个能够序列化和反序列化对象的模块。和其他语言类似,Python 也提供了序列化和反序列化这一功能,其中一个实现模块就是 pickle。在 Python 中,“Pickling” 是将 Python 对象及其所拥有的层次结构转化为一个二进制字节流的过程,也就是我们常说的序列化,而 “unpickling” 是相反的操作,会将字节流转化回一个对象层次结构。

pickle实际上可以看作一种独立的语言,通过对 opcode 的编写可以进行 Python 代码执行、覆盖变量等操作。直接编写的 opcode 灵活性比使用 pickle 序列化生成的代码更高,并且有的代码不能通过 pickle 序列化得到(pickle 解析能力大于 pickle 生成能力)。

既然 opcode 能够执行 Python 代码,那自然就免不了安全问题。

Pickle 模块使用实例

下面我们来看一个简单的例子

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
import pickle


class Person():
def __init__(self):
self.age = 18
self.name = "Pickle"


p = Person()
opcode = pickle.dumps(p)
print(opcode)
# 结果如下
# b'\x80\x04\x957\x00\x00\x00\x00\x00\x00\x00\x8c\x08__main__\x94\x8c\x06Person\x94\x93\x94)\x81\x94}\x94(\x8c\x03age\x94K\x12\x8c\x04name\x94\x8c\x06Pickle\x94ub.'


P = pickle.loads(opcode)
print('The age is:' + str(P.age), 'The name is:' + P.name)
# 结果如下
# The age is:18 The name is:Pickle
 评论