sql server 配置管理器里为什么是32位_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

285a9d47f8dee51552f0be407ae4cb18.png

本系列教程仅针对i386/amd64下的Linux Pwn常见的Pwn手法,如栈,堆,整数溢出,格式化字符串,条件竞争等进行介绍,所有环境都会封装在Docker镜像当中,并提供调试用的教学程序,来自历年赛事的原题和带有注释的python脚本。

教程中的题目和脚本若有使用不妥之处,欢迎各位大佬批评指正。

今天是Linux Pwn入门教程第一章:环境配置,阅读用时约7分钟。

ae69ee83ae8c3fc3e98ba81dc2370b7c.gif

一、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

8601ab6f92d6dd5da45817cb5891528d.png

导入成功后使用命令docker images会看到镜像仓库中出现了一个新的镜像。

ba583c104a3d19228762f71b784c11ad.png

运行docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash

就可以以这个镜像创建一个容器,开启一个shell,并且将IDA调试服务器监听的23946端口转发到本地的23946端口。

f80ec6b43c95e49a3f71e99f115f27c0.png

通过命令docker container ls -a 我们发现容器列表里多了一个刚刚创建的容器,并且被赋予了一个随机的名字,在我的实验中它是nostalgic_raman。

647920b31cb28e89ff4ea01e73bf4c79.png

我们可以通过命令docker container rename nostalgic_raman ubuntu.17.04.amd64把这个容器重命名为ubuntu.17.04.amd64或者其他你认为合适的名字。

c0181284c601e3d16300275f5cbdba71.png

使用docker exec -it ubuntu.17.04.amd64 /bin/bash 我们可以打开目标容器的一个新的bash shell。这使得我们在后续的调试中可以在容器中启动IDA调试服务器并用socat部署Pwn题目。

5bd51b9a51f7f4c0020f0c6205113308.png

此外,可以使用docker container cp命令在docker容器内外双向传输文件等等。需要注意的是,对容器的各种操作需要在容器运行时进行,若容器尚未运行(运行docker container ls未显示对应容器),需使用命令docker start运行对应容器。此外,若同时运行多个容器,为了避免端口冲突,在启动容器时,可以将命令docker run -it -p 23946:23946 ubuntu/17.04.amd64 /bin/bash 中的第一个端口号23946改为其他数字。

二、IDA的简单使用及远程调试配置

成功搭建了Docker环境之后,我们接下来熟悉一下IDA和IDA的远程调试环境搭建。首先我们在IDA所在的文件夹的dbgsrv文件夹下找到需要的调试服务器Linux_server(32位)和Linux_serverx64(64位)并复制到kali中。

69b01acca40ab2b2a28567f5d08bff99.png

然后使用命令:

docker container cp linux_server ubuntu.17.04.i386:/root/linux_server

将linux_server复制到32位容器中的/root目录下。此时我们登录容器可以看到linux_server,运行该server会提示正在监听23946端口。

2a4db720f3abeae8683cdf67e5d1c221.png

接着我们打开32位的ida,载入一个后面会用于演示堆漏洞的程序heapTest_x86,在左侧的Functions window中找到main函数,随便挑一行代码按F2下一个断点。然后通过Debugger->Process options...打开选项窗口设置远程调试选项。

e35c3fe7df8bacd0fcb2537b82a4f3f3.png

在弹出的选项窗口中配置Hostname为kali的ip地址,Port为容器映射到kali中的端口。

e801c0b5cc5315ca11da8a4964aa6af8.png
38fea39ce9e30030c658be98c6b60a06.png

填好后点击OK,按快捷键F9运行程序。若连接正常可能提示Input file is missing:xxxxx,一路OK就行,IDA会将被调试的文件复制到服务器所在目录下,然后汇编代码所在窗口背景会变成浅蓝色并且窗口布局发生变化。若IDA僵死一段时间后跳出Warning窗口,则需要检查IDA所在机器与kali是否能ping通,容器对应端口是否映射,参数是否填错等问题。

调试器连接成功后我们就可以使用各种快捷键对目标程序进行调试,常用的快捷键有以下断点/取消断点F2,运行程序F9,单步跨过函数F8,单步进入函数F7,运行到选中位置F4等等。在调试模式下主要使用到的窗口有汇编窗口IDA View-EIP,寄存器窗口General registers,栈窗口Stack view,内存窗口Hex View,系统日志窗口Output window等。

7e300c4d42e601fb20b23fa57e67b5fe.png

切回到kali,我们会看到随着程序运行,运行调试服务器的shell窗口会显示出新的内容:

715133e72f9fed20aa21180ff803520f.png

当IDA中的程序执行完call ___isoc99_scanf或者类似的等待输入的指令后会陷入阻塞状态,F4,F7,F8,F9等和运行相关的快捷键都不生效。此时我们可以在shell中输入内容,IDA中的程序即可恢复执行。

三、使用Pwntools和IDA调试程序

在上一节中我们尝试了使用IDA配置远程调试,但是在调试中我们可能会有一些特殊的需求,比如自动化完成一些操作或者向程序传递一些包含不可见字符的地址,如x50x83x04x08(0x08048350)。这个时候我们就需要使用脚本来完成此类操作。我们选用的是著名的python库pwntools。pwntools库可以使用pip进行安装,其官方文档地址为http://docs.pwntools.com/en/stable/ 。在本节中我们将使用pwntools和IDA配合调试程序。

首先我们在kali中安装pwntools,安装完成后输入python进入python环境,使用from pwn import * 导入pwntools库。

327c71aa2981ae73c83244332c4c612b.png

使用docker exec在32位的容器中新开一个bash shell,跳转到heapTest_x86所在目录/root,查看容器的IP地址,然后执行命令socat tcp-listen:10001,reuseaddr,fork EXEC:./heapTest_x86,pty,raw,echo=0

将heapTest_x86的IO转发到10001端口上。

e4ff75c79c60c1747d222c80a6a9918e.png

我们可以看到我的容器中的IP地址是172.17.0.2。回到python中,使用io = remote("172.17.0.2

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值