0009-TIPS-SLAB入门与观察

news2024/7/4 5:47:31

极简,但是能快速上手

slub算法

这篇文章简洁直观,推荐
linux 内核 内存管理 slub算法 (一) 原理

感受slub堆漏洞

需要下载 https://github.com/De4dCr0w/green-dill ,使用其中的测试程序做实验

UAF

在这里插入图片描述
如果看完上面链接中有关slub中对象分配的方式,那上面这张图就可以这么看

  • 从左到右是分配一个对象A
  • 从右到左是释放一个对象A

在简化的情况下,可以把SLAB理解为glibc中的fastbin

  • slub分配对象 <=> 从fastbin中取走一个bin
  • slub释放对象 <=> 将bin放入fastbin中

当在kmalloc-XX中存在一个UAF对象时,由于SLUB对象的分配/释放类似于fastbin,那么只要在该UAF对象释放后,立即申请相同kmalloc-XX中的对象,便能持有该UAF对象

如下是green-dill中的测试程序,虽然不是UAF程序,但是可以通过简单的申请-释放-再申请来模拟一下

分配kmalloc-1024对象前

/ $ ./slub
1.malloc slub
2.free slub
3.show slub
4.edit slub
5.exit
>>
pwndbg> kcache kmalloc-1k
start: 0xffffffff8245d160 <slab_caches_to_rcu_destroy_work>
cpu #0 > 0xffff88801ee00000 | 0xffff88801ee23c40
<kmalloc-1k>:
kmem_cache    : 0xffff88801e801500
oo            : 131088
objects_count : 16
pages_count   : 4
offset        : 0
min_partial   : 5
cpu_partial   : 6
cache_cpu freelist:
    ->0xffff88801e215400     <<======================================
    ->0xffff88801e215800
    ->0xffff88801e215c00
    ->0xffff88801e216000
    ->0xffff88801e216400
    ->0xffff88801e216800
    ->0xffff88801e216c00
    ->0xffff88801e217000
    ->0xffff88801e217400
    ->0xffff88801e217800
    ->0xffff88801e217c00
    ->0x0 (freelist)
cache_cpu partial page -> 0x0
first cache_node addr : 0xffff88801e800d80
cache_node['partial']['next']: 0xffff88801e800d90
cache_node partial page -> 0x0
cache_node full page -> 0x0

分配kmalloc-1024对象后

/ $ ./slub
1.malloc slub
2.free slub
3.show slub
4.edit slub
5.exit
>>  1
size: 1000
kmalloc addr : 0xffff88801e215400      <<======================================
pwndbg> kcache kmalloc-1k
start: 0xffffffff8245d160 <slab_caches_to_rcu_destroy_work>
cpu #0 > 0xffff88801ee00000 | 0xffff88801ee23c40
<kmalloc-1k>:
kmem_cache    : 0xffff88801e801500
oo            : 131088
objects_count : 16
pages_count   : 4
offset        : 0
min_partial   : 5
cpu_partial   : 6
cache_cpu freelist:
    ->0xffff88801e215800
    ->0xffff88801e215c00
    ->0xffff88801e216000
    ->0xffff88801e216400
    ->0xffff88801e216800
    ->0xffff88801e216c00
    ->0xffff88801e217000
    ->0xffff88801e217400
    ->0xffff88801e217800
    ->0xffff88801e217c00
    ->0x0 (freelist)
cache_cpu partial page -> 0x0
first cache_node addr : 0xffff88801e800d80
cache_node['partial']['next']: 0xffff88801e800d90
cache_node partial page -> 0x0
cache_node full page -> 0x0

释放kmalloc-1024对象后

