CTF必备技能丨Linux Pwn入门教程——环境配置
说在前面
这是一套Linux Pwn入门教程系列,作者依据Atum师傅在i春秋上的Pwn入门课程中的技术分类,并结合近几年赛事中出现的一些题目和文章整理出一份相对完整的Linux Pwn教程。
问:为什么要花费精力去整理这套系统的Linux Pwn教程?
答:网上关于Pwn的资料比较零散;经常会碰到解题过程略的Writeup和没有注释;存在大量硬编码偏移的脚本;练习题目难找;调试环境难搭建;GDB没有IDA好操作等等问题。
问:这个Linux Pwn教程适合新手学习吗?
答:本套课程非常适合萌新们进行入门学习,内容通俗易懂,化繁为简,同时结合历年赛题,实操性强,对于快速提升技能可起到很大的帮助。
问:关于Linux Pwn教程是否有视频讲解?
答:在i春秋官网的课程库中有很多关于Pwn的视频课程,立即去学习!https://www.ichunqiu.com/courses/pwn?from=weixin
本系列教程仅针对i386/amd64下的Linux Pwn常见的Pwn手法,如栈,堆,整数溢出,格式化字符串,条件竞争等进行介绍,所有环境都会封装在Docker镜像当中,并提供调试用的教学程序,来自历年赛事的原题和带有注释的python脚本。
教程中的题目和脚本若有使用不妥之处,欢迎各位大佬批评指正。
今天是Linux Pwn入门教程第一章:环境配置,阅读用时约7分钟。
一、Docker容器的使用与简单操作
在搭建环境之前我们需要准备一个装有Docker的64位Linux系统,内核版本高于3.10(可以通过uname -r查看),可以运行在实体机或者是虚拟机中。关于Docker的安装与启动此处不再赘述,读者可以根据自己的Linux发行版本自行搜索。
在成功安装了Docker并验证其可用性后,我们就可以定制自己的实验用容器了。这部分内容可以在各个地方找到教程,且与Pwn的学习不相关,此处不再赘述。为了方便实验,我把实验环境打包成了几个容器快照,可以直接导入成镜像使用。
以ubuntu.17.04.amd64为例,导入的命令为:
cat ubuntu.17.04.amd64 | docker import - ubuntu/17.04.amd64
就可以以这个镜像创建一个容器,开启一个shell,并且将IDA调试服务器监听的23946端口转发到本地的23946端口。
二、IDA的简单使用及远程调试配置
成功搭建了Docker环境之后,我们接下来熟悉一下IDA和IDA的远程调试环境搭建。首先我们在IDA所在的文件夹的dbgsrv文件夹下找到需要的调试服务器Linux_server(32位)和Linux_serverx64(64位)并复制到kali中。
docker container cp linux_server ubuntu.17.04.i386:/root/linux_server
将linux_server复制到32位容器中的/root目录下。此时我们登录容器可以看到linux_server,运行该server会提示正在监听23946端口。
调试器连接成功后我们就可以使用各种快捷键对目标程序进行调试,常用的快捷键有以下断点/取消断点F2,运行程序F9,单步跨过函数F8,单步进入函数F7,运行到选中位置F4等等。在调试模式下主要使用到的窗口有汇编窗口IDA View-EIP,寄存器窗口General registers,栈窗口Stack view,内存窗口Hex View,系统日志窗口Output window等。
三、使用Pwntools和IDA调试程序
在上一节中我们尝试了使用IDA配置远程调试,但是在调试中我们可能会有一些特殊的需求,比如自动化完成一些操作或者向程序传递一些包含不可见字符的地址,如\x50\x83\x04\x08(0x08048350)。这个时候我们就需要使用脚本来完成此类操作。我们选用的是著名的python库pwntools。pwntools库可以使用pip进行安装,其官方文档地址为http://docs.pwntools.com/en/stable/ 。在本节中我们将使用pwntools和IDA配合调试程序。
首先我们在kali中安装pwntools,安装完成后输入python进入python环境,使用from pwn import * 导入pwntools库。
将heapTest_x86的IO转发到10001端口上。
选择Debugger->Attach to process...,附加到./heapTest_x86的进程上。
回到python窗口,我们使用pwntools的recv/send函数族来与运行中的heapTest_x86进行交互。首先输入io.recv( ),我们发现原先会在shell窗口出现的菜单被读出到python窗口里了。
回想一下我们通过shell与这个进程交互的时候,输入选项后需要按回车键以“告诉”这个进程我们的输入结束了。那么在这里我们同样需要再发送一个回车,所以我们再执行io.send(' '),切换到IDA窗口就会发现EIP停在了熟悉的程序领空。这时候我们再使用IDA的快捷键就可以进行调试,随心所欲地观察进程的内存,栈,寄存器等的状态了。当然,我们也可以直接使用io.sendline( ),就可以直接在输入的结尾自动加上' '了。
当我们希望结束调试时,应该使用io.close( )关闭掉这个io。否则下一次试图attach时会发现有两个./heapTest_x86进程。在IDA中按Ctrl+F2即可退出调试模式。
配置实验环境打包如下:
链接:https://pan.baidu.com/s/1xr9n9EBs2dALOkmIFaIdcQ
密码:bcd6
以上是今天的内容,大家看懂了吗?后面我们将持续更新Linux Pwn入门教程的相关章节,希望大家及时关注。