前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >堆栈溢出渗透实战-part1

堆栈溢出渗透实战-part1

作者头像
光明SAMA
发布2019-07-24 10:35:12
1.1K0
发布2019-07-24 10:35:12
举报

堆栈溢出技术是渗透技术中的大杀器之一,主要分为堆溢出和栈溢出两种,堆栈溢出的原理是利用软件在开发时没有限制输入数据的长度,导致向内存中写入的数据超出预分配的大小从而越界,越界部分覆盖了程序的返回指针,使程序脱离正常运行流程而执行恶意代码。本次实战主要为栈溢出的入们级练习,联系环境选择了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的密码和下一个任务的可执行文件

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-05-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 吾生也有涯IT也无涯 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档