热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

2015第一届强网杯

第一届强网杯pwn题shellman首先看看题目的大致信息,看看哪里会出现问题。list函数,首先可以看到一些关于内存块的信息,其中堆表的
第一届强网杯pwn题

shellman

首先看看题目的大致信息,看看哪里会出现问题。

list函数,首先可以看到一些关于内存块的信息,其中堆表的基址在bss段,在堆中有一个类似于堆块的结构,三个64位数据作为一个堆块的标识,第一个数据位应该是标识当前是否有堆块,为1则表示有堆块,为0则没有,第三个数据应该就是这个堆块标识对应的堆的地址,可以从该地址直接访问堆中的数据。其中堆块数目也存放在bss段,以及最多只能申请256个堆块这些,都是一目了然的。

一般来说,new或者create这些新建堆块函数就是用来了解堆的详细结构,以及堆中的数据的。

这里可以很明显的看到,在刚才所说的bss段分别放了什么,其中堆块标识的第二个数据就应该是堆块的大小,不过是用户申请的大小,并不是堆块的真实大小。

而堆块中的内容很简单,就是用户输入的数据,按照固定长度写入堆块。

还有一个注意点就是,堆块长度不能超过1023字节,这可能会导致某些攻击方式不能用。

这个题目的问题就出现在edit函数中,个人觉的这个漏洞其实还是不容易发现的,虽然很简单。

问题主要是选择堆块要进行修改时,在把新的数据读入堆块中时,并未限制读入的长度,而是用户输入多长就读入多长,这就造成了堆溢出。

堆块释放一般就是漏洞的多灾区,这里同样有一个问题,堆块释放后指针没有清零,可能会造成UAF,不过由于堆表的其他数据都清零了,并不具有方便的利用条件,而且本题的堆溢出已经足以getshell,就没必要花精力去想这方面了。

程序的基本情况了解了,程序的问题也发现了,接下来就是通过GDB和脚本尝试利用来getshell。

本题的利用方式其实很简单,由于堆中的数据过于简单,而且程序本身没有开启针对于堆的保护措施,所以我们尝试了两种思路:

第一种:fast bin伪造

大致思路就是通过堆溢出伪造fast bin链,伪造出一个不存在的fast bin块,并将它指向任意地址。

这个很简单,首先申请两个fast bin大小的块,大小无所谓,释放第二个,通过第一个溢出到第二个,修改指向下一个的指针为我们的堆表地址,当我们第二次申请该大小的块时,就获得了位于堆表地址的堆块,当修改堆表第三个数据位为动态库函数got地址时,再次list就会泄露出函数真实地址,从而可以获得任意函数地址,也就能通过一定的构造getshell。

图中的时释放第二个堆块后的堆表,堆块,以及bins中的情况,可以看到,我们可以通过堆溢出很轻易的修改fast bin中的内容。

这时候就很明显了,我们成功的修改了fast bin链中的信息,接下来通过两次申请内存就可以获得堆表中的地址,还可以造成任意修改。

接下来就是一般的套路了,这里就不再过于详细的叙述了,主要就是利用了这个程序对输入进行处理的一个函数,修改成system,通过输入"/bin/sh\n"来getshell。

第二种:small bin的unlink攻击

unlink攻击大家都很清楚,任意地址写,我们通过堆溢出来伪造堆块造成unlink,跟上面的思路一样,也是为了获得堆表地址的堆块,只能写一个地址,所以我们就选择堆表中的堆块地址,将其覆盖为堆表地址,也就是相当于获得了一个位于堆表的块。

这是伪造前的堆中的数据,我们所要覆盖的地址就是0x6016d0,而图中黄色的部分就是我们需要构造的部分。

我们构造的内容很简单,就是根据chunk的复用,以及在查看前一个块的缺陷,我们在原来的堆中伪造一个小一点的块,这样在释放第二块的时候,就会查看前一块是否空闲,然而只发现了我们伪造的前一块,标识位被置为了空闲,所以触发unlink合并。

这里需要注意的是,Unlink攻击时需要绕过检查,假设我们要写入的地址是point,前一块的前指针=point-0x18,后指针=point-0x10,就可以绕过unlink检查。

我们成功获得了位于堆表处的堆块,接下来只需要通过edit修改就可以进行正常利用了。

imdb

先看一下程序,查询movies和TV的,可以添加TV,Movie,也可以删除,可以查看这些,也就是一般的pwn题的基本逻辑,为了构造出可以利用的简单漏洞。

简单看一下程序的主要功能,跟一般的堆利用题目大差不差,按某种数据结构建立堆块,根据位于bss段的堆表遍历堆块,释放堆块这些。

本题的问题就是UAF,删除所有同名堆,但只清零了一个指针。

接下来我们看一下程序的细节,以便于我们进行利用。

Movie堆块在有一个附加的堆块Actor,大小可任意,且内容只有用户输入,不出意外的话,这里我们可以通过这个Actor块伪造Movie或者TV块进行利用。TV块中没有其他块,可以用于申请出我们将要处理的内存,也可以防止bin中的块被合并。

show函数中,通过的是虚函数进行的遍历,也就是堆块中有一个函数指针,这个指针用来打印堆块中内容。

堆块通过名称对块进行查询。

对程序有了大致的了解之后,我们就可以开始进行利用了,我们的首要任务是泄露出库函数的真实地址,用的方法就是通过Actor堆,可以分为两种思路进行泄漏:

第一种:

通过Movie大块和Actor块之间的大小之差,在Actor之后在安排一个堆块,恰好使得通过Actor伪造的Movie中的虚表指针恰好可以访问到Actor之后的块中的内容,由于是通过指针访问,所以可以造成任意地址读,这样就可以泄露出库函数地址。