1.malloc slub
2.free slub
3.show slub
4.edit slub
5.exit
>>  2
delete index: 0
pwndbg> kcache kmalloc-1k
start: 0xffffffff8245d160 <slab_caches_to_rcu_destroy_work>
cpu #0 > 0xffff88801ee00000 | 0xffff88801ee23c40
<kmalloc-1k>:
kmem_cache    : 0xffff88801e801500
oo            : 131088
objects_count : 16
pages_count   : 4
offset        : 0
min_partial   : 5
cpu_partial   : 6
cache_cpu freelist:
    ->0xffff88801e215400		<<======================================
    ->0xffff88801e215800
    ->0xffff88801e215c00
    ->0xffff88801e216000
    ->0xffff88801e216400
    ->0xffff88801e216800
    ->0xffff88801e216c00
    ->0xffff88801e217000
    ->0xffff88801e217400
    ->0xffff88801e217800
    ->0xffff88801e217c00
    ->0x0 (freelist)
cache_cpu partial page -> 0x0
first cache_node addr : 0xffff88801e800d80
cache_node['partial']['next']: 0xffff88801e800d90
cache_node partial page -> 0x0
cache_node full page -> 0x0

再次分配kmalloc-1024对象

1.malloc slub
2.free slub
3.show slub
4.edit slub
5.exit
>>  1
size: 1000
kmalloc addr : 0xffff88801e215400	<<======================================
pwndbg> kcache kmalloc-1k
start: 0xffffffff8245d160 <slab_caches_to_rcu_destroy_work>
cpu #0 > 0xffff88801ee00000 | 0xffff88801ee23c40
<kmalloc-1k>:
kmem_cache    : 0xffff88801e801500
oo            : 131088
objects_count : 16
pages_count   : 4
offset        : 0
min_partial   : 5
cpu_partial   : 6
cache_cpu freelist:
    ->0xffff88801e215800
    ->0xffff88801e215c00
    ->0xffff88801e216000
    ->0xffff88801e216400
    ->0xffff88801e216800
    ->0xffff88801e216c00
    ->0xffff88801e217000
    ->0xffff88801e217400
    ->0xffff88801e217800
    ->0xffff88801e217c00
    ->0x0 (freelist)
cache_cpu partial page -> 0x0
first cache_node addr : 0xffff88801e800d80
cache_node['partial']['next']: 0xffff88801e800d90
cache_node partial page -> 0x0
cache_node full page -> 0x0

堆溢出 && 堆喷

在这里插入图片描述
在kmalloc-XX不停的申请/释放后,slab有可能是如上结构(也可能不是,反正就是不确定),空闲object对象和已分配的object对象可能是交替排布的。

有很大可能存在这样的场景:

  • 某个存在堆溢出的object对象X(上溢,下溢)被分配,被分配到slab page A的空闲对象中
  • 而想要通过堆喷提权的object对象Y被分配到slab page B的空闲对象中

如果object对象X是下溢

  • 攻击者没有办法判断object对象Y是否分配到了object对象X往后的地址中
  • 也没有办法判断object对象X和对象Y之间间隔了多少对象
    这样堆溢出就很难利用。

因此需要通过堆喷(就是分配多个kmalloc-XX对象),先将这些间隔空闲对象和已分配对象的slab page消耗掉,使slab中的布局形成如下结构
在这里插入图片描述
或如下结构
在这里插入图片描述

这样,在分配堆溢出的对象和用户控制堆喷对象时,就有可能在很大概率上相邻,从而提高漏洞利用效率。

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

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

相关文章

F407/103启动文件and启动过程

STM32 启动文件简介 STM32 启动文件由 ST 官方提供&#xff0c;在官方的固件包里。 startup_stm32f40_41xxx.s 启动文件由汇编编写&#xff0c;是系统上电复位后第一个执行的程序。 启动文件主要做了以下工作&#xff1a; 1 、初始化堆栈指针 SP _initial_sp 2 、初始…

SSM面试题

