本文专门是为某次分享会而写的,目的是分享一下我在搭建Pwn的本地解题环境上的经验,还有简单介绍一下一些比较简单的Pwn的入门题。
(博主还是菜鸟,有些知识可能理解不够透彻,有些表述可能不够严谨,欢迎大家指正,望大家多多包涵)
Pwn是什么?
”Pwn“是一个黑客语法的俚语词,是指攻破设备或者系统,发音类似于”砰“。在CTF比赛里主要是指漏洞利用。Pwn的题型一般是拿到shell,获取flag。
摘录精简自《CTF特训营》(机械工业出版社)
搭建本地调试,解题环境
首先需要有一个Linux的虚拟机,最好使用Ubuntu(很多Pwn题都是跑在Ubuntu上的,有些题目的解题需要对系统的glibc进行比较详细的分析,使用其他系统不利于解题,一般16.04和18.04都可以,我个人通常用16.04版的)
(以下软件除IDA Pro以外通常需要安装到Linux上)
-
IDA Pro:反汇编用的软件,有非常好用的”F5“反编译成C语言的功能(不一定准确,需要结合汇编代码看),一般用来做静态的分析。软件可以在吾爱破解的”爱盘“里找到链接
-
gdb:Linux下常用的调试软件,一般的Linux发行版都会有(这里推荐gdb的两个插件一个是pwngdb,和Pwngdb。
(这是两个插件,名字有点像,pwngdb很好用,可以同时显示寄存器,汇编代码,栈等等,Pwngdb是我在某个Writeup里看到的,它有一些命令可以更清晰的显示”堆“相关的东西) -
pwntools:用来写解题脚本的利器,解大部分CTF题都需要它。
安装方法:sudo pip install pwntools
(①需要先下载python,2.7版和3.x版应该都可以的,②使用root权限安装它可以使它的某些工具直接在bash里使用,比如checksec
查看软件的保护信息。还有就是能在脚本中打开gdb调试你使用pwntools打开的程序)
前面三个软件一般是解Pwn题必不可少的,这里我还再介绍几个比较好的辅助软件:
- Ropgadget:可以获取用来构建rop链的gadget。
安装方法:pip install ropgadget
。用法详见https://github.com/JonathanSalwan/ROPgadget - one_gadget:可以分析一个libc里的可以用来执行
execve('/bin/sh', NULL, NULL)
系统调用的部分,在某些限制比较大的题目中用处非常大。
安装方法:sudo gem install one_gadget
(好像不是root权限下不能安装,gem是ruby语言的包管理器,需要先下载ruby语言相关软件,详见:https://github.com/david942j/one_gadget) - seccomp-tools:用来查看程序seccomp(Secure Computing)信息,之前几次比赛都碰到了seccomp相关的题。
安装方法:sudo gem install seccomp-tools
(注意:这个在Ubuntu16.04下不好安装,我现在用的Ubuntu16.04使用apt安装的ruby版本是2.3.1p112,而这个软件需要至少2.4版本,Ubuntu18.04可以正常安装,详见:https://github.com/david942j/seccomp-tools) - LibcSearcher:可以通过泄露的某个libc函数的真实地址找出对应libc库,进而找出其他函数的地址。
安装方法:详见:https://github.com/lieanu/LibcSearcher
在Linux写Pwn的解题脚本的软件我用过Pycharm的社区版和VS Code,我用VS Code的自带的控制台跑脚本调试Pwn题的程序有时候不太方便,Pycharm相对更好一点
简单栈溢出的学习
首先,我们应该要知道,一个程序的某个函数在运行的时候需要栈来保存有关该函数的信息,大致的结构如下图:
例题vuln0里有个函数vulnfunc
可以直接打开一个shell,所以我们就需要想办法让程序的执行流导向vulnfunc
的位置,而ebp下方就是函数返回的地址储存的地方。我们只需要用vulnfunc
的地址把它覆盖了就行。