python反序列化学习记录 (2)

再执行Rp3,先将之前压入栈中的元组和可调用对象全部弹出然后执行,这里也即执行nt.system("whoami"),接着将结果压入栈。最后p3将栈顶数据(也即执行结果)写入列表,索引为3:

file

总的过程如下:

file

由于memo列表只是起到一个存储数据的作用,如果目的只是想要执行nt.system("whoami"),可以将原序列化数据中有关写入列表的操作给去除。也即原b'cnt\nsystem\np0\n(Vwhoami\np1\ntp2\nRp3\n.'可简化为b'cnt\nsystem\n(Vwhoami\ntR.',仍然是可以达到执行目的的:

python反序列化学习记录

pickletools模块

官方说明:

此模块包含与 pickle 模块内部细节有关的多个常量,一些关于具体实现的详细注释,以及一些能够分析封存数据的有用函数。 此模块的内容对需要操作 pickle 的 Python 核心开发者来说很有用处;pickle 的一般用户则可能会感觉 pickletools 模块与他们无关。

相关接口:

pickletools.dis(picklestring):

可以更方便的看到每一步的操作原理。如上面的例子执行该方法:

python反序列化学习记录

pickletools.optimize(picklestring):
消除未使用的 PUT 操作码之后返回一个新的等效 pickle 字符串。 优化后的 pickle 将更为简短,耗费更为的传输时间,要求更少的存储空间并能更高效地解封。也即上面分析能够经过简化的过程:

python反序列化学习记录

测试代码:

#python3.7 import pickle import pickle import pickletools class person(): def __init__(self, name, age): self.name = name self.age = age me = person('LH', 20) str = pickle.dumps(me) print(str) pickletools.dis(str)

运行结果:

b'\x80\x03c__main__\nperson\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x02\x00\x00\x00LHq\x04X\x03\x00\x00\x00ageq\x05K\x14ub.' 0: \x80 PROTO 3 2: c GLOBAL '__main__ person' 19: q BINPUT 0 21: ) EMPTY_TUPLE 22: \x81 NEWOBJ 23: q BINPUT 1 25: } EMPTY_DICT 26: q BINPUT 2 28: ( MARK 29: X BINUNICODE 'name' 38: q BINPUT 3 40: X BINUNICODE 'LH' 47: q BINPUT 4 49: X BINUNICODE 'age' 57: q BINPUT 5 59: K BININT1 20 61: u SETITEMS (MARK at 28) 62: b BUILD 63: . STOP highest protocol among opcodes = 2

对str使用pickle.optimize进行简化:

>>>str=b'\x80\x03c__main__\nperson\nq\x00)\x81q\x01}q\x02(X\x04\x00\x00\x00nameq\x03X\x02\x00\x00\x00LHq\x04X\x03\x00\x00\x00ageq\x05K\x14ub.' >>>pickletools.optimize(str) >>>b'\x80\x03c__main__\nperson\n)\x81}(X\x04\x00\x00\x00nameX\x02\x00\x00\x00LHX\x03\x00\x00\x00ageK\x14ub.' 应用

修改刚才源码:

#python3.7 import base64 import pickle import otherpeople class person(): def __init__(self, name, age): self.name = name self.age = age me=pickle.loads(base64.b64decode(input())) if otherpeople.name==me.name and otherpeople.age==me.age: print("flag") else: print("hack")

同目录下新建otherpeople文件夹,写入__init.py__用于新建一个模板:

name = 'Dr.liu' age = 21

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpxszj.html