文章目录 一、Spring1.1 配置一个bean的方式?注解/xml1.2 spring 自动装配 bean 有哪些方式?1.3 spring 常用的注入方式有哪些?1.4 Component和Bean的区别?1.5 spring 事务实现方式有哪些?1.6 spring事务的传播机制?1.7 spring 的事务隔离? 二、SpringMVC2.1 SpringlIvc…

阿里云在国内市场占有率怎么样?

阿里云在国内市场占有率怎么样&#xff1f;   阿里云在国内市场占有率分析   随着互联网的飞速发展&#xff0c;越来越多的企业和个人开始利用云计算服务来满足各种业务需求。作为中国领先的云服务提供商&#xff0c;阿里云自成立以来就受到了广泛关注。本文旨在分析阿里云…

cmake入门(2)

cmake 教程2 demo cmake_minimum_required(VERSION 3.10) project(Tutorial)set(CMAKE_CXX_STANDARD 11) set(CMAKE_CXX_STANDARD_REQUIRED True)add_executable(Tutorial tutorial.cxx)基础 cmake_minimum_required cmake的版本要求 project 项目的名字&#xff0c;同时会生…

ad18学习笔记五:统计焊盘数量(board information)

AD18之后&#xff0c;Altium Designer改动比较大。下面将介绍AD19如何统计焊盘(PAD数量)与SMT贴片数量与插件数量 1&#xff1a; PCB 空白处 -> F11 -> Properties 选项卡 -> Board Information -> Pads 2&#xff1a; Pads 包括 通孔焊盘和贴片焊盘 Vias 包括过孔…

22.小波神经网络时间序列预测交通流量(附matlab程序)

1.简述 学习目标&#xff1a;小波神经网络时间序列预测交通流量 WNN&#xff08;小波神经网络&#xff09;&#xff1a;是在误差反传神经网络拓扑结构的基础上发展而来的网络&#xff0c;与神经网络的结构具有一定的相似&#xff0e;在小波神经网络中&#xff0c;当整体信号…

第十三章 csv模块

1. csv模块介绍 介绍csv 模块前&#xff0c;需要先了解csv 文件&#xff08;.csv 文件格式&#xff09;&#xff0c;csv 文件中的每行代表电子表格中的一行&#xff0c;并用逗号分隔该行中的单元格。 csv 文件可以使用记事本打开&#xff0c;可以使用Excel 另存为.csv 文件格…

docker内访问tdengine服务

踩坑记 springboot项目使用docker部署。由于tdengine原生连接方式需要安装客户端&#xff0c;第一想法是宿主机装好客户端&#xff0c;然后映射驱动到容器内部&#xff0c;网上找的教程也基本是这种思路。尝试了一天失败了。 错误1:libjemalloc.so.2 file: No such file or d…

docker安装下载tomcat一站式搞定并设置挂载卷

阿丹&#xff1a; 之前在使用nginx部署搭建vue项目的时候没有出docker配置nginx的配置文档&#xff08;因为之前使用的是腾讯云现成的nginx服务器&#xff09;&#xff0c;今天配置安装一下tomcat和nginx在docker里面的安装。 在docker中安装配置tomcat 操作解读&#xff1a;…

服务器中间件

文章目录 一、tomcat二、 nginx2.1 代理问题2.2 负载均衡问题2.3 资源优化2.4 Nginx处理2.5 Nginx的特点&#xff1a;2.6 Nginx的安装2.7 Nginx的配置文件2.8 Nginx的反向代理2.9 反向代理&#xff1a;2.10 基于Nginx实现反向代理2.11 关于Nginx的location路径映射2.12 负载均衡…

【实战项目】利用mmdetection识别卫星遥感影像上的电线杆塔

前言 这次项目算是对openmmlab AI实战营第二期的一个实验证明&#xff0c;虽然这几天学习的比较粗糙&#xff0c;但也算是入门了mmdetection。 这个工具就像python一样&#xff0c;openmmlab已经将入门门槛做的很低了&#xff0c;但如果想精进、熟练甚至做真正的调参侠&#xf…

