过来吧 > 杂谈 > 正文

​堆溢出的常见利用手段 堆放的堆

时间:2024-02-15 14:28

来源:过来吧

点击:

堆溢出的常见利用手段 堆放的堆


漏洞简介


glibc库中存在着unsafe unlink漏洞。主要原理是利用释放块时存在的安全检查缺陷,通过修改堆块的元数据信息,从而在free时修改堆指针。利用这一漏洞可以完成一次任意写操作。


本文以libc-2.27.so为例,结合一道pwn题目来介绍利用过程。


本文涉及相关实验:利用溢出改写地址

https://c.quk.cc/2/h4/az1bwdx1lhf.jvm3

(本节课主要讲解objdump命令的使用和c语言函数调用约定,学会利用栈溢出漏洞改写函数指针变量和覆盖返回地址。)

程序checksec检查

题目源码分析


主函数是菜单,choose_action只是简单读入整数以进行选择,此处不再赘述。


squeeze函数用于申请新的块,并调用自定义make_component函数读入用户输入。其中your_palette及相关变量定义如下:


make_component函数定义如下。该函数根据传入的长度,逐字节读入用户输入,检测到换行符或是达到最大长度后即把最后一个字符改为’\0’。


乍看之下没有什么问题,但是当读入的数据达到最大长度后会将ptr[len]处的数据修改为0,而这一地址属于理想的修改范围之外,因此产生off-by-null的漏洞。


mix函数用于修改已经申请好的chunk,可以重新设置某一个palette的color段以及ingredient段。


wash函数free掉了一个已经申请过的chunk,这也是unsafe unlink漏洞利用之处。这里需要注意的一点是标红处对数组进行赋NULL,因此排除了uaf的情况。


inspect函数用于shell获取。当检查到全局变量secret_button不为0后,将调用/bin/sh。那么本题的目标至此已经显而易见了:通过wash函数的free触发漏洞,并通过mix函数修改全局变量secret_button为非零值,然后执行inspect函数来getshell。

相关知识补充


unsafe unlink漏洞是指由于程序设计不当、用户恶意输入,堆管理器在释放块的时候将前一个正在使用的块也视为已经被释放的块,从而也将它纳入空闲块管理中。以64位系统中glibc-2.27为例,一个chunk块的结构如下:



A区域(8字节):mchunk_prev_size



B区域(8字节):mchunk_size


C区域(8字节):fd


D区域(8字节):bk


E区域(8字节):fd_nextsize


F区域(8字节):bk_nextsize


l 其中B区域比较特殊。B区域用于表示该chunk的大小(单位为字节)。由于chunk必须16字节对齐,因此B区域的低3bits被设置为flag位,不影响chunk的大小。其中最低1bit为PREV_INUSE位,当设置为0时表示前一个chunk处于空闲状态。


l A区域用于表示前一个相邻的空闲chunk的大小。当PREV_INUSE置1时,这一区域被前一个chunk使用(称之为空间复用);当PREV_INUSE置0时,该区域才被这一个chunk使用,用于在free时获取前一个chunk的地址。


l B区域也是该chunk的元数据区域,从C区域开始为用户实际使用的数据区。当malloc获得块的时候,返回的指针就是指向C区域的。


l 而当该块处于空闲状态时,C、D区域用于构造空闲块的双向链表。C区域会被堆管理器自动设置为前向空闲块的地址,D区域被设置为后向空闲块的地址。对于large chunk而言,C、D区域用于指向大小相同的空闲块,E、F区域用于指向大小不同的空闲块。


glibc-2.27中对unlink的实现如下:


unlink是在释放某一块时调用的“函数”,本意是将空闲块进行合并形成双向链表,提高空间利用率,但是在安全检查方面存在一些漏洞。在利用过程中,需要绕过两处安全检查(标红和标蓝处)。简单来说,unlink的核心是检查当前块是否是合法的空闲块。其中参数P表示当前检查的、准备合并的“空闲”块。


l 标红处用于检查P的大小是否和下一块的prev_size段相等(即检查此块的B区域表示的大小和下一块的A区域的值是否相等)。


