【平庸附件】python反序列化----本地测试 -----踩坑坑坑坑坑坑注意点! 这个夭折了,可以看看那些nb的

1. 本地测试直接输入 序列化字符串 的时候:

一、直接输入 二进制字符串 ,然后 就直接 pickle.loads()就可以,

在这里插入图片描述

二、输入字符串,然后 str.encode()一下,就变成了二进制字符串了

这也就说明了 encode()如果没有明确方式的化,就默认是 变成二进制的样子
在这里插入图片描述
这是对于encode()的测试,就是默认二进制。

在这里插入图片描述

2. 阅读代码训练&&学习:

这个挺好,先知社区讲的,由书写和阅读opcode码的相对来说比较详细的讲解
这个是P牛讲的,中间靠后那一段

1. \x85 , \x86 , \x87 系列

在这里插入图片描述
我的猜测是正确的,\x85,\x86,\x87不仅仅是压入一个空元组,而是把相应个数的栈顶元素放入这个元组中,然后将这个非空元组压入栈顶。

见下图:
在这里插入图片描述

在这里插入图片描述

3. 输入的时候:check( base64.b64decode ( input() ))

这样输入 序列化之后的 base64加密之后的内容。然后进行判断执行。
那么到底是输入谁的base64加密之后的呢
是这个呢?

第一个:

\x80\x03c__main__\nStudent\n)\x81}(X\x04\x00\x00\x00namecbb\nname\nX\x05\x00\x00\x00gradecbb\ngrade\nub.

还是,这个,表示二进制的呢?

第二个:

b'\x80\x03c__main__\nStudent\n)\x81}(X\x04\x00\x00\x00namecbb\nname\nX\x05\x00\x00\x00gradecbb\ngrade\nub.'

这里给实践一下,解除疑惑。

答案是 第二个,

坑点在哪呢? 就是 你网上用的 base64加密的工具 加密出来的不对,不好使,会报错。
在这里插入图片描述
这是当然的了,,,,
我现在才注意到
是这个:base64.b64encode b64加密,就是二进制加密呢,那么他的意思就是 加密 二进制用的。那么我们输入就只输入二进制序列化里面的那块 字符串就好了 哪个 b''就不用输入了,

通常所有题目都会让你输入一个字符串,但是
在这里插入图片描述
这样输入一个字符串,然偶进行base64.bdecode(data)进行解码,。所以你要输入的这个data首先必须经过 base64.b64encode(data)加密之后,才能够进行decode解密呀,所以你要先进行 加密,但是加密呢,又是 b64encode只接收 二进制加密,所以你加密的字符串要么就是 base64.b64encode(b'*******'),你手动加上一个b。要么就是 base64.b64encode(“*****”.encode())。这个encode()函数,默认是二进制。

演示如下图

这个是直接手动加上了 b
在这里插入图片描述
在这里插入图片描述
总之就是你不encode就不能够进行decode,而且你encode的时候,是整整一个 二进制字符串 要带着 b 这个字符的!!!!

猜你喜欢

转载自blog.csdn.net/Zero_Adam/article/details/114526359