逆向大类-PWN入门指南(新)

本文最后更新于:2024年7月25日 下午

PWN入门指南

0x01 Pwn是什么

  1. Pwn:“Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统 。发音类似 “砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵。
  2. CTF中Pwn题型通常会直接给定一个已经编译好的二进制程序(Windows下的EXE 或者GNU/Linux下的ELF文件等),然后参赛选手通过对二进制程序进行逆向分析和调试来找到利用漏洞,并编写利用代码,通过远程代码执行来达到溢出攻击的效果,最终拿到目标机器的shell夺取flag。
  3. 一般来说在CTF中我们获得的权限是启动服务的用户的权限,在深入学习后进而可尝试获取到最高权限(如Linux下的root权限、Windows下的TrustedInstaller权限)亦或是控制内核层的运行(如Linux下的GNU/Linux内核、Windows下的Ring0、MacOS下的XNU内核)。
  4. 二进制逆向可以概括为 从目标代码反推到源代码,再通过源代码去理解该文件的实现的功能和创作的意义,这项技术在实战中常应用的领域为 软件破解、漏洞挖掘、恶意木马的分析。
  5. 最终目的是知道哪里有漏洞后,在合法合规的条件下,通过模拟黑客攻击,分析其危险程度与可利用程度,进行有效且合理的修复或修复建议,让程序变得更加安全
  6. 挑战未知是技术人员的浪漫所在,我们不断探索、深挖、突破,用智慧和热情改写技术革新的篇章。

0x02 基础知识

1.C语言

零基础的同学,从C语言的学习开始
视频推荐:中国大学mooc:翁恺教授-C语言入门
练习平台:PTA | 程序设计类实验辅助教学平台首页 - 洛谷 | 计算机科学教育新生态
在之后,学有余力的同学,可以学习简单的数据结构和算法,尤其是链表结构,会更好地辅助你学习堆结构。

2.汇编语言

推荐:王爽《汇编语言》
最后的目的是能看懂汇编代码,不用实现手搓汇编程序
早期学习中的目标:了解绝大多数指令的作用 , 寄存器的作用 , 寻址方式(此处为x86指令集部分指令,未来会出现更多的指令以及指令集)

1
2
3
4
5
6
7
8
9
mov
add
lea
cmp
test
jmp
call
push
pop

3.python基础

在C语言基础扎实的情况下,python是很容易入门的
在做pwn题的时候,一般是通过python脚本与程序和工具进行关联,所以需要学习python
python包括python2 和 python3 ,学习中注意python2和python3的诸多区别,尤其是python3中str类型与bytes类型的区分与转换
(但现在更多师傅在做题时会选用Python3,Python2.7环境是多个Ubuntu标准环境中自带的,也同时兼容一些仅低版本的工具的使用。推荐版本 3.7.* 3.8.*)

很多内容在python pwntools包中已经有人帮你造好轮子了,善用已经造好的轮子。

4.linux基础

目的是能够运用基本的shell命令以及熟悉GNU/Linux的系统结构
简单的linux命令行的使用,如nc cat env pwd
pwn的很多工具是只有linux版本的,所以需要简单的学习
(注:不是特别建议直接将本机系统换为GNU/Linux,双系统可行,一般还是虚拟机即可)

0x03 大致路线&资料

刷题平台推荐:NSSCTF攻防世界BuuOJPWNHUBCTFShowPwnable(TW)Pwnable(KR)PwnCollege (排名不分先后,以个人对本方向做题体验排序)
学习资料:PWNCollege熟肉CTF-wiki文字资料星盟安全PWN全集视频资料NJU_jyy操作系统CTF 中 glibc堆利用 及 IO_FILE 总结(winmt)
比赛查询:Hello-CTF
安全平台:看雪、FreeBuf、安全客、先知、吾爱破解 云云
相关书籍推荐:《有趣的二进制》 《深入理解计算机系统》 《程序员的自我修养》 《0day漏洞挖掘与利用》《64位操作系统的设计与实现》
由于本方向相对其他方向资源偏少,集合程度较低,内容偏向底层,更需要个人的思考、调试的熟练程度,以及对于资料的找寻能力。善用搜索引擎,对于即将获得的“知识”不盲从,尝试分析知识的准确性(点名CSDN偶尔存在错误信息还无授权搬运)。

(也可以找人要一个浏览器的收藏夹)