l 标蓝处用于检查P的前向块的后向块与P的后向块的前向块是否都指向P自己。


当两处检查均通过时,堆管理器会执行FD->bk = BK与BK->fd = FD,从而将P加入到双向链表中。因此,本题的核心在于如何绕过这两处检查。

漏洞利用


利用思路大致如下:


1、申请3个块(姑且称之为chunkA、chunkB、chunkC)。


2、修改chunkA,在其中精巧地布置出一个chunkD。


3、释放chunkB,并让堆管理器unlink chunkD。


4、修改chunkA,写入任意地址。


5、修改chunkA,实现任意地址写。


首先定义一个operate函数,用于处理各类请求信息,将squeeze、wash、mix重命名为经典的ADD、FREE、SET。接下来逐步进行利用:


1、申请3个块(姑且称之为chunkA、chunkB、chunkC)。


使用gdb查看内存情况:



之所以使用3个chunk,是为了防止free chunkB的时候其与top chunk合并。


然后以chunkA为例,查看它的内容:



可见该chunk大小为0x500、前一个chunk处于使用中。(之后的截图为多次运行程序所截,由于开启了ASLR,所以堆的地址会发生改变,但内容是一致的,不影响阅读)


2、修改chunkA,在其中精巧地布置出一个chunkD。


chunkD是在chunkA内由用户的输入构造出的特殊的fake chunk,我们希望unlink把这个块视作一个合法的空闲块。因此首先需要绕过unlink对chunk_size的检查。这里需要注意,用户申请的chunkA指向chunkA的data段,我们可以将这里当做chunkD的元数据区进行填充。由于chunkA->color大小为32字节,那么对应了chunkD的A、B、C、D区域(前文所述)。如何填充这四个区域呢?


首先关注B区域。由于chunkD是chunkA内的一块,且其元数据区的地址在chunkA的数据区,所以它的大小应该是chunkA-16,即0x500-0x10=0x4f0。为了防止chunkA也被unlink掉,这里将前一块标记为使用中,所以B区域填充0x4f1。那么A区域是属于chunkA的,可以填充任意值,此处填0。


C、D区域是chunkD的fd、bk指针,是漏洞利用的关键。这里注意到unlink的第二道检查就是检查这里的fd->bk和bk->fd是否都等于chunkD的元数据区地址。这里的关键是chunkD的元数据区地址恰好等于chunkA的数据区地址,而chunkA的数据区地址正好是malloc chunkA时获得的,其保存在全局变量your_palette[0]中。


由于程序没有开启PIE,所以可以通过objdump直接获取全局变量的地址。



这里就利用了unlink中的一个漏洞:它默认fd和bk都指向了合法的chunk地址,所以fd->bk和bk->fd只是简单地将fd、bk视作一个chunk,然后取偏移量24字节和16字节,并将其视为合法的bk和fd。而如果fd、bk是用户可控的,那么只需要将fd设置为your_palette地址-24、将bk设置为your_palette地址-16,那么fd->bk和bk->fd都会指向your_palette[0],即为chunkA的data段,即为chunkD的元数据地址,从而实现了绕过检查。此时0x1160670为chunkD的元数据地址,chunkD的fd、bk被设置为0x6020c0-24=0x6020a8与0x6020c-16=0x6020b0。



接下来需要填充chunkD的ingredient区域。这里需要注意的是要在空间复用区(即chunkB的A区域)填充padding与chunkD的大小。这里需要完全填充ingredient区域,以触发前文提到过的off-by-null漏洞,从而将chunkB的PREV_INUSE位置0,使得chunkD被视作空闲块。



可见0x1160b68处的0x501被修改为0x500,且其prev_size段被设置为0x4f0。


3、释放chunkB,并让堆管理器unlink chunkD。


