好好说话之Tcache Attack(2):tcache dup与tcache house of spirit
这篇文章介绍了两种tcache的利用方法,tcache dup和tcache house of spirit,两种方法都是用how2heap中的例题作为讲解。由于tcache attack这部分的内容比较多,所以分开几篇文章去写。例题后补,写完例题后可能会进行重新排版,内容不会少的!!!
往期回顾:
好好说话之Tcache Attack(1):tcache基础与tcache poisoning
好好说话之Large Bin Attack
好好说话之Unsorted Bin Attack
好好说话之Fastbin Attack(4):Arbitrary Alloc
(补题)2015 9447 CTF : Search Engine
好好说话之Fastbin Attack(3):Alloc to Stack
好好说话之Fastbin Attack(2):House Of Spirit
好好说话之Fastbin Attack(1):Fastbin Double Free
好好说话之Use After Free
好好说话之unlink
…
编写不易,如果能够帮助到你,希望能够点赞收藏加关注哦Thanks♪(・ω・)ノ
tcache dup
这种利用方式和前面fastbin attack中的fastbin dup很像,tcache dup利用的是tcache_put()未做安全检查的缺陷,我们来回顾一下tcache_put()函数:
static __always_inline void *
tcache_get (size_t tc_idx)
{tcache_entry *e = tcache->entries[tc_idx];assert (tc_idx < TCACHE_MAX_BINS);assert (tcache->entries[tc_idx] > 0);tcache->entries[tc_idx] = e->next;--(tcache->counts[tc_idx]); return (void *) e;
}
在具备tcache机制的情况下,申请释放内存的时候,_int_free()函数会调用tcache_put()函数,tcache_put()函数会按照size对应的idx将已释放块挂进tcache bins链表中。插入的过程也很简单,根据_int_free()函数传入的参数,将被释放块的malloc指针交给next成员变量。其中没有任何安全检查和保护机制,在大服务提高性能的同时,安全性几乎舍弃了大半
因为没有做任何的检查,所以我们可以对同一个chunk多次free,这就会造成cycliced list。我们在fastbin attack中经常用到
例题:how2heap 中的 tcache_dup
源码如下,做了一些小小的改动,将不重要的输出省略了,不影响正常执行:
1 //gcc -g -no-pie hollk.c -o hollk2 //glibc_2_27:3 //patchelf --set-rpath 路径/2.27-3ubuntu1_amd64/ hollk4 //patchelf --set-interpreter 路径/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2 hollk5 #include <stdio.h>6 #include <stdlib.h>7 #include <assert.h>8 9 int main()10 {11 int *a = malloc(8);12 13 free(a);14 free(a);15 16 void *b = malloc(8);17 void *c = malloc(8);18 printf("Next allocated buffers will be same: [ %p, %p ].\n", b, c);19 20 assert((long)b == (long)c);21 return 0;22 }
由于我们在编译的时候使用-g
参数,所以在使用gdb进行动态调试的时候可以在对应代码行下断点,首先我们在第13
行下断点,看一下已创建的chunk_a的地址在哪:
可以看到chunk_a的头指针为0x602250
,fd所在位置为0x602260
,接下来我们将断点下在第14
行,看一下第一次释放chunk_a后bin中的情况:
接下来我们间断点下在第20
行,完成第二次申请0x20的chunk,并打印出chunk_b和chunk_c的malloc指针:
总体来说和前面的fastbin attack构造循环单项链表的方式差不多,只是对利用的机制不一样
tcache house of spirit
tcache house of spirit这种利用方式是由于tcache_put()函数检查不严格造成的,在释放的时候没有检查被释放的指针是否真的是堆块的malloc指针,如果我们构造一个size符合tcache bin size的fake_chunk,那么理论上讲其实可以将任意地址作为chunk进行释放。这里就直接采用wiki上面列出的例子进行讲解了:
how2heap中的tcache_house_of_spirit
源码如下,稍作改动,去掉了一些输出语句,不影响正常程序执行流程:
1 //gcc -g -no-pie hollk.c -o hollk2 //patchelf --set-rpath 路径/2.27-3ubuntu1_amd64/ hollk3 //patchelf --set-interpreter 路径/2.27-3ubuntu1_amd64/ld-linux-x86-64.so.2 hollk4 #include <stdio.h>5 #include <stdlib.h>6 #include <assert.h>7 8 int main()9 {10 setbuf(stdout, NULL);11 12 malloc(1);13 14 unsigned long long *a;15 unsigned long long fake_chunks[10];16 17 printf("fake_chunk addr is %p\n", &fake_chunks[0]);18 19 fake_chunks[1] = 0x40; 20 21 a = &fake_chunks[2];22 23 free(a);24 25 void *b = malloc(0x30);26 printf("malloc(0x30): %p\n", b);27 28 assert((long)b == (long)&fake_chunks[2]);29 }
由于我们在编译阶段使用了-g
参数,所以在使用gdb调试过程中可以在代码行下断点。首先我们在第19
行下断点,看一下打印出来的fake_chunk[]的起始地址:
可以看到fake_chunk[]的起始地址为0x7fffffffdea0
,接下来我们将断点下在第21
行,执行fake_chunks[1] = 0x40;
这段代码:
好好说话之Tcache Attack(2):tcache dup与tcache house of spirit相关推荐
- 好好说话之Tcache Attack(3):tcache stashing unlink attack
tcache stashing unlink attack这种攻击利用有一个稍微绕的点,就是small bin中的空闲块挂进tcache bin这块.弯不大,仔细想想就好了 往期回顾: 好好说话之Tc ...
- 好好说话之Tcache Attack(1):tcache基础与tcache poisoning
进入到了Tcache的部分,我还是觉得有必要多写一写基础的东西.以往的各种攻击手法都是假定没有tcache的,从练习二进制漏洞挖掘的角度来看其实我们一直模拟的都是很老的环境,那么这样一来其实和真正的生 ...
- 好好说话之Fastbin Attack(1):Fastbin Double Free
好像拖更了好久...实在是抱歉....主要是fastbin attack包含了四个部分,后面的例题不知道都对应着哪个方法,所以做完了例题才回来写博客.fastbin attack应该也会分四篇文章分开 ...
- 好好说话之IO_FILE利用(1):利用_IO_2_1_stdout泄露libc
前言 本来是在做tcache attack的例题的,但是wiki上的challenge2考察的重点不仅仅是在tcache.题目程序中没有输出的功能,所以无法像往常一样去泄露libc,这个时候就需要进行 ...
- 好好说话之House Of Einherjar
前言 又鸽了好久,抱歉哈~ 总的来说House Of Einherjar这种利用方法还是挺简单的,有点像chunk extend/shrink技术,只不过该技术是后向,并且利用top_chunk合并机 ...
- 好好说话之Large Bin Attack
large bin attack这种方法本质上并不难,只是有点绕而已.他和上一篇unsorted bin attack有点类似,都是chunk挂进bin链表的时候通过完成链表结构连接时发生的问题,只不 ...
- 好好说话之Use After Free
到了Use After Free啦,总体来说这种手法并不复杂,特征也很明显,就是在静态分析阶段观察释放chunk之后指针是否置空.本以为参加hw会往后拖更,没想到这么快就写完了.如果前面一直跟着学的话 ...
- 如何看当前windows是utf8还是gbk_职场中的OKR如何“好好说话”
在工作中,经常会遇到各种各样的问题需要沟通,不管是团队内部的,还是跨部分,或者是对上级汇报还是管理下属.我们发现,有些能力很优秀的人,他们讲的内容,别人很快能理解.但是有的人,说了半天,大家也不知道他 ...
- ⊱人永远需要两种能力:好好说话和情绪稳定
昨晚已经躺下,收到朋友的一条微信. 是一张截图,题目是:武昌火车站附近爆发社会恶劣事件--面馆老板因与食客发生口角冲突被砍头断臂,事后扔进垃圾桶. 现场十分血腥,被围观群众拍下迅速在微博等网络媒体上传 ...
最新文章
- 毕业三年,贷款40万创业之后我又做回了程序员
- 动漫风html源码,CSS3动画制作一个卡通风格的404错误页面代码
- OpenCV4Android JavaCameraView实现
- spring3.2 aop 搭建 (1)
- Android中的一个定时任务的方法
- .NET Core 必备安全措施
- Mingw编译DLib
- linux-noshell的模式
- golang基础02
- C 编译器、链接器、加载器详解
- datagrip连接oracle
- Fiddler中文版 软件分享(亲测可用!)
- 福昕高级PDF 专业版程序安装及注意事项
- matlab 振动,振动系统固有特性的matlab计算
- 哈理工OJ 1983 Math(前缀和)
- linux安装文泉驿字体,文泉驿的安装及配置
- 史上最简单的教程——“21天”自学C语言
- 磁力mysql搜索_求一份磁力链接搜索网站的源码,最好能来个大神讲一下这个搜索的原理...
- 什么是失血模型和充血模型?(DDD)
- 动态内存分配Dynamic allocation(C语言划重点)
热门文章
- 【Python】一篇文章学习Pandas包 Pandas Series、DataFrame 对比学习
- aspx 微型_如何使用微型可编程机器人向孩子介绍编码
- C语言(一):C语言概述介绍
- 上界通配符、下界通配符
- 13种APP推广手段与渠道
- TweenMax特效
- Apache Spark源码阅读环境搭建
- could not delete: [org.jbpm.pvm.internal.model.ExecutionImpl#20007] 使用jbpm流程结束时出现异常
- ElasticSearch 学习笔记(一)
- Selenium基于Python web自动化测试框架 —— PO模型