目录:
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 这个字符的!!!!