从Web转向Pwn,就像从开汽车转去修发动机,视角从"应用逻辑"深入到"系统底层"。这是极具挑战但回报丰厚的选择。对于零基础,你的学习路径将围绕 **"理解计算机如何真正执行程序"** 展开。
以下是为你量身定制的Pwn入门路线,分为四个阶段,强调动手。
第一阶段:筑基(约1-2个月)------理解"程序"的真相
这是最枯燥但无法跳跃的阶段,目标是将你对程序的理解从"黑盒"变为"白盒"。
-
C语言与内存观:
-
重点 :远超语法本身。你必须透彻理解:指针、数组、字符串、结构体在内存中的实际布局 。写代码验证
sizeof各种类型,画图表示变量在栈上的排列。 -
实践:编写程序,打印变量地址,观察它们的位置关系。
-
-
汇编语言与CPU视角:
-
目标 :能读懂,不要求能写。聚焦 x86/x86-64 架构。
-
核心:
-
寄存器 :
eip/rip(程序计数器)、esp/rsp(栈指针)、ebp/rbp(基址指针)的作用。 -
指令 :
mov,push,pop,call,ret,lea,add,sub的含义。 -
函数调用约定:参数如何传递(x64优先用寄存器)、栈帧如何建立与销毁。
-
-
实践 :用
gcc -S将简单的C程序编译成汇编文件,对照着看。
-
-
Linux环境与工具链:
-
终端:熟悉基本命令。
-
编译器 :理解
gcc的常用参数,特别是-g(调试信息)、-m32(编译32位程序)、-fno-stack-protector(关闭栈保护)。 -
调试器 :GDB 是你的主武器。必须熟练使用:
break,run,nexti,stepi,info registers,x/20wx $sp(查看栈内存)。
-
本阶段成果:你能看着一个简单的C源码,准确说出其函数调用时栈的变化,并能用GDB跟踪验证。
第二阶段:破冰(约1个月)------拿下第一个漏洞:栈溢出
这是你Pwn生涯的"Hello World",目标是在最简单环境下,完成一次完整的利用。
-
核心漏洞原理:
- 彻底搞懂栈缓冲区溢出 。画图理解:局部变量、返回地址在栈上的位置,当
strcpy等函数写入超长数据时,如何覆盖返回地址。
- 彻底搞懂栈缓冲区溢出 。画图理解:局部变量、返回地址在栈上的位置,当
-
利用技术入门:
-
Ret2text :将返回地址覆盖到程序本身的
system("/bin/sh")代码段地址。 -
Ret2shellcode:将返回地址覆盖到你自己写入的机器指令(shellcode)所在地址。
-
-
关键工具:
-
checksec:查看程序开启了哪些保护机制(如NX, ASLR)。从关闭所有保护的程序开始练习。 -
cyclic&cyclic -l:来自pwntools,用于快速定位返回地址的偏移量。 -
pwntools:Python库,用于编写利用脚本。从学会发送数据、接收输出开始。
-
-
实践平台:
-
绝对首选 :pwnable.kr 的
fd,bof,passcode题目。题目经典,环境稳定。 -
本地练习:自己用C写一个有栈溢出漏洞的程序,关闭所有保护,然后尝试攻击它。
-
本阶段成果 :你能独立解决pwnable.kr的bof(缓冲区溢出)题目,并写出完整的Python利用脚本。
第三阶段:进阶(约2-3个月)------绕过保护,理解现代系统
当基础利用畅通无阻后,开始面对现实世界的保护机制。
-
对抗安全机制(按顺序学习):
-
NX :栈不可执行。学习 Ret2libc 技术,利用程序中已有的
libc库函数(如system)来getshell。 -
ASLR :地址空间随机化。学习信息泄露 :通过漏洞先泄露一个函数的真实地址(如
puts的GOT表项),计算出libc基址,进而算出system地址。 -
Canary :栈溢出检测。学习如何泄露 或绕过金丝雀值。
-
-
深入利用原语:
-
格式化字符串漏洞:不仅能泄露内存,还能实现任意地址写。
-
堆利用基础 :理解
malloc/free的基本原理,学习use-after-free、fastbin attack等经典漏洞。可从 how2heap 仓库的示例开始。
-
-
实践平台升级:
-
pwnable.kr 后续题目。
-
ROP Emporium :绝佳的ROP学习平台,所有题目都围绕64位ROP设计,由浅入深。
-
CTF Wiki:作为知识词典,边做题边查阅。
-
本阶段成果:你能解决开启了NX和ASLR的中等难度题目,并掌握通过泄露地址来计算libc基址的标准流程。
第四阶段:融合与实战(长期)------形成自己的武器库
-
构建知识体系:
-
建立自己的笔记,记录每种漏洞的原理、利用条件、利用步骤、示例代码。
-
使用 GitHub 管理你的解题脚本和笔记。
-
-
参与比赛与复盘:
-
从 CTFtime 上找一些新生赛、校内赛参加,主攻Pwn题。
-
赛后务必看官方Writeup和其他人的解法,学习多种思路。
-
-
延伸学习:
-
Windows Pwn:了解其不同的内存布局和调用约定。
-
内核Pwn:挑战更高维度,需要操作系统内核知识。
-
给你的行动清单与心态调整
-
立即行动:
-
本周 :在Linux虚拟机中配置好
gcc,gdb,pwntools,checksec。编译一个带栈溢出的C程序,用GDB跟进去,亲眼看到返回地址被覆盖。 -
第一个月 :死磕 pwnable.kr 的前3道题(fd, collision, bof),确保完全吃透。
-
-
心态准备:
-
拥抱底层:Pwn需要与内存地址、寄存器、汇编指令打交道,初期会感到抽象和挫败,这是正常的。
-
调试即学习 :GDB是你的老师。80%的时间都在调试和分析。学会用
gef或pwndbg等GDB增强插件,它们能直观显示内存布局。 -
Web基础是优势:你对漏洞利用的思维(输入点、触发点、影响)是相通的。Pwn只是把"输入点"从HTTP参数变成了二进制数据,把"影响"从业务逻辑变成了程序执行流。
-
最后一句忠告:Pwn的学习曲线比Web陡峭,但突破入门瓶颈后,你会获得对计算机系统前所未有的深刻理解。从栈溢出这个"Hello World"开始,耐心调试,每一步都确保自己真正看懂。祝你早日拿到第一个shell!