PWN学习指北
这是一条关于自己制定的PWN学习路线的指南
引言
什么是PWN?
PWN是在网络安全竞赛中的一个重要方向,全称来源于英语单词 “own” 的黑客俚语写法,意为“攻陷”或“控制”。在计算机安全语境中,pwn掉一台机器就意味着成功利用系统漏洞,获取对该系统的控制权。
PWN在CTF中的定义
在CTF比赛中,PWN类题目主要考查参赛选手对于二进制程序漏洞的分析与利用能力。选手需要通过逆向分析与调试手段,找出程序中的漏洞,并编写利用脚本,实现对目标程序的控制,如劫持程序执行流、执行 shellcode、读取 flag。
所需编程语言
C 语言
- 为什么 C 语言对于PWN很重要 许多系统软件、服务、和CTF题目大多数都是用C/C++编写,二进制漏洞的大多是根源是C层面的内存操作(指针、缓冲区…)
- IDA 此外在我们使用IDA反编译的时候出现的伪代码大多是都是伪C代码,他们大多是像以下这样
int __fastcall main(int argc, const char **argv, const char **envp)
{
_BYTE v4[32]; // [rsp+0h] [rbp-20h] BYREF
setbuf(stdout, 0);
puts("QLNUCTF_Pwn");
puts("Please enter your payload...");
__isoc99_scanf("%s", v4);
return 0;
}
所以我认为学习C语言就是可以帮助我们快速的分析二进制程序
Python
Python是我们在PWN环境中,编写攻击命令最常应用的编程语言
汇编
汇编是把程序“拆解成指令”,我觉得漏洞利用的本质就是“控制执行流(指令地址)”,只有看懂汇编,才能理解漏洞利用的本质(但是这个在前期对于新手有些难)
环境搭建
PWN类题目的题目学习还需要搭建与其多对应的环境
Linux
我觉得对于做PWN的环境,还是在Linux中去做更加舒服一点,这里的Linux系统我推荐的是Ubuntu,很多 CTF 题和训练题是在 Debian/Ubuntu 或兼容的环境下编译、测试和部署的。Ubuntu 的默认 glibc、gcc 版本、库路径与题目环境更接近,能减少“本地能跑、远端跑不了”的麻烦。
PWN环境
PWN环境在Linux中的搭建我已经在上一版PDF中详细讲解过了这里就不在过多赘述 然后这里是PWN题的一些基本流程
- 先检查是什么架构的,开启什么保护(
checksec) - 替换与题目相同的libc,ld文件(
patchelf) - IDA反编译
- GDB调试
- 编写并利用脚本
基础知识
Linux基础命令
因为我们PWN环境是在Linux系统上搭建的,而且大多数的PWN题目也是在Linux系统上搭建的,那么我们就需要学习一些关于Linux的基础命令,以便于我们更好的寻找FLag或者查询东西,像是查看文件内容的cat,查看当前目录中存在那些文件的ls等等,都需要我们的学习
Netcat 的使用
大多数的题目都需要我们使用Netcat来连接我们的pwn题目,并且我们并不需要了解它太多的东西,只知道一条就已经完全足够了nc ip port
Linux底层
这是相对于后期的东西,前期可以先不着急学习此处 Linux底层我们使用最多的就是系统调用,比如64位的
syscall,32位int 0x80,在我们使用这些的时候就需要一些寄存器的顺序之类的东西
常用软件
一些常用的软件我已经在PWN环境搭建这一PDF中详细教学,这里只提到某些软件
IDA
这是我们常用的二进制程序反编译工具
GDB
这是我们在动态调试的时候所使用到的工具
pwntools
这是我们在编写攻击代码的时候所使用的工具
漏洞学习
简单类
- 整数溢出
- 格式化字符串
- 缓冲区溢出
栈溢出
- ret2text
- ret2libc
- ret2syscall
- ret2shellcode 等等…还有很多这里我的建议是从CTF Wiki 上了解
堆溢出
这个是相对于比较后期的东西
- 堆溢出
- Off-By-One
- Unlink
- Use After Free 等等…这些我还是建议是从CTF Wiki 上了解
网站推荐
我在这里推荐几个我比较常用的刷题网站