1. 从零开始理解PWN技术
第一次听说PWN这个词的时候,我还以为是什么游戏术语。后来才知道,这是安全圈里对二进制漏洞利用技术的统称。简单来说,PWN就是通过分析程序漏洞,构造特殊输入数据,最终获取程序控制权的技术。而cgpwn这个项目,正是为初学者量身打造的PWN学习路线。
PWN技术主要涉及逆向工程、汇编语言、操作系统原理等多个领域。初学者常犯的错误就是直接上手做题,结果连最基本的栈结构都搞不清楚。我建议的学习路径是:先掌握C语言和汇编基础,再理解程序内存布局,最后才是漏洞利用技巧。
重要提示:学习PWN一定要从32位系统开始,因为32位的栈结构更简单直观,适合建立基础概念。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 搭建PWN实验环境
2.1 基础工具准备
工欲善其事,必先利其器。PWN研究需要一套专门的工具链:
- 调试器:GDB是必备工具,建议安装增强版peda/pwndbg/gef
- 反汇编工具:IDA Pro或Ghidra
- 漏洞利用框架:pwntools(Python库)
- 虚拟机环境:推荐使用Ubuntu 18.04 LTS
安装pwntools的命令:
bash复制pip install pwntools
2.2 靶机环境配置
初学者最容易卡在环境配置上。我建议使用Docker快速搭建练习环境:
dockerfile复制FROM ubuntu:18.04
RUN apt-get update && apt-get install -y \
gcc \
gdb \
python3 \
python3-pip
RUN pip3 install pwntools
3. 32位与64位体系架构差异
3.1 函数调用约定对比
这是PWN学习中最关键的基础知识。32位和64位系统在参数传递上完全不同:
| 特性 | 32位系统 | 64位系统 |
|---|---|---|
| 参数传递方式 | 栈传递 | 寄存器传递 |
| 常用寄存器 | eax, ebx, ecx | rax, rdi, rsi |
| 栈对齐要求 | 4字节对齐 | 16字节对齐 |
3.2 栈结构详解
以最简单的栈溢出为例,32位系统的栈帧结构:
code复制高地址
...
参数n
...
参数1
返回地址
保存的ebp
局部变量
...
低地址
而64位系统由于使用寄存器传参,栈上可能看不到参数。
4. cgpwn学习路线解析
4.1 初级阶段:栈溢出
建议从最基本的栈溢出开始:
- 无保护机制的ret2text
- 绕过NX保护的ROP
- 绕过ASLR的内存泄露
一个简单的ret2shellcode示例:
python复制from pwn import *
context(arch='i386', os='linux')
shellcode = asm(shellcraft.sh())
p = process('./vuln')
payload = b'A'*140 + p32(0xffffd100) + shellcode
p.sendline(payload)
p.interactive()
4.2 中级阶段:堆利用
堆利用是PWN技术的分水岭,需要掌握:
- Use After Free (UAF)
- Double Free
- Fastbin Attack
- Unlink Attack
4.3 高级阶段:内核PWN
进入内核领域需要补充操作系统知识:
- 内核模块漏洞
- 提权技术
- SMEP/SMAP绕过
5. 常见问题与调试技巧
5.1 GDB实用命令
这些命令我每天都在用:
gdb复制# 查看内存映射
vmmap
# 查找字符串
find "/bin/sh"
# 设置硬件断点
hbreak *0x08048444
# 查看寄存器值
telescope $esp 20
5.2 典型错误排查
- Segmentation Fault:检查跳转地址是否可执行
- Bad Instruction:确认shellcode与架构匹配
- 无效果:检查payload是否覆盖到返回地址
6. 学习资源推荐
经过实战检验的资源清单:
-
书籍:
- 《漏洞战争》
- 《CTF竞赛权威指南》
-
在线平台:
- pwnable.kr
- pwnable.tw
- CTFtime.org
-
视频教程:
- 看雪学院PWN入门系列
- 清华大学操作系统课程
7. 我的PWN学习心得
从完全不懂到能独立完成中等难度题目,我花了大约6个月时间。最大的体会是:
- 动手实践:看10篇教程不如实际调试1个漏洞
- 记录笔记:每个遇到的坑都要详细记录
- 参加比赛:CTF比赛是最好的实战训练场
最后分享一个调试技巧:遇到复杂漏洞时,先用纸笔画出现金流和数据结构图,这能帮你理清思路。我在分析第一个堆漏洞时,画了十几张草图才完全理解内存布局。