小白到运维工程师自学之路 第三十九集 (LVS架构)

一、概述 1、lvs LVS是Linux Virtual Server的缩写&#xff0c;是一种基于Linux内核的高性能、高可用性的 负载均衡软件。它可以将多台服务器组成一个虚拟的服务器集群&#xff0c;通过负载均衡算法将 客户端请求分发到不同的服务器上&#xff0c;从而提高系统的可用性和性能…

【MQTT 5.0】协议 ——发布订阅模式、Qos、keepalive、连接认证、消息结构

一、前言1.1 MQTT 协议概述1.2 MQTT规范 二、MQTT 协议基本概念2.1 发布/订阅模式2.11 MQTT 发布/订阅模式2.12 MQTT 发布/订阅中的消息路由2.13 MQTT 与 HTTP 对比2.14 MQTT 与消息队列 2.2 服务质量&#xff1a;QoS2.21 QoS 0 最多分发一次2.22 QoS1 至少分发一次2.23 QoS 2 …

一款可以支持SNMP协议的网络型温湿度变送器资料

简单网络管理协议&#xff08;SNMP&#xff09;&#xff0c;由一组网络管理的标准组成&#xff0c;包含一个应用层协议&#xff08;application layer protocol&#xff09;、数据库模型&#xff08;database schema&#xff09;和一组资料物件。该协议能够支持网络管理系统&am…

generator和promise和async的异同

一、generator(生成器)是ES6标准引入的新数据类型,他和promise一样都是异步事件的解决方案 //generator函数生成斐波那契// generator(生成器)是ES6标准引入的新数据类型,async就是 Generator 函数的语法糖//本质&#xff1a;用来处理异步事件的对象/包含异步操作的容器functio…

Rust语言从入门到入坑——(4)Rust语法(中)

文章目录 0 引入1、函数1.1、函数参数1.2、函数体1.3、函数返回值 2、条件语句3、循环3.1 、while3.2 、for3.3 、loop循环 4、总结 0 引入 在这里我们需要介绍Rust语法&#xff0c;一共分三部分&#xff0c;第二部分主要是一些如函数&#xff0c;编程中的循环等语法的介绍&am…

小白到运维工程师自学之路 第三十九集 (HAproxy 负载均衡)

一、概述 HAProxy是一款高性能的负载均衡软件&#xff0c;可以将来自客户端的请求分发到多个服务器上&#xff0c;以提高系统的可用性和性能。HAProxy支持多种负载均衡算法&#xff0c;包括轮询、加权轮询、最少连接数等。同时&#xff0c;HAProxy还支持会话保持、健康检查、SS…

redis和mysql

文章目录 一、redis1.1 redis的数据结构都有哪些&#xff1f;1.2 持久化方式有哪些&#xff1f;1.3 怎么保证缓存和数据库数据的一致性?1.4 redis缓存是什么意思&#xff1f; 二、数据库2.1 基本数据类型2.2 MySQL 的内连接、左连接、右连接有什么区别?2.3 MySQL 问题排查都有…

第二章(第三节):导数的应用

1.洛必达法则 1.用途 能够使用洛必达法则解决常见的未定式问题。2.极限下的未定式 如果当 x→a 或 x→∞ 时,函数f(x)和g(x)均趋于零或者无穷,那么极限:可以存在,也可能不存在。通常这种极限为:0/0型或∞/∞型未定式。3.示例 1.lim x→0; (1-cosx) / x 2 ^2

机器人开发--Fast DDS

机器人开发--Fast DDS 1 介绍1.1 DDS概述1.2 Fast DDS 介绍域与域通信跨网络通信 2 内容要素与组件介绍IDL &#xff08;Interface Definition Language&#xff09;eProsima Fast DDS-Gen&#xff1f; 3 安装步骤3.1 安装选择&#xff08;linux源码cmakec&#xff09;3.2 模块…