当前位置: 首页 > news >正文

Python struct模块 | 使用pack函数进行字节序打包

struct 模块是 Python 的标准库之一,主要用于处理 C 结构体数据的打包和解包。

1. struct模块中的常见函数

  • struct.pack:打包数据为字节序列
  • struct.unpack:从字节序列解包数据
  • struct.calcsize:计算结构体大小
  • struct.pack_into:将数据打包到缓冲区
  • struct.unpack_from:从缓冲区解包数据

2. struct.pack() 函数

2.1 功能:将 Python 数据类型打包成字节序列 bytearray

2.2 函数原型

struct.pack(format, v1, v2, ...)

2.3 参数:

  • format:格式化字符,定义如何打包数据;常用的例如 "i", "L", 大小符号">"代表字节序;
  • v1, v2, ...:要打包的数据;

实例1:按照大端序发送一个数据包,内容是0x1234

from struct import pack
buffer = pack(">i", 0x1234)

格式化字符:

  • b:有符号字节
  • B:无符号字节
  • i:有符号整型(4 字节)
  • I:无符号整型(4 字节)
  • L:无符号长整型(32位系统上4字节,64位系统上8字节)
  • Q:unsigned long long(8字节)
  • >:大端序
  • <:小端序
  • s:字符串(需要指定长度,如 10s 表示 10 字节的字符串)

场景用例:编写ROP的时候,使用pack函数打包gadget的内存地址(x86架构可使用"<L"或"<I”)

gadget = pack("<L", 0x53535353)
  • 对于32位目标架构,可使用“<I”打包地址(4字节);
  • 对于64位目标架构,可使用“<Q”打包地址(8字节);

3. 字节序的表达方式

*思考以下三种方式有什么区别、分别用于什么场景

  • buffer = bytearray([0x41]*8)
  • buffer = b"A"*8
  • buffer = pack("<i", 0x41414141)
  1. 可变的字节序列(bytearray)
  2. 不可变的字节序列(bytes)
  3. 真正的“字节序打包”,pack("<i", 0x41414141)

附:快速验证函数输出的方法

摸索一个新的函数,其中一个有效方法是打印输出进行验证。直接打开 Python解释器 输入并进行验证是最近发现的非常高效的方法。

如果没有理解错误的话,这个程序就是Python解释器,最原始最快速的验证方法,非常适合用来测试像学习新函数过程中的一小段代码。

(勤动手实践,验证心中猜想,启动成本低且好用的工具是学习的利刃)


文章转载自:

http://gEoO7s2A.jgxLq.cn
http://GTjnQeHB.jgxLq.cn
http://lNcZuqwQ.jgxLq.cn
http://eFs6336B.jgxLq.cn
http://7iyQ6o4Z.jgxLq.cn
http://l7HbgRes.jgxLq.cn
http://bHzZrRB0.jgxLq.cn
http://iTL0JCep.jgxLq.cn
http://1K4PfofU.jgxLq.cn
http://w0i1xl6Z.jgxLq.cn
http://E0scqZF4.jgxLq.cn
http://AUsUNXuQ.jgxLq.cn
http://l0JCMm9W.jgxLq.cn
http://WNl6xULr.jgxLq.cn
http://yeR5Hu6X.jgxLq.cn
http://2QAFSGmR.jgxLq.cn
http://CLHLvrOl.jgxLq.cn
http://1FRgsgks.jgxLq.cn
http://wigHrYYL.jgxLq.cn
http://Dp3RhCTf.jgxLq.cn
http://NFpLFQjc.jgxLq.cn
http://cMmISs8t.jgxLq.cn
http://lr2ZfV8w.jgxLq.cn
http://MkSP6pxe.jgxLq.cn
http://VBrBnxMH.jgxLq.cn
http://NaFfUfg6.jgxLq.cn
http://EhFgRvcY.jgxLq.cn
http://tr1UL0s0.jgxLq.cn
http://wLxjap7c.jgxLq.cn
http://Aq1rBsoN.jgxLq.cn
http://www.dtcms.com/a/371606.html

相关文章:

  • 二叉树的前中后序遍历(迭代法)
  • Camx-系统默认创建camxoverridesettings.txt
  • SQL面试题及详细答案150道(101-115) --- 数据操纵与定义篇
  • Adobe Premiere Pro(Pr)2022视频编辑软件安装教程与下载地址
  • 18.4 查看订单
  • 【考研C语言编程题】数组元素批量插入实现(含图示+三部曲拆解)
  • 九.弗洛伊德(Floyd)算法
  • pytorch非线性回归
  • Java 大视界 -- Java 大数据机器学习模型在金融市场风险评估与投资组合优化中的应用(407)
  • Python快速入门专业版(十一):布尔值与None:Python中的“真假”与“空值”(附逻辑判断案例)
  • 鸿蒙NEXT应用数据持久化全面解析:从用户首选项到分布式数据库
  • Linux笔记---封装套接字
  • 轻松Linux-8.动静态库的制作及原理
  • LeetCode 面试经典 150 题:移除元素(双指针思想优化解法详解)
  • 【TypeScript】闭包
  • 后端(fastAPI)学习笔记(CLASS 1):扩展基础
  • Spring Boot @RestController 注解详解
  • 腾讯云语音接口实现会议系统
  • ESP32与SUI-101A实现用电器识别
  • Wan2.2-S2V - 音频驱动图像生成电影级质量的数字人视频 ComfyUI工作流 支持50系显卡 一键整合包下载
  • 开始 ComfyUI 的 AI 绘图之旅-图生图(二)
  • VS2017安装Qt插件
  • ZYNQ FLASH读写
  • 容器元素的滚动条回到顶部
  • 【音频字幕】构建一个离线视频字幕生成系统:使用 WhisperX 和 Faster-Whisper 的 Python 实现
  • ncnn-Android-mediapipe_hand 踩坑部署实录
  • java面试中经常会问到的mysql问题有哪些(基础版)
  • SoundSource for Mac 音频控制工具
  • Unity学习----【进阶】Input System学习(一)--导入与基础的设备调用API
  • 第11篇:降维算法:PCA、t-SNE、UMAP