释放掉chunkB后,查看your_palette内容,可见your_palette[0]被设置为0x6020a8,这是因为unlink成功,执行了BK->fd = FD。这里注意到,chunkA仍然是一个使用中的chunk,但它指向了全局数据区。那么此后调用mix时,将向此处写入新的数据。这里需要注意到,写入的第24-32字节会重新覆盖your_palette[0],也就是说可以再次指向另一个地址,而这个地址就是用户任意写入的了。



4、修改chunkA,写入任意地址。


这里直接写入secret_button的地址,并调用mix函数。



5、修改chunkA,实现任意地址写。


secret_button只需非0即可,这里写入1。



最后简单调用inspect即可getshell。


完整exp代码

说明


编译源程序:gcc unsafe_unlink.c -no-pie


相关标签:

相关推荐

​颜真卿的《祭侄文稿》 颜真卿真迹《祭侄文稿》

​颜真卿的《祭侄文稿》 颜真卿真迹《祭侄文稿》

颜真卿的《祭侄文稿》 颜真卿真迹《祭侄文稿》 祝勇 《祭侄文稿》是一篇椎心泣血的文稿,文字包含着一些极度悲痛的东西,假如我们的知觉系统还没有变得迟钝,那么它的字字句句...

2024-02-15 14:26:25

​脸型妆容分析图怎么画 脸型类别及修饰情况画图

脸型妆容分析图怎么画 脸型类别及修饰情况画图 Hi~美少女们大家好呀~ 最近有不少姐妹在后台留言说,化妆干货都有认认真真学,但是 一上手就是各种翻车 …… 很有可能你只注意到了...

2024-02-15 14:24:12

​河南科技学院与河南工程学院分析对比

​河南科技学院与河南工程学院分析对比

河南科技学院与河南工程学院分析对比 关于河南科技学院与河南工程学院两所河南省公办全日制普通本科院校哪个更好的问题,我整理了两所学校的资料数据,从以下十二个方面进行分...

2024-02-15 14:21:55

​尿酸偏高医生建议复查 尿酸高医的好吗

尿酸偏高医生建议复查 尿酸高医的好吗 朋友们, 大家体检的时候, 有没有发现自己 一不留神就 尿酸高 了? 据统计,中国约有1.2亿高尿酸人群,也就是说差不多每10个人中就有1个人...

2024-02-15 14:19:40

​世界中长跑纪录究竟有多快有多变态

世界中长跑纪录究竟有多快有多变态 跑步的目标 对于跑步的人来说,每个人的追求和目标都不一样,有人只是想通过跑步来锻炼身体,有的人出于好胜心对于跑步成绩有要求,有的人...

2024-02-15 14:17:25

​植发际线很贵吗 植发发际线多少价钱

植发际线很贵吗 植发发际线多少价钱 “相亲失败?形象欠佳?你离成功就差一个发际线!”“上午植发,下午上班”“一次植发,终身受益”……地铁、公交、电梯里,大幅抢眼的植...

2024-02-15 14:15:10

​聪明的人,都避开了3个“选择陷阱”

​聪明的人,都避开了3个“选择陷阱”

聪明的人,都避开了3个“选择陷阱” 《三体》中有一个词,叫降维打击。 它指的是,如果一个人遇到的问题,与认知在同一纬度,他就无法解决这个问题。 而当认知处于更高水平时,...

2024-02-15 14:12:56

​四大名著的人生哲理 四大名著总结人生

​四大名著的人生哲理 四大名著总结人生

四大名著的人生哲理 四大名著总结人生 有人说,四大名著里,藏着中国人一生的修行。 年少时,看的是光怪陆离和爱恨情仇; 长大后,才发现书中道尽了人生最好的活法。 01 即使“...

2024-02-15 14:10:40

​经侦大队电话号码 刑侦大队电话

经侦大队电话号码 刑侦大队电话 21世纪经济报道 见习记者 王巍 北京报道 日前,多地反诈中心披露信息显示,全国各地均有市民报警称,接到冒充电商客服要求转账的事件。90后的李女...

2024-02-15 14:08:26

​朋友的酒dj版(朋友的酒DJ版伴奏)

朋友的酒dj版(朋友的酒DJ版伴奏) 视频加载中…...

