Pwn 与逆向入门
Pwn 和 Reverse(逆向)是二进制双方向:Reverse 是"读懂没有源码的程序",Pwn 是"让程序执行你想让它执行的东西"。门槛是六个方向里最高的——需要操作系统、内存和汇编的底子——但一旦入门,你对计算机的理解会超过绝大多数同行。
先记住一句话:逆向是"从二进制恢复逻辑",Pwn 是"利用逻辑里的缺陷改写控制流"——两件事共用同一套底层知识。
一、先补三块地基(不必等学完再开始)
- 内存布局:代码段(只读)、数据段、堆(动态分配,往高长)、栈(函数调用现场,往低长)。Pwn 的主战场就是栈和堆
- 函数调用约定:
call把返回地址压栈,函数结束后ret弹回——"覆盖返回地址"是几乎所有栈溢出题的核心动作 - x86-64 汇编阅读:
mov传值、push/pop栈操作、call/ret调用、cmp + jz/jnz分支。看不懂整段没关系,先认识这几条
寄存器记六个就够开工:返回值 rax、前六个参数 rdi rsi rdx rcx r8 r9、栈顶 rsp、栈底 rbp。
二、逆向(Reverse):把二进制读回源码
标准流程:
text
① file / checksec 看类型与保护
② IDA(或 Ghidra)打开 → F5 反编译出伪代码(C 风格)
③ 定位关键判断:搜索 "Correct" / "Wrong" / "flag" 字符串的交叉引用
④ 读懂校验逻辑 → 反推满足条件的输入常见题型与套路:
| 题型 | 套路 |
|---|---|
| 校验类 | 逆推逻辑或用约束求解(z3 库)解出输入 |
| 迷宫/游戏类 | 理解状态机,画出合法路径 |
| 加密比对类 | 把程序的加密函数原样写出来,对密文逆运算 |
| Android 逆向 | apktool/jadx 反编译,逻辑多在 Java 或 so 库里 |
工具建议:Ghidra 免费、IDA 更顺手,两个都装;动态确认用 gdb。逆向的耐心比天赋重要——一段 200 行的伪代码,逐行注释下来就是一道题的答案。
三、Pwn:从栈溢出说起
程序读了超长输入到固定大小的栈缓冲区里,多出来的部分把返回地址覆盖了——ret 的时候控制流就跳到了你指定的地址。这是 1988 年莫里斯蠕虫用到今天的教学母题。
四种保护机制(checksec 一条命令全显示)决定你能怎么打:
| 保护 | 含义 | 对你的影响 |
|---|---|---|
| NX(不可执行栈) | 栈上数据不可执行 | 不能直接塞 shellcode,改用ret2libc / ROP |
| Canary(金丝雀) | 栈上放哨兵值,被改则报错退出 | 需要泄露或绕过 Canary |
| PIE | 程序加载地址随机化 | 地址每次不同,需要先泄露 |
| RELRO | GOT 表只读 | 阻断改写 GOT 的手法 |
入门路线就是沿着保护从"全关"打到"全开":ret2text(跳程序里现成的后门函数)→ ret2shellcode(NX 关时)→ ret2libc(泄露 libc 地址)→ ROP 链。
四、pwntools:Pwn 的手
python
from pwn import *
p = process('./pwn1') # 本地调试;远程用 remote('ip', port)
payload = b'A' * 0x20 + p64(0x401234) # 填满缓冲区 + 覆盖返回地址为后门函数
p.sendline(payload)
p.interactive() # 进入交互,若拿到 shell 则 ls / cat flag就这五行的骨架,所有入门题都是它的变体:偏移量怎么算(cyclic 工具自动测)、后门地址是多少(IDA 里找 system("/bin/sh") 或 cat flag 函数)、64 位参数放哪个寄存器(ROPgadget 找 pop rdi; ret)。
💡 动手实验:找一道"全保护关闭 + 自带后门函数"的 ret2text 题(BUUCTF 的【test_your_nc】系列),用 checksec 确认保护,IDA 找到后门地址,pwntools 发 payload 拿 shell——这是 Pwn 的"Hello World",值得为此专门装一次虚拟机。
五、学习路线与避坑
- 汇编和操作系统先行:老老实实过一遍 x86-64 汇编(重点寻址与栈操作)和调用约定,之后每道题都在加深而不是重学
- 从 32 位无保护题入门,再上 64 位、再开保护——不要第一题就挑战全保护
- 逆向为 Pwn 服务:绝大多数 Pwn 题先要逆出程序逻辑,两方向本来就是一体的
- 避坑:别背 shellcode(
execve("/bin/sh")16 进制那串),理解它是什么;别跳过 gdb 动态调试——只在静态里看 Pwn,等于闭着眼睛开车
小结
- 逆向四步:checksec → 反编译 → 定位关键逻辑 → 反推输入;耐心即天赋
- Pwn 母题:缓冲区溢出覆盖返回地址;四种保护决定四种打法
- pwntools 五行骨架 +
cyclic测偏移 +ROPgadget找 gadget,入门三件套 - 学习顺序:汇编 → ret2text → ret2shellcode → ret2libc → ROP;全程配合 gdb 动态调试
最后一讲,回到赛场:Writeup 与上场。