1.栈

在这里我们需要记住一个很关键的原则或思想:你的任何操作都与寄存器息息相关

基本ROP:ret2text , ret2shellcode , ret2syscall, ret2libc
这些学习完,就可以在ctf平台上开始刷题练手了

ctfwiki中其他构造ROP的技巧:ret2csu, ret2reg等等
之后的ret2dl_resolve等技巧有难度,可以暂放

2.格式化字符串漏洞

学习如何利用漏洞实现 泄露内存 和 覆盖内存
包括泄露栈上内容,泄露BSS段上内容等等
通过利用格式化字符串漏洞几乎可以实现任意写和任意读

3.堆

在学习堆之前,先熟悉数据结构“链表”,包括单向链表,双向循环链表等等
一个人有一个人的学习方法,可以尝试从手法(如house of **)入手,也可以尝试从打法(如UAF)入手。

4.未来学习路线

如 内核、IoT、webpwn,这些基本都是自己选择了,把前面基本功打牢,就可以从就业、研究、喜好等等方面考量选择自己感兴趣或者说“好赚钱”的方向。

附:环境搭建&工具安装

1.linux系统安装

通过虚拟机 如:VMware实现 (也可以双系统,开心就好)
再于虚拟机中搭建linux系统:最好为Ubuntu
初期所接触的ctf-pwn题,多为libc2.23, 所以前期至少需要安装ubuntu16的系统

前面为系统大版本名,括号里是目前其对应的常见的libc大版本

1
2
3
4
ubuntu16.04(glibc2.23)
ubuntu18.04(glibc2.27)
ubuntu20.04(glibc2.31)
ubuntu22.04(glibc2.35)

但由于后续某些工具也在同步更新,导致ubuntu16可能不能很好地安装这些工具,所以此处我们更推荐使用Ubutnu22.04LTS。

(如果需要ubuntu1604的环境,后续我会发已经集成好的ova文件,或者比较古早版本的pwndbg)

2.Ubuntu22.04以及python2环境下进行安装

(注:如果是ubuntu18及以上版本最好且应该采用Pyhton3的安装方式,如未注明Python2/3,则更希望
读者采取Python3的方法;如果希望使用Python2版本的安装也可以在GitHub上找到某些特定的低版
本,但所有的Python2版本我们都是不建议的。)

(另注:使用git下载的项目请不要使用gitclone.com的镜像,因为其中内容并没有更新到最新版本,如果您希望使用github的一些镜像去下载,请提前检查两份项目其中内容是否完全一致。更推荐通过科学上网的方式进行解决。)

推一个私货my_pwn_init

0. IDA

用于逆向程序,呈现出可以阅读的汇编代码
(在windows下使用,群文件里有资源;在linux下可以使用wine或去官网下载ida free(不建议),在MacOS/OS X上可以使用ida free,或直接使用Ghidra,不建议使用其他的软件)

1. ubuntu22.04

可以先用图形化的ubuntu,后面在熟悉后再尝试纯命令行并且用ssh工具进行交互
虚拟机安装,VMware Workstation Pro+ ubuntu22.04的iso文件
vmtools安装:https://blog.csdn.net/adminkeys/article/details/107914813

2. apt更新:

在本处往后内容都需要在命令行中
由于国外源相对较慢,推荐上网搜索您使用的Ubuntu版本换源,然后根据教程操作后进行如下操作:

1
2
3
4
sudo apt update
# sudo apt upgrade
# upgrade可选,为本地所有已安装包体的更新
# update是更新软件源,upgrade是更新软件包

3. python2.7:

1
2
#非必要
sudo apt install python2.7 python-pip python-dev git libssl-dev libffi-dev build-essential

4. pip:

用于快捷的安装其他软件

1
2
3
4
5
6
7
8
9
#不直接用apt进行更新,python2会崩,但不建议
sudo apt install wget
wget https://bootstrap.pypa.io/pip/2.7/get-pip.py
sudo python2 ./get-pip.py
#
sudo apt install python-pip

#python3安装
sudo apt install python3-pip

5. git, gdb, gdb-mutiarch

git用于克隆代码托管他人项目
gdb用于调试程序
gdb-mutiarch在之后用于非x86架构的调试(但可能更常搭配qemu使用)

