序言;最近在一个比赛中又成功的认识到自己是个菜鸡的不争事实。那里面有几道有关python的逆向题目。然后发掘到了python的庞大雨力量。不过由于这个比赛还没有结束,我们就先大概说说这个知识点。

python中的struct模块

首先大致介绍一下这个模块:当我们在网络中通信的时候大多数的时候数据是以二进制流传递的,又由于我们把数据分为了好多种,譬如:整形、字符等。这个时候我们需要一种机制来把这些系统的整理到一起,方便我们后续的操作。

打包和解包(Packing and Unpacking)

struct.pack(fmt,v1,v2,…)
struct.unpack(fmt,string)

就例如你要打包的数据为:values=(1,‘abc’,2.7)
那么struct.struct(‘I3sf’)
I 表示一个int型数据–>1
3s 表示三个字符–>abc
f 表示一个浮点数–>2.7
但是这里指的注意的是在打包和解包的过程中float类型的数据的精度可能发生变化。

接着看我遇到的这个

struct.unpack(’<I’,另一个参数)

这个==<I==到底是什么意思呢?

原来是由于struct模块也提供了自定义字节顺序的功能,可以指定大端存储、小端存储等特定的字节顺序。这一功能对于底层通信是十分重要的,不同的字节顺序和存储方式也会导致字节大小的不同。例如采用小端存储 s = struct.Struct(’<I3sf’)就可以了。接下来附上一幅图片(这个图片来自网上)

Python常用ctf库_Python常用ctf库


@ 和 = 之间的区别:两者都使用本机字节顺序,但后者的大小和对齐是标准化的。

当网络字节顺序不确定时,可采用 !。

无法指示非本机字节的顺序(强制字节交换);只能使用适当的 < 或 > 选项

填充仅在连续的结构成员之间自动添加。在编码结构的开头或结尾没有添加填充。

使用非原生大小和对齐时,不添加填充,例如,使用 <,>,= 和 !。

要将结构的末尾与特定类型的对齐要求对齐,请使用重复计数为零的该类型的代码结束格式。

这次就先写到这里,还有个Unicorn引擎后面再写吧!

Python常用ctf库_数据_02