用黄色标注出来的就是我们的Actor伪造的Movie块,当show函数通过堆表遍历时,会认为该块是一个Movie块然后就会调用堆表函数打印Actor中的信息,可以看出,堆表函数要去查看的地址正好位于下一个块中,因此,我们就可以任意设定这个地址,来泄漏库函数地址。

第二种:

这一种相对来说就很寻常而且稳定简单,不需要关注堆块大小,由于我们伪造了Movie块,就干脆把它的Actor指针同时写入该块中,就不需要下一块来做辅助了。

不过相比于第一种方法的缺陷就是,每次进行泄漏都需要对堆环境进行铺垫,而第一种只需将辅助块释放后再申请就可以无限泄漏了。

统一说一下对堆环境的铺垫:

首先申请三个TV块,同名块,然后释放,这样堆表中就会有两个可以利用的堆指针,第一个作为Movie,第二个就指向Actor,这样才使得我们的泄漏有可能。

如果不希望释放同名块后堆块被合并,申请第四个堆块不释放即可。

泄露完地址之后就需要想办法getshell,这里我们依然通过Actor伪造的Movie块来进行劫持程序流。

删除C++对象后,会调用虚函数,所以很显然,我们的Actor伪造的Movie就是一个对象,而它的虚表函数是我们伪造的,如果写上one-gadget地址,就可以直接getshell。

还有其他的一些思路,不过在本地都不能正确获得shell,所以不再详细描述,总之,本题的泄漏以及利用思路,都是通过Actor块伪造Movie块,并任意指定虚函数,然后通过各种调用虚函数的方法来getshell。

注:

题目以及解题脚本:https://github.com/LJRosemary/ctf

转:https://www.cnblogs.com/clingyu/p/8646916.html



推荐阅读
  • 微软头条实习生分享深度学习自学指南
    本文介绍了一位微软头条实习生自学深度学习的经验分享,包括学习资源推荐、重要基础知识的学习要点等。作者强调了学好Python和数学基础的重要性,并提供了一些建议。 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文主要解析了Open judge C16H问题中涉及到的Magical Balls的快速幂和逆元算法,并给出了问题的解析和解决方法。详细介绍了问题的背景和规则,并给出了相应的算法解析和实现步骤。通过本文的解析,读者可以更好地理解和解决Open judge C16H问题中的Magical Balls部分。 ... [详细]
  • 本文介绍了Linux系统中正则表达式的基础知识,包括正则表达式的简介、字符分类、普通字符和元字符的区别,以及在学习过程中需要注意的事项。同时提醒读者要注意正则表达式与通配符的区别,并给出了使用正则表达式时的一些建议。本文适合初学者了解Linux系统中的正则表达式,并提供了学习的参考资料。 ... [详细]
  • Go Cobra命令行工具入门教程
    本文介绍了Go语言实现的命令行工具Cobra的基本概念、安装方法和入门实践。Cobra被广泛应用于各种项目中,如Kubernetes、Hugo和Github CLI等。通过使用Cobra,我们可以快速创建命令行工具,适用于写测试脚本和各种服务的Admin CLI。文章还通过一个简单的demo演示了Cobra的使用方法。 ... [详细]
  • 十大经典排序算法动图演示+Python实现
    本文介绍了十大经典排序算法的原理、演示和Python实现。排序算法分为内部排序和外部排序,常见的内部排序算法有插入排序、希尔排序、选择排序、冒泡排序、归并排序、快速排序、堆排序、基数排序等。文章还解释了时间复杂度和稳定性的概念,并提供了相关的名词解释。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • 本文介绍了设计师伊振华受邀参与沈阳市智慧城市运行管理中心项目的整体设计,并以数字赋能和创新驱动高质量发展的理念,建设了集成、智慧、高效的一体化城市综合管理平台,促进了城市的数字化转型。该中心被称为当代城市的智能心脏,为沈阳市的智慧城市建设做出了重要贡献。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 目录实现效果:实现环境实现方法一:基本思路主要代码JavaScript代码总结方法二主要代码总结方法三基本思路主要代码JavaScriptHTML总结实 ... [详细]
  • CSS3选择器的使用方法详解,提高Web开发效率和精准度
    本文详细介绍了CSS3新增的选择器方法,包括属性选择器的使用。通过CSS3选择器,可以提高Web开发的效率和精准度,使得查找元素更加方便和快捷。同时,本文还对属性选择器的各种用法进行了详细解释,并给出了相应的代码示例。通过学习本文,读者可以更好地掌握CSS3选择器的使用方法,提升自己的Web开发能力。 ... [详细]
  • 推荐系统遇上深度学习(十七)详解推荐系统中的常用评测指标
    原创:石晓文小小挖掘机2018-06-18笔者是一个痴迷于挖掘数据中的价值的学习人,希望在平日的工作学习中,挖掘数据的价值, ... [详细]
  • sklearn数据集库中的常用数据集类型介绍
    本文介绍了sklearn数据集库中常用的数据集类型,包括玩具数据集和样本生成器。其中详细介绍了波士顿房价数据集,包含了波士顿506处房屋的13种不同特征以及房屋价格,适用于回归任务。 ... [详细]
  • Windows7企业版怎样存储安全新功能详解
    本文介绍了电脑公司发布的GHOST WIN7 SP1 X64 通用特别版 V2019.12,软件大小为5.71 GB,支持简体中文,属于国产软件,免费使用。文章还提到了用户评分和软件分类为Win7系统,运行环境为Windows。同时,文章还介绍了平台检测结果,无插件,通过了360、腾讯、金山和瑞星的检测。此外,文章还提到了本地下载文件大小为5.71 GB,需要先下载高速下载器才能进行高速下载。最后,文章详细解释了Windows7企业版的存储安全新功能。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
author-avatar
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有