2024-02-01 18:18:35

​口+大是什么字(口大是什么字呀)

口+大是什么字(口大是什么字呀) ◎李欣忆 冯雪梅 科技日报记者 操秀英 2月13日,中国石油西南油气田公司位于蓬莱气区的蓬深6井顺利完钻并成功固井,井深最深达到9026米,刷新亚...

2024-02-01 18:16:20

​fig-al10是什么型号(fig-al10是什么型号格机)

​fig-al10是什么型号(fig-al10是什么型号格机)

fig-al10是什么型号(fig-al10是什么型号格机) 一款华为的全面屏手机出现在工信部之中,这款FIG-AL10采用了明显的华为家族式设计,我们推测这款手机为华为畅享7S,它很可能在年底时分...

2024-02-01 18:14:05

​人力资源从业资格证书怎么考(人力资源从业资格证书考试时间)

​人力资源从业资格证书怎么考(人力资源从业资格证书考试时间)

人力资源从业资格证书怎么考(人力资源从业资格证书考试时间) 可以从事员工招聘选拔、绩效考核、薪酬福利管理、劳动关系协调等工作。人力资源管理师证书的用处一直是非常大的...

2024-02-01 18:11:50

​拼多多刚下单怎么退款(先用后付就是个坑)

​拼多多刚下单怎么退款(先用后付就是个坑)

拼多多刚下单怎么退款(先用后付就是个坑) 老师在身边——「每日一答」 拼多多如何退货(一)? 有的叔叔、阿姨们喜欢使用拼多多购物,在购物的过程中难免会有不满意退换货的...

2024-02-01 18:09:35

​windows任务管理器快捷键(打开电脑运行任务的快捷键)

​windows任务管理器快捷键(打开电脑运行任务的快捷键)

windows任务管理器快捷键(打开电脑运行任务的快捷键) 任务管理器是查看资源占用情况以及管理后台进程的地方,有时候我们能够通过任务管理器去快速对程序进行相关设置,而快速...

2024-02-01 18:07:21

​张悬吴青峰(张悬吴青峰我是一只牡蛎)

张悬吴青峰(张悬吴青峰我是一只牡蛎) 吴青峰是中国台湾省的男歌手,出道以来多次被曝光。外界非常关注吴青峰的女朋友是谁。日前,网上曝光了吴青峰大学初恋女友张悬的照片。...

2024-02-01 18:05:06

​学不进去怎么办总想玩手机(学不进去又很焦虑怎么办)

学不进去怎么办总想玩手机(学不进去又很焦虑怎么办) #家长百问百答# 中山的沈妈妈说, 孩子因为被爸爸说在家不好好学习,不肯去上学了,就在家玩手机,已经三天了。 现在说什...

2024-02-01 18:02:51

​郎朗吉娜合约曝光(郎朗吉娜最新消息)

郎朗吉娜合约曝光(郎朗吉娜最新消息) 郎朗吉娜的合同在热搜中曝光,网友们不禁好奇,这对刚结婚的小夫妻发生了什么?有人甚至猜测婚姻是合同吗?郎朗妻子吉娜发帖:忍不住提...

2024-02-01 18:00:36

​小规模纳税人企业所得税怎么征收(小规模纳税人企业所得税怎么征收2021)

小规模纳税人企业所得税怎么征收(小规模纳税人企业所得税怎么征收2021) 一、所得税: 2021年新出了优惠政策,小微企业和个体户所得税减半征收。所得税税率分为三个档次:1、基...

2024-02-01 17:58:22

​王者荣耀昵称男霸气冷酷(王者荣耀昵称男霸气冷酷二个字)

​王者荣耀昵称男霸气冷酷(王者荣耀昵称男霸气冷酷二个字)

王者荣耀昵称男霸气冷酷(王者荣耀昵称男霸气冷酷二个字) [海峡网] 王者荣耀怎么取名比较霸气?男生玩家都会想要一个霸气的名字,以下是王者霸气男生名字大全,取名困难症的玩...

2024-02-01 17:56:07