首页 > 其他分享 >各种bin在多种情况下漏洞利用的理论和实践

各种bin在多种情况下漏洞利用的理论和实践

时间:2024-02-10 21:55:20浏览次数:32  
标签:bin 指向 chunk 实践 bk 漏洞 fd nextsize 指针

先看一下main_arena中的大致结构:

largebin attck

此图不完全正确,其中largebin里的chunk如果是小组中最前面的那个chunk,并且大组中只有一个小组,bk_nextsize和fd_nextsize就都指向自己,且链表当中最后一个chunk的bk和最前面的chunk的fd指针指向头部,如果是小组中非最前面的chunk,则bk_nextsize和fd_nextsize都为0

当往largebin中放入chunk的时候,会遵循以下流程:

1.首先判断放入chunk的大小范围属于哪一大组,如果此大组此前没有chunk存在那么此时fwd(虽然fwd=bck->fd,但是因为大组为空,要保证链表循环,所以fwd和bck指针一样都指向头部指针)和bck指针都指向头部指针,然后再设置放入的chunk的fd_nextsize和bk_nextsize指向自己,等待第5步设置bk指针和fd指针,如果大组里原本就有chunk存在,则进入下一步

2.准备设置遍历指针bck和fwd,将bck指向这一大组的头部指针,也就是largenbin[i],然后将fwd指针指向bck->fd

3.如果放入的chunk的size小于bck->bk(也就是这个大组当中最小的chunk),则将fwd指向头部指针,bck指向最小的chunk,接着设置其的fd_nextsize和bk_nextsize以及前后的fd_nextsize和bk_nextsize(共需设置4个指针),等待第5步设置bk指针和fd指针

4.如果放入的chunk的size小于fwd(也就是此组中最大的那个chunk)的size,则开始利用fwd遍历(fwd=fwd->fd_nextsize)直到找到能按照大小规范顺序的位置插入新的小组或fwd的size等于放入chunk的情况为止,如果是等于放入chunk的情况,则此时fwd定位成功(定位的位置为和放入的chunk的size一样大小的小组的第一个chunk的fd指针),然后再设置bck=fwd->bk指针(也就是设置bck为指向和放入的chunk的size一样大小的小组的第一个chunk的指针),等待第5步设置bk指针和fd指针。如果是按照规范顺序的位置插入一个新的小组则和第二步一样插入后设置好4个指针,等待第5步设置bk指针和fd指针

5.将放入chunk的fd指针指向fwd,bk指针指向bck,fwd->bk指向放入的chunk,bck->fd也指向放入的chunk;

总结一下,插入一个chunk之后,依据情况会改变8或4个指针,8个指针的情况是放入chunk的4个指针和前面chunk的bk和bk_nextsize以及后面chunk的fd和fd_nextsize

接着说一下漏洞部分

先说一下漏洞利用的最终结果,就是会将某一致两个地址的的数据变成某一个在largebin里的chunk的地址

接下来利用的思路就是通过修改一个largebin中的chunk1的区域,来修改他的一些信息(size)和指针(fd,bk,bk_nextsize,fd_nextsize),因为插入到largebin里主要使用的是fd和bk的nextsize指针,所以我们使其的bk_nextsize指针指向我们想写的地址-0x20,然后我们要知道现在的fwd始终指向此大组的第一个chunk,而bck等于fwd->bk,以及这里是不会检查fd和bk和bk_nextsize和fd_nextsize指针指向的chunk是否合规,所以我们可以任意修改。此时插入一个比刚刚在largebin里更大的chunk2,会在chunk1的前面插入chunk2,从而使chunk2的fd_nextsize和fd指向chunk1,bk和bk_nextsize指向chunk1原本bk和bk_nextsize指针指向的chunk,也就是bk_nextsize会指向我们想写的地址-0x20,bk会指向头部指针(如果largebin原本只有chunk1的话),然后就会将chunk2的bk_nextsize指向的chunk的fd_nextsize变为chunk2。接着而由上面那个黑字,所以我们更改chunk1的bk指针为chunk2,就能更改bk指针指向的chunk的fd指针为chunk2

总结一下:插入的时候会把几个指针变为chunk2,1.chunk1的bk_nextsize 2.chunk1的bk_nextsize指向的chunk的fd_nextsize指针(程序正常的话应该是指向最小的chunk的fd_nextsize) 3.chunk1的bk指针指向的chunk的fd指针(程序正常的话应该是让头部指针的fd指针指向chunk2)4.chunk1的bk指针

