首页 > 其他分享 >劫持TLS绕过canary && 堆和栈的灵活转换

劫持TLS绕过canary && 堆和栈的灵活转换

时间:2024-07-11 19:29:45浏览次数:12  
标签:TLS && libc canary 线程 io p64

引入:什么是TLScanary?

TLScanary 是一种在 Pwn(主要是二进制漏洞利用)中常见的技术,专门用于处理 TLS 保护的二进制文件。在安全竞赛(例如 CTF)和漏洞利用场景中,攻击者需要应对目标程序的多层安全机制,其中 TLS 是一种常见的保护措施。TLScanary 结合了 TLS 协议与堆栈保护(stack canary)技术,增加了攻击难度。

可见TLS和canary有着不可分割的关系

介绍:TLS的基本概念(pwn canary中)

  • TLS 是一种用于在线程本地存储数据的机制。每个线程都有自己的 TLS 区域,用于存储与该线程相关的特定数据。
  • 在堆栈保护方面,TLS 常被用于存储堆栈 canary 值,这是一种防止缓冲区溢出攻击的安全措施。
  • 堆栈 canary 是一种在函数返回地址之前插入的特殊值,用于检测堆栈溢出。如果缓冲区溢出覆盖了 canary 值,程序会在返回前检测到不一致,并终止执行,防止恶意代码执行。

其实对于多线程的canary来说,每个线程的canary都是独立存在的,当一个线程被创建时,操作系统会为该线程分配一个独立的 TLS 区域。这个区域通常通过某种线程控制块(TCB)来管理,每个线程都有一个独立的 TCB。

在多线程环境中,每个线程的堆栈上都会有一个独立的 canary 值。操作系统或运行时库在为每个线程分配堆栈时,会在堆栈的适当位置插入一个 canary 值。

一个示例代码

void* thread_function(void* arg) {
    // 每个线程有自己独立的 TLS 区域
    __thread int thread_local_variable = 0;

    // 在函数入口处插入 canary 值
    unsigned long canary_value = generate_random_canary();

    // 检查 canary 值是否被修改
    if (canary_value != expected_canary_value) {
        terminate_program();
    }

    // 线程的实际工作
    // ...

    return NULL;
}

int main() {
    pthread_t threads[NUM_THREADS];

    // 创建多个线程
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_create(&threads[i], NULL, thread_function, NULL);
    }

    // 等待所有线程完成
    for (int i = 0; i < NUM_THREADS; i++) {
        pthread_join(threads[i], NULL);
    }

    return 0;
}

struct pthread结构体

#include <stddef.h> // 为了使用 size_t

/* Definition of the tcbhead_t structure (hypothetical) */
typedef struct {
    // 定义线程控制块头部结构体
    // 可以根据实际情况进行定义
    // 例如:线程 ID、状态信息等
    int thread_id;
    // 其他相关信息
} tcbhead_t;

/* Define the pthread structure */
struct pthread {
#if !TLS_DTV_AT_TP
    /* This overlaps the TCB as used for TLS without threads (see tls.h).  */
    tcbhead_t header; // 可能与 TLS 相关的头部信息
#else
    struct {
        // 更复杂的结构体定义
        // 可能包含与 TLS 相关的更多详细信息
        // ...
    } header;
#endif

    /* Extra padding for alignment and potential future use */
    void *__padding[24]; // 填充数组,用于对齐和可能的未来扩展
};

看见看到struct pthread结构的第一个字段是tcbhead_t

tcbhead_t 结构体的解析:

typedef struct {
    void *tcb;            /* 指向线程控制块(TCB)的指针 */
    dtv_t *dtv;           /* 线程特定数据的指针 */
    void *self;           /* 指向线程描述符的指针 */
    int multiple_threads; /* 标识是否有多个线程 */
    int gscope_flag;      /* 全局作用域标志 */
    uintptr_t sysinfo;    /* 系统信息 */
    uintptr_t stack_guard;/* 堆栈保护 */
    uintptr_t pointer_guard; /* 指针保护 */

    /* 其他可能的字段... */
} tcbhead_t;

其中stack_guard里面放的就是单线程的canary,通常可以通过覆盖它的内容来达到绕过canary保护的目的

一道题目的引入

刚好对于上一篇留下的问题,题目:binding

题目保护情况

64位ida载入

初看时是个堆题

 

add函数申请大小有限制,一次创建两个堆块,calloc申请堆块

edit函数,白给任意地址写一个字节(因为unsigned __int8类型指针占一个字节),有溢出不多,可以迁移

free函数,明显的UAF漏洞可以泄露地址

