在开始学习pwn之前,你需要至少如下的基础知识
1.完整的C语言语法基础在这一点上,可以不需要学习过于高深的算法知识,当然,要是会一些算法、数据结构或者能够熟练运用指针就更好了
2.基础的linux使用能力图形化界面在此不予阐述,有手就行。这里的linux使用指命令行状态下,能够运用基本的shell命令管理linux系统。不需要到可以进行shell编程的地步,但需要保证不能两眼一抹黑
3.python语言基础此处的python包括python2和python3,相信对于具有C语言语法基础的人学python都是有手就行,但我仍然要提醒读者注意python2和python3的诸多区别,尤其是python3中str类型与bytes类型的区分与转换
4.汇编语言基础x86系列汇编语言具有向下兼容特性,故而可以按如下顺序学习:8086、i386、amd64
推荐王爽老师的《汇编语言》
(笔者习惯使用Intel风格汇编语法,故而之后所有笔记中均使用Intel风格)
不要求可以手搓汇编程序,只要求可以看懂汇编代码
(注意,对于刚开始接触计算机的新生,学习汇编语言可能会极其痛苦)
对于这一步基础属实打不好的同学,可以在之后慢慢补,但是底线是至少要明白以下汇编指令的作用,在之后遇到不懂的汇编指令再百度
mov add sub inc dec lea cmp test je jne jmp call push pop and or xor工具准备 1.linux系统
首先,你需要一个可用的linux系统,依据广大pwn学习研究者的习惯,推荐linux的发行版ubuntu系统(以下的所有工具安装都基于ubuntu),请使用vmware软件安装该系统,当然,安装双系统或者把windows删了换成ubuntu我也没意见,唯一不推荐的是使用wsl模拟linux环境,不要问为什么
linux上C语言的动态链接库glibc在不同系统版本上版本也不同,具有不同特性,故而需要安装多个版本的ubuntu
在学习的初期,由于pwn中很大一部分题目,尤其是基础题,其所用libc版本为2.23,对应ubuntu版本为ubuntu16,所以在学习前期至少需要安装一个ubuntu16的系统。当然我建议你一次安装完毕省的麻烦
截止本文编辑的日子,需要的虚拟机如下
ubuntu16(libc2.23)
ubuntu18(libc2.27_<=1.2)
ubuntu18(libc2.27_>=1.3)
ubuntu20(libc2.31)
当然,学到后面的时候就会有办法用一个虚拟机搞定了
由于其它工具的需要,在不同版本ubuntu上使用的python版本不同。ubuntu16为python2,其余为python3。
对于ubuntu系统,其在安装时就内置了python2,但是python3需要额外安装,使用如下命令安装python3
sudo apt install python3
确认python安装完毕,版本正确后,安装python的pip模块
sudo apt install python-pip #python2(这个包在ubuntu18以上就无法这样安装了,但无所谓,ubuntu18+我们用python3) sudo apt install python3-pip #python33.git
你需要git工具来克隆代码托管网站上别人写好的项目
sudo apt install git4.gdb及其插件(pwndbg、peda、gef三选一)
首先,使用如下命令检查是否安装了gdb
gdb -v
如果没有安装,使用如下命令安装
sudo apt install gdb
我们不得不承认,原生gdb某种意义上真的是个傻X软件,所以我们需要一些插件来增强其功能,笔者建议pwndbg、peda、gef三选一,由于笔者习惯使用pwndbg,在这里给出pwndbg的安装方式,如需安装另外两个插件请自行百度
首先,克隆源代码
git clone https://github.com/pwndbg/pwndbg cd pwndbg
然后,使用编辑器打开setup.sh
gedit ./setup.sh
搜索并注释掉如下两行(防止python2更新pip引发错误)
git submodule update --init --recursive
${PYTHON} -m pip install ${INSTALLFLAGS} --upgrade pip
然后安装
./setup.sh5.pwntools
对于ubuntu18及以上的系统,使用基于python3的pwntools。这里我不得不表示,我认为pwntools4.6+在某些方面简直是反pwn手,故而我使用4.5.0版本的pwntools。使用如下命令安装pwntools
sudo pip3 install pwntools==4.5
对于ubuntu16,使用基于python2的pwntools。由于python2已经不再受官方支持,安装比较麻烦,需要对依赖包的版本微调。
以下给出安装pwntools4.0.0的命令
sudo pip install setuptools==44.0 sudo 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
在某些版本的pwntools安装完毕后,可能存在无法使用checksec命令的情况,在python中导入pwn模块后使用语句ELF(“filepath”)可以获得相同的效果
6.ROPgadgetROPgadget是pwntools的依赖组件之一,当你安装完毕pwntools,也就安装好了ROPgadget
使用如下命令确认ROPgadget版本信息
ROPgadget -v7.LibcSearcher
截止本文编写,网络上大多数使用LibcSearcher的脚本使用的LibcSearcher是lieanu大佬编写的原版
而笔者使用的是wjhwjhn大佬根据原版修改的改进版,有关这两者的区别请查阅其github页面:LibcSearcherEX
git clone https://github.com/wjhwjhn/LibcSearcher.git cd LibcSearcher python2 setup.py develop #python2 python3 setup.py develop #python38.one_gadget
使用以下命令安装one_gadget
sudo apt install ruby sudo gem install one_gadget
截至目前,笔者仅在ubuntu20以上成功安装该工具,其它版本均因无法安装ruby>=2.7.0失败。
9.seccomp-tools使用以下命令安装seccomp-tools
sudo apt install ruby sudo gem install seccomp-tools
这个工具的状况同上一个。