而我们就是利用其中的2和3两点造成了任意地址写入一个chunk地址值,当然 这是创建一个小组的情况,还有其他情况例如放入已存在的小组的情况和在中间创建小组的情况也可以利用,只要被构造的chunk和新放入的chunk有联系就行,例如将新插入的chunk即将要生成的fd指针指向的chunk的bk指针改为要写入的地址-0x10,还有如新插入的chunk如果比最小组还小的话,就修改最大的那个chunk的bk_nextsize为要写地址的-0x20

Large bin attack利用条件

1.可以修改一个large bin chunk(如上面所说的chunk1)的data (UAF)

2.在放入新的chunk进入largebin的时候,要保证新进来的chunk和chunk1有联系,也就是会相互修改指针

tcachebin attack

tcachebin中有几个性质以及漏洞点

1.64位下tcachebin中有64个组,64位下记录了size从0x20到0x410的chunk,每个组相差0x10,大于0x410的chunk会先放入unsortedbin中

32位下目前只知道不能存放8结尾的chunk

2.tcachebin中每个组最多有7个chunk,当一个组中chunk满了之后又有新的chunk想要进来,会依据范围进入fastbin或unsortedbin

3.tcachebin只有fd指针,且tcachebin的头部指针的fd指向在tcachebin中的第一个chunk,而最后一个chunk并没有指向头部指针(和fastbin一样)

4.当要分配时,例如要求分配size1的chunk,并且如果此时tcachebin相应的size组为空时,就会按照低版本malloc的顺序规则去其他bin里查找,并且返回所有精确的size1(不会返回非size1精确大小的chunk来填充tcachebin)填充到tcachebin直到满7个或返回所有的size1大小的chunk。接着进入到tcachebin里,然后再在tcachebin里取出。

5.Doublefree 在2.27~2.29版本中tcachebin相对于fastbin的安全检查更少,甚至能直接利用double free连续free(a)多次,相比于fastbin要在两次连续的free(a)中穿插一个free(b)更简单。

6.tcache house of spirit 此漏洞是因为tcachebin(目前只确定2.27有这个漏洞)在free一个chunk的时候,只会检测这个chunk的size是否存在,因此可以伪造一个fake chunk,free它以此来让他进入到bin链当中。

7.tcache stashing unlink attack 此类型的利用中,calloc(用此函数获取的malloc不会从tcachebin中取得)的chunk的fd指针指向的下一个chunk(此chunk要求size要存在且合法,也就是要大于等于0x20)的bk指针必须指向calloc的chunk才会被填充进入tcache,只有一个chunk需要检测,后面的chunk在第一个chunk检测成功之后可直接进入tcachebin

fastbin attack

先说一下性质:

1.fastbin有10个组,但只有前7个被用来储存chunk(32位是0x100x40,以0x08间隔;64位是0x200x80,以0x10间隔),每个链表可以有无限chunk

2.fastbin只有fd指针,且fastbin的头部指针的fd指向在fastbin中的第一个chunk,而最后一个chunk并没有指向头部指针

要让fakechunk进入到fastbin里,需要满足以下条件

1、fake chunk 的 ISMMAP 位不能为 1,因为 free 时,如果是 mmap 的 chunk,会单独处理
IS_MAPPED,记录当前 chunk 是否是由 mmap 分配的,这个标志位位于size低二比特位

2、fake chunk 地址需要对齐, MALLOC_ALIGN_MASK
因为fake_chunk可以在任意可写位置构造,这里对齐指的是地址上的对齐而不仅仅是内存对齐,比如fake_chunk的pre_size所在地址就应该位0xXXXX0或0xXXXX8。(32位和64位相同)

3、fake chunk 的 size 大小需要满足对应的 fastbin 的需求,同时也得对齐
fake_chunk如果想挂进fastbin的话构造的大小就不能大于0x80,关于对齐看第四点,并且在确定prev_size的位置后size所在位置要满足堆块结构的摆放位置

4、fake chunk 的 next chunk 的大小不能小于等于 2 * SIZE_SZ(在 32 位系统上,SIZE_SZ通常是 4 字节,而在 64 位系统上,则是 8 字节),同时也不能大于等于av->system_mem,即128kb
fake_chunk 的大小,大小必须是 2 * SIZE_SZ 的整数倍。例如64位程序的size为0x48的话就会报错。32 位系统中,SIZE_SZ 是 4(32位程序下在用malloc创建的时候,无法创建0x18size的chunk,但是可以自己创造一个0x18size的fakechunk,但是在2.27版本之后通过实践得知似乎不能存放8结尾的chunk,会报错invalid size,不知道为什么);64 位系统中,SIZE_SZ 是 8。最大不能超过av->system_mem,即128kb。

