堆栈溢出渗透实战-part1

堆栈溢出技术是渗透技术中的大杀器之一,主要分为堆溢出和栈溢出两种,堆栈溢出的原理是利用软件在开发时没有限制输入数据的长度,导致向内存中写入的数据超出预分配的大小从而越界,越界部分覆盖了程序的返回指针,使程序脱离正常运行流程而执行恶意代码。本次实战主要为栈溢出的入们级练习,联系环境选择了vulnhub上的Stack Overflows for Beginners: 1这个靶机,此靶机共设置了5个flag,每个flag对应了一个用户名,每拿到一个flag就会得到下一个任务对应用户名的密码,完成所有任务可以拿到root权限。

(下载地址:https://download.vulnhub.com/stackoverflow/IntroToStackOverflow.ova)

0x00 Level0

虚拟机是一个kali linux,处始用户是level0,密码level0

登陆系统后,查看目录下有2个相关的文件,一个是名为levelOne的可执行文件,另一个是同名的C语言源文件,看来第一个任务为了降低难度已经把源代码给出来了。

查看源代码,可以看出作者声明了两个变量,一个为long类型的变量,另一个为32字节的char类型变量。随后调用了strcopy函数,将传递进来的参数直接copy到了buf中,并没有检测传入的数据长度,看来溢出的入口就是这里了。往下看后面还有一个判断,如过key的值为0x42424242,会得到一个uid=1001的shell,前面已经把key的值写死为12345678了,那我们只能通过溢出将其原始值覆盖。

随便给一个参数试试

接下来请出神器edb-debugger,这是一款linux下的图形界面反汇编神器,通过反汇编及动态调试就可以精确定位我们需要覆盖的地址。这里用AAAABBBB做为输入参数

分析一下汇编代码,在这里可以找到给key赋值的代码,将12345678写到了ebp-1c这个地址上,ebp当前值为ffffd338,再减去1c,等于ffffd31c

点击执行下一行代码,可以发现ffffd31c的值已经为12345678了。

接下来在call levelOne!strcpy的下一行处设置断点并执行,可以看到AAAABBBB已经被copy到ffffd2fc处并且依次向后写入,只要令输入参数足够长,就可以将ffffd31c的值覆盖。另外可以看出字母B的编码为42,所以用字母B覆盖ffffd31c就可以达到目的,那么从行数上直接计算出一共需要填充8*4个A字符,4个B字符即可。

根据上面得到的信息编写一个简单的python脚本,用来填充数据,使栈溢出。

运行levelOne并传递填充字符,key值变为42424242,成功得到了level1用户的shell

在/home/level1目录下得到了level1的密码和下一个任务的可执行文件

本文分享自微信公众号 - 吾生也有涯IT也无涯(UnlessITSkill)

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2019-05-06

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

扫码关注云+社区

领取腾讯云代金券