【PWN · Heap · how2heap】[fastbin_dup.c]

本文通过一个简单的C程序演示了fastbin_dup攻击,涉及Glibc的double-free漏洞和fastbins。首先填充Tcache,然后分配和释放内存块以构造fastbin链表。通过两次free操作,创建了一个循环链表,导致后续malloc时可能出现安全问题。程序最后展示了如何利用这个漏洞,使得连续的calloc调用返回相同的内存地址。
摘要由CSDN通过智能技术生成

开始学习PWN堆相关的部分时,被繁复的知识冲昏了头脑。了解到how2heap是国外大神的系列堆漏洞小实验,于是尝试通过复现这些漏洞,并提取知识点。


一、fastbin_dup.c

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>

int main()
{
	setbuf(stdout, NULL);
	printf("This file demonstrates a simple double-free attack with fastbins.\n");
	//在Glibc的2.26中 新增了Tcache机制 这里将其填充完毕 不影响我们继续fastbin
	printf("Fill up tcache first.\n");
	void *ptrs[8];
	for (int i=0; i<8; i++) {
		ptrs[i] = malloc(8);
	}
	for (int i=0; i<7; i++) {
		free(ptrs[i]);
	}
  //动态申请了三块内存,大小为8,tcache满了,所以就放到fastbins里
	//c用于和未分配的内存块隔开,避免合并
	printf("Allocating 3 buffers.\n");
	int *a = calloc(1, 8);
	int *b = calloc(1, 8);
	int *c = calloc(1, 8);

	printf("1st calloc(1, 8): %p\n", a);
	printf("2nd calloc(1, 8): %p\n", b);
	printf("3rd calloc(1, 8): %p\n", c);
	//将a第一次free,这时a的地址就被放到了fastbins中
	printf("Freeing the first one...\n");
	free(a);
	//虽然会有double free漏洞,但是fastbins还是会做一些基本的检查,连续两块链表节点不能一样,简单来说不能紧邻free
	printf("If we free %p again, things will crash because %p is at the top of the free list.\n", a, a);
	// free(a);
	//通过free一块别的内存,让fastbins中的链表结构为a->b->a,将两个a隔开,避免报错
	printf("So, instead, we'll free %p.\n", b);
	free(b);
	//double free
	printf("Now, we can free %p again, since it's not the head of the free list.\n", a);
	free(a);
	//fastbins中,块大小为8的链表结构为 a->b->a->0
	printf("Now the free list has [ %p, %p, %p ]. If we malloc 3 times, we'll get %p twice!\n", a, b, a, a);
	//连续malloc,内存从fastbins中选取合适的进行分配
	//b->a->0
	a = calloc(1, 8);
	//a->0
	b = calloc(1, 8);
	//->0
	c = calloc(1, 8);
	printf("1st calloc(1, 8): %p\n", a);
	printf("2nd calloc(1, 8): %p\n", b);
	printf("3rd calloc(1, 8): %p\n", c);
	assert(a == c);
}


二、分析过程

在Glibc的2.26中 新增了Tcache机制,因此在做fastbin的实验时,需要向先将tcache填满,保证我们free掉的内存块会被记录在fastbins中。

具体过程如下:

我们连续申请三块内存a,b,c,其作用——a用于double free,b用于避免触发fastbins的纠错机制,c用于隔离已分配区域与未分配区域从而避免free时合并。

先期tcache已经被填满,接下来不会free到tcache

(这里有点疑问,为什么分配abc时,不从tcache中取呢?确实没从中取,经过pwndbg调试过)

(——再次经过pwndbg,此时我将所有的calloc改成了malloc,发现malloc时,tcache中的块被取出用于分配。说明这是calloc的原因)

     free(a),a指针地址记录到fastbins。 →a→0

        free(b),b指针地址记录到fastbins。→b→a→0

        free(a),a指针的地址再次记录到fastbins。→a→b→a→0

开始连续申请三块8bytes内存(fastbins最小的一组是16bytes,加上两个控制字段,共0x20bytes)。

        申请第一块,从fastbins的0x20链中,取出第一块 ——> 原a的地址 ——> 赋给a

        申请第二块,从fastbins的0x20链中,取出第二块 ——> 原b的地址 ——> 赋给b

        申请第三块,从fastbins的0x20链中,取出第三块 ——> 原a的地址 ——> 赋给c

结果就是 a==c 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
毕业设计,基于SpringBoot+Vue+MySQL开发的公寓报修管理系统,源码+数据库+毕业论文+视频演示 现代经济快节奏发展以及不断完善升级的信息化技术,让传统数据信息的管理升级为软件存储,归纳,集中处理数据信息的管理方式。本公寓报修管理系统就是在这样的大环境下诞生,其可以帮助管理者在短时间内处理完毕庞大的数据信息,使用这种软件工具可以帮助管理人员提高事务处理效率,达到事半功倍的效果。此公寓报修管理系统利用当下成熟完善的Spring Boot框架,使用跨平台的可开发大型商业网站的Java语言,以及最受欢迎的RDBMS应用软件之一的MySQL数据库进行程序开发。公寓报修管理系统有管理员,住户,维修人员。管理员可以管理住户信息和维修人员信息,可以审核维修人员的请假信息,住户可以申请维修,可以对维修结果评价,维修人员负责住户提交的维修信息,也可以请假。公寓报修管理系统的开发根据操作人员需要设计的界面简洁美观,在功能模块布局上跟同类型网站保持一致,程序在实现基本要求功能时,也为数据信息面临的安全问题提供了一些实用的解决方案。可以说该程序在帮助管理者高效率地处理工作事务的同时,也实现了数据信息的整体化,规范化与自动化。 关键词:公寓报修管理系统;Spring Boot框架;MySQL;自动化;VUE
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值