5、fake chunk 对应的 fastbin 链表头部不能是该 fake chunk,即不能构成 double free 的情况
这个检查就是fake_chunk前一个释放块不能是fake_chunk本身,如果是的话_int_free函数就会检查出来并且中断。

标签:bin,指向,chunk,实践,bk,漏洞,fd,nextsize,指针
From: https://www.cnblogs.com/fusan/p/18013055

相关文章

  • 42种常见网站漏洞
    42种常见网站漏洞,让你水得快速,水得专业转载:零漏安全2024-01-1012:29发表于河南免责声明:由于传播、利用本公众号"零漏安全"所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责,公众号"零漏安全"及作者不为此承担任何责任,一旦造成后果请自行承担!如有侵权......
  • 策略模式的代码实践示例
    一、定义策略模式,针对每一个不同的类型,调用具有共同接口的不同实现类,从而使得它们可以相互替换。策略模式,针对实现同一接口的不同的类,采用不同的策略。比如,面对高级会员、初级会员会采用不同的折扣。策略模式,可以避免大量的if和else。二、角色策略模式涉及到三个角色:●......
  • Asp-Net-Core学习笔记:WebApi开发实践
    前言用AspNetCore做Api开发也有一段时间了,正好年底在做总结,做一个WebApi开发实践笔记。暂时想到的一些技术关键词,同时也作为本文的大纲,现在对这套技术体系的了解还不够深入,以后会持续更新这个Api开发实践~身份认证:JwtBearer分页:X.PagedList缓存ResponseCacheRedis:St......
  • [LeetCode] 2641. Cousins in Binary Tree II
    Giventherootofabinarytree,replacethevalueofeachnodeinthetreewiththesumofallitscousins'values.Twonodesofabinarytreearecousinsiftheyhavethesamedepthwithdifferentparents.Returntherootofthemodifiedtree.Note......
  • Avalonia 越来越流行了,记录练手一个项目.就下载bing的图片吧
     只要有桌面需求那肯定掏出万年winform..偶然接触到了Avalonia把去年练手的项目整理了一下不知道大家练手都写什么...总的来说xaml习惯和wpf差不多.对于我这种经常写前端的后端来说.Avalonia支持css写法很省事. 技术栈Avalonia0.10.18NET7CommunityToolkit.Mvvm......
  • .net介绍以及其常见漏洞
    前言:本篇来学习.NET项目和其使用的c#的一些通用漏洞1.0.NET的基础介绍.NET是由微软(Microsoft)开发的一个用于构建各种应用程序的开发平台,包括Web应用程序、桌面应用程序、移动应用程序等。它是一个综合性的技术栈,提供了一系列的开发框架、工具和库,使得开发者能够使用多种编......
  • uniapp 实践二 uni-id-pages
    导入用到以上的组件。发现没办法弄到分包但是uni-id-pages这个可以弄到分包里面作者的建议:如果改动不大,那么每次更新uni-id-pages时,在HBuilderX的对比界面对比一下就好如果改动较大,建议复制一套前端页面到自己工程的pages目录下,pages.json里只引用根目录pages下的页面,不引......
  • uniapp 实践一
    ┌─uniCloud云空间目录,支付宝小程序云为uniCloud-alipay,阿里云为uniCloud-aliyun,腾讯云为uniCloud-tcb(详见uniCloud)│─components符合vue组件规范的uni-app组件目录│└─comp-a.vue可复用的a组件├─utssdk存放uts文......
  • 汇集全球50+供应链领域企业专家,创新论坛带来最新趋势和实践
    过去的几年中,随着世界范围内经济、社会和政治上的巨大变化,供应链管理已成为企业和经济成功的关键因素。面对不断增长的全球挑战,包括经济波动、技术变革、政治不确定性,以及环境可持续性的压力,构建一个创新、高效且可持续的供应链体系变得尤为重要。由DSG数创时代主办的2024SIE全球供......
  • JUnit实践教程——Java的单元测试框架
    前言大家好,我是chowley,最近在学单元测试框架——JUnit,写个博客记录一下!在软件开发中,单元测试是确保代码质量和稳定性的重要手段之一。JUnit作为Java领域最流行的单元测试框架,为开发人员提供了简单、灵活和强大的测试工具。JUnit1.简介JUnit是一个开源的Java单元测试框架,最初由......