1
2
3
4
sudo apt install git gdb
# 非必要
# sudo apt-get install gdb-multiarch
# sudo apt-get install "binfmt*"

6. pwndbg(gdb的插件)

因为gdb对于pwn题的调试不便,所以需要通过功能更适合的插件pwndbg进行

1
2
3
4
5
6
7
git clone https://github.com/pwndbg/pwndbg
cd pwndbg
gedit ./setup.sh
# 在setup.sh中注释掉这一行:${PYTHON} -m pip install ${INSTALLFLAGS} --upgrade pip
./setup.sh
# 如果第一遍安装有对于capstone的报错,则
# 最好多执行几次,并且保证网络环境通畅,没有任何报错即可停止,如后续使用工具出现问题重新执行本操作

7. pwntools

python pypi的一个库,集合了一整套pwn工具集,涵盖了pwn题利用脚本所需要的各种工具。包括方便
的IO交互函数,ROP、格式化字符串等利用的自动化工具,shellcode生成器等等。
pwntools是目前最好用也是仅有的大型pwn利用框架。

1
2
3
4
5
6
7
8
9
10
11
12
13
#python2.7 不建议
sudo pip install setuptools==44.03sudo pip install MarkupSafe==0.9.2
sudo pip install cryptography==2.5
sudo pip install configparser==3.5
sudo pip install zipp==0.5
sudo pip install importlib-metadata==0.12
sudo pip install importlib-resources==1.0
sudo pip install pwntools==4

#python3安装
pip install pwntools

#Python2.7也可以pip install pwntools,不过同时需要pip install pathlib2

8. ROPgadget(pwntools的一个组件)

在栈溢出的基础上,可以利用程序中已有的小片段(gadgets)改变某些寄存器或者变量的值,便于控
制程序的执行流
而ROPgadget可以实现方便地查找好用的gadgets

1
2
#校验是否安装成功,理论上已在pwntools中包含
ROPgadget -v

9. LibcSearcher

用于解决pwn题中不明libc版本的问题,可以根据泄露的某函数地址,推测服务端使用的libc版本

1
2
3
4
5
6
#python2 不建议
git clone https://github.com/wjhwjhn/LibcSearcher.git
cd LibcSearcher
python2 setup.py develop
#python3安装
pip3 install LibcSearcher

10. one_gadget

由于在ubuntu16.04下安装ruby默认且最高版本为2.3,需要高版本ruby才能安装本工具,可参考如下
文章:https://blog.csdn.net/henryhu712/article/details/89224467
在高版本ubuntu中可以直接安装(Ruby>=2.4.0)

由于是国外源,并且gem下载没有提示,多等待一会就好了,下同

1
2
sudo apt install ruby ruby-dev
gem install one_gadget

11. seccomp_tools

检查sanbox保护用的工具(Ruby>=2.4.0)

1
gem install seccomp-tools

12. patchelf

修改ELF文件的动态链接库以及链接脚本文件,常配合glibc-all-in-one使用,大多数情况下直接apt下载即可,部分情况需要从源码自行编译构建(注:在Ubuntu18下patchelf会使链接后的文件失效,故不建议在Ubuntu18上使用)

1
sudo apt install patchelf

13. pwngdb

在后续堆题的学习中会大大提升学习效率,但由于可能会影响pwndbg的canary指令,所以建议进行后续学习时再进行下载(不过貌似已经修复了)

1
2
3
4
5
6
7
8
# 在用户目录下执行
git clone https://github.com/scwuaptx/Pwngdb.git
cp ./Pwndbg/.gdbinit ./
# 因为你使用的时pwndbg,所以还需如下操作
gedit .gdbinit
# 将第一行 source ~/peda/peda.py 用 # 注释掉或直接删掉
# 然后添加上如下一行,在第一行
source ~/pwndbg/gdbinit.py

理论上做完这些操作 .gdbinit 文件中应该是这样的

1
2
3
4
5
6
7
8
9
10
11
# source ~/peda/peda.py
source ~/pwndbg/gdbinit.py
source ~/Pwngdb/pwngdb.py
source ~/Pwngdb/angelheap/gdbinit.py

define hook-run
python
import angelheap
angelheap.init_angelheap()
end
end

逆向大类-PWN入门指南(新)
http://example.com/2023/05/22/逆向大类-PWN入门指南(新)/
作者
OSLike
发布于
2023年5月22日
许可协议