1. Pwn入门与基础环境:从零搭好你的战场
说实话,每次带新人入坑Pwn,我最头疼的不是教他们怎么利用漏洞,而是环境配置这一步就卡住一半人。我自己带过几届CTF集训队,见过太多因为环境没搭好、连基本命令都跑不通就放弃的例子。所以这一章,咱们先把地基打牢。
1.1 二进制安全到底在干什么?
二进制安全,说白了就是跟程序编译后的机器码打交道。你写的C代码经过编译器变成二进制,这里面可能藏着各种问题——缓冲区溢出、格式化字符串、整数溢出……我们的工作就是找到这些漏洞,然后想办法利用它们。
我经常跟学生说:二进制安全不是玄学,是工程。你不需要成为汇编大师,但得理解程序在内存里是怎么跑的。
核心概念速览:
- 漏洞:程序逻辑或实现上的缺陷
- 利用(Exploit):把漏洞变成实际控制权的过程
- Payload:你精心构造的攻击数据
- Shellcode:能让你拿到shell的机器码
1.2 CTF Pwn竞赛——这不是考试,是实战
CTF(Capture The Flag)里的Pwn题目,模拟的就是真实世界的漏洞利用场景。主办方给你一个二进制程序,你得逆向分析、找到漏洞、写出利用脚本,最终拿到服务器上的flag。
我记得第一次参加CTF,一道简单的栈溢出题卡了我四个小时。后来发现只是没关ASLR……嗯,从那以后我养成了每次做题先检查保护机制的习惯。
| CTF Pwn常见题型 | 难度 | 核心考点 |
|---|---|---|
| 栈溢出(Stack Overflow) | 入门 | ret2text / ret2shellcode / ROP |
| 堆利用(Heap Exploitation) | 进阶 | UAF / Double Free / Tcache poisoning |
| 格式化字符串 | 入门 | 任意读 / 任意写 |
| 整数溢出 | 入门 | 绕过长度检查 |
| 内核Pwn | 高阶 | 提权 / 内核模块利用 |
1.3 Linux基础——你的主战场
为什么Pwn几乎都在Linux上?因为Linux开源、工具链成熟,而且大多数CTF题目跑在Linux上。你想想看,Windows的调试器Windbg虽然强大,但跟GDB比起来,社区资源和插件生态差太多了。
我个人习惯用Ubuntu 22.04 LTS作为主力系统。下面这些命令,你得闭着眼睛都能敲出来:
# 文件操作
ls -la # 查看文件权限和属性
file ./pwn # 查看二进制文件类型
strings ./pwn | grep flag # 提取可打印字符串
# 权限与进程
chmod +x ./pwn # 给执行权限
./pwn # 运行程序
ps aux | grep pwn # 查看进程
cat /proc/$(pidof pwn)/maps # 查看进程内存映射
# 网络调试
nc localhost 1337 # 连接本地端口
ncat -lvnp 4444 # 监听端口
# 二进制分析
objdump -d ./pwn # 反汇编
readelf -h ./pwn # 查看ELF头
ldd ./pwn # 查看动态链接库
我的小技巧:把常用命令写成别名,比如 alias pwncheck='checksec --file='。每次拿到新题目,先跑一遍检查保护机制,能省很多时间。
1.4 虚拟机与Docker——隔离环境,避免翻车
做Pwn最怕什么?本地调试好好的,一上远程就崩。更怕的是——你写的exploit把宿主机搞挂了。我曾经在调试堆利用时,一个野指针直接把系统堆管理器写坏了,整个桌面卡死,只能硬重启。
所以,隔离环境是刚需。
方案一:虚拟机(VMware / VirtualBox)
- 优点:完整操作系统,兼容性好
- 缺点:资源占用大,启动慢
- 推荐配置:Ubuntu 22.04 LTS,2核CPU,4GB内存,20GB磁盘
方案二:Docker容器
- 优点:轻量、秒级启动、环境可复现
- 缺点:不能直接调试内核,部分底层操作受限
- 推荐镜像:
ubuntu:22.04或skysider/pwndocker
我个人更推荐双修:虚拟机做主力开发环境,Docker用来快速测试不同libc版本或题目环境。
# Docker快速上手
# 拉取一个带pwntools的镜像
docker pull skysider/pwndocker
# 运行容器,挂载本地目录
docker run -it --rm \
-v $(pwd):/ctf \
--cap-add=SYS_PTRACE \
skysider/pwndocker
# 进入容器后,直接开始调试
cd /ctf
checksec ./challenge
python3 exploit.py
注意:Docker默认没有 ptrace 权限,调试时记得加 --cap-add=SYS_PTRACE,否则GDB会报错。我曾经因为这个排查了半小时……
1.5 本章知识体系
下面这张图,是我自己梳理的Pwn入门知识脉络。你可以把它当成地图,后续每学一个新知识点,就往上面挂。
1.6 本章小结
这一章我们覆盖了四个核心模块:
- 二进制安全是什么——跟机器码打交道,找漏洞写利用
- CTF Pwn竞赛——实战演练场,从栈溢出到内核利用
- Linux基础命令——文件、进程、网络、二进制分析,一个都不能少
- 环境搭建——虚拟机保底,Docker提效,隔离环境保平安
环境搭好之后,下一章我们会正式进入第一个漏洞类型——栈溢出。到时候我会手把手带你写第一个exploit,让你感受一下拿到flag的成就感。
课后作业:
- 在虚拟机里装好Ubuntu 22.04,配置好gcc、gdb、pwntools、checksec
- 用Docker拉一个pwndocker镜像,挂载本地目录跑起来
- 找一个简单的C程序,编译后用
objdump -d看看汇编长什么样