show函数

开了沙箱,只能orw

标签:TLS,&&,libc,canary,线程,io,p64
From: https://www.cnblogs.com/CH13hh/p/18296983

相关文章

  • 嵌入式系统中的加解密签名(2)--- mbedtls认识与使用
    笔者来介绍一下mbedtls认识与使用1、mbedtls认识mbedtls(EmbeddedTLS),是嵌入式里面实现的TLS协议,用C语言实现。相关的TLS协议以及加密等知识可以看笔者上一篇文章----嵌入式系统中的加解密签名。基本特点如下图所示:仓库地址:Mbedtls。特点:面向小型嵌入式设备,代码紧凑......
  • pip is configured with locations that require TLS/SSL, however the ssl module in
    使用Ubuntu16.04(已内置python2.7)安装python3.10之后,再使用pip3安装包的时候总是报错:WARNING:pipisconfiguredwithlocationsthatrequireTLS/SSL,howeverthesslmoduleinPythonisnotavailable.Lookinginindexes:https://pypi.tuna.tsinghua.edu.cn/simpleRequi......
  • HTTP协议27丨更好更快的握手:TLS1.3特性解析
    上一讲中我讲了TLS1.2的握手过程,你是不是已经完全掌握了呢?不过TLS1.2已经是10年前(2008年)的“老”协议了,虽然历经考验,但毕竟“岁月不饶人”,在安全、性能等方面已经跟不上如今的互联网了。于是经过四年、近30个草案的反复打磨,TLS1.3终于在去年(2018年)“粉墨登场”,再......
  • 电脑hold escape key to prevent startlsback怎么处理?
     电脑出现holdescapekeytopreventStartlsBackfrom,一般遇到这种问题之后,一直按住ESC键就没有了。但是还需彻底的解决掉这个问题。首先我们按下“ctrl+alt+del”组合键打开任务管理器,左上角“运行新任务”,输入“control”并确定,就可以打开控制面板,查看方式为“类别......
  • 免费ACME证书申请接口:可以简化SSL/TLS证书申请
    ACME证书申请接口:简化SSL/TLS证书获取的利器在当今互联网安全日益受到重视的背景下,HTTPS已成为网站安全通信的标配。而HTTPS的核心在于SSL/TLS证书,它能够确保数据传输的完整性和安全性。然而,传统的手动创建和安装证书流程复杂且耗时,不利于网站的快速部署和安全更新。为了解决这......
  • SSL/TLS协议信息泄露漏洞(CVE-2016-2183)
    1.问题描述SSL/TLS协议信息泄露漏洞(CVE-2016-2183)TLS是安全传输层协议,用于在两个通信应用程序之间提供保密性和数据完整性。TLS,SSH,IPSec协商及其他产品中使用的DES及TripleDES密码存在大约四十亿块的生日界,这可使远程攻击者通过Sweet32攻击,获取纯文本数据。2.问题解决......
  • HTTPS+TLS/SSL
    名词解释TLS:TransportLayerSecuritySSL:SecureSocketsLayer理论基础信息摘要算法根据一段信息计算出一串数字,但是由这串数字没办法还原出原来的信息等于是这串数字由这段信息产生,可以表示这段信息,称为这段信息的摘要主要有以下应用:传输文件时验证文件有无损坏......
  • 快速解决:使用Mindspore框架时报错!!libgomp-6e1a1d1b.so.1.0.0: cannot allocate memory
    前言:最近在用ms跑大模型,需要做好多步骤,遇到报错跟大家一起分析一下吧刚开始转换权重就遇到了下述报错:ImportError:/root/anaconda3/envs/MS/lib/python3.9/site-packages/torch/lib/../../torch.libs/libgomp-6e1a1d1b.so.1.0.0:cannotallocatememoryinstaticTLSblo......
  • 【解决了一个小问题】因为镜像证书的问题,golang http client出现错误 `tls: failed to
    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢!cnblogs博客zhihuGithub公众号:一本正经的瞎扯一个服务使用Docker打包镜像,部署到k8s后出现如下的错误信息:tls:failedtoverifycertificate:x509:certificatesignedbyunknownauthority出错的位置是......
  • [OpenBMC] LDAP 设定(三) - LDAPS(LDAP over TLS)
    终于到了最后一个部分LDAPS,这部分我们会依序介绍TLS的原理(这边会补充密码学基础)非对称式加密vs对称式加密数位签章数位凭证TLS 握手(hankshake)如何产生凭证上传凭证到LDAPServer上传凭证到BMC有可能会遇到的问题(补充我遇到的问题) TLS的原理对称式......