多线程动态库里面调用静态库分配内存函数导致的崩溃cltp汇编指令导致

1、概述

        有这样的一个场景,我有一个动态库myso.so里面有函数start_crash(),用到静态库的内存分配函数,其实静态库里面的static.a 里面就封装了一个函数叫system_malloc(),函数返回的是分配的内存地址,然后发现,我在测试demo里面创建了个子线程,然后在子线程里面调用start_crash(),会发现system_malloc函数返回的地址不对,内存不可访问,使用时直接会发生崩溃

图1.1 exmaple为测试的例子,src为my.so动态库,util为负责调用malloc并返回分配的地址

图1.2 util system_malloc函数

图1.3 为myso.so中的start_crash()函数

图1.4为main函数调用myso.so中的start_crash函数

2、分析过程

我采用的是visual stdio 2022进行调试Linux的程序,具体怎么配置,请看在 Visual Studio 中连接到你的目标 Linux 系统 | Microsoft Learn,这个教程进行配置调试

2.1 主线程的调用

        2.1.1 myso.so中start_crash反汇编代码

        

        2.1.2 my.so中的start_crash的寄存器值

        2.1.3 返回的地址指针

我们可以看到rax 跟eax的地址值就是最终给payload变量的值,这个是没有问题的

2.2 子线程的调用

2.2.1 my.so 中start_crash的反汇编

调用流程跟主线程中的一样,但是为啥多了个cltp汇编指令呢,我们看cltp的解释

这样我们继续看调用system_malloc函数后返回的地址

payload的地址变成了0xffffffff000b60,不可访问,其实根据汇编指令,是把rax的地址给了payload变量,所以看到payload的地址跟rax是一样的,为啥好好的在system_malloc明明得到正确的地址,为啥函数调用回来之后就变了,很奇怪,我们根据汇编代码其实是多了调cltp指令导致的。

2.2.2 在utils.a中分配的地址值

rax 跟eax寄存器存的内容

3、原因分析

根据2.1跟2.2的比较我们可以得出,在主线程中调用test_mem得到的地址是没有问题的,但是在子线程中的就有问题,我们找了网上的资料发现也有这个cltp指令导致的错误GCC cutting of higher 32 bits of qword in dlmalloc port - OSDev.org

所以我们在编译时候加add_compile_options(-Werror)编译选项,发现编译不过,发现我没有把system_interface.h头文件给包含过来导致的,然后加上之后竟然不会发生崩溃了。怀疑这是编译器进行优化导致的一个问题。

但是我没有在myso.c中包含system_interface.h头文件我竟然都能编译过去,这也很奇怪,通过对比内存和反汇编,我们可以得出结论应该是

4、结论

system_malloc函数没有被正确声明,编译把返回当成32位了?,还是没怎么搞懂,为啥在主线程调用就不会发生这事,在子线程就会,从地址来看,子线程分配的地址控件大于32,这才导致这样的问题,而且发生了cltp扩展

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

GoTrackIt应用指南:共享单车时空轨迹优化

本篇文章我们来基于GoTrackIt 包来研究一下里面的轨迹数据清洗功能,该包这部分功能是一个用于处理和分析GPS轨迹数据的工具,能够帮助用户进行诸如卡尔曼滤波平滑、轨迹简化;停留点删除、增密、降频、滑动窗口平滑的链式操作,并提供…

【kubernetes】k8s集群的简述与搭建

简述 Kubernetes(简称 K8s)是一个开源的容器编排平台,用于自动化部署、扩展和管理容器化应用程序 关键特性 自动化部署和回滚:Kubernetes 可以自动化地部署和回滚应用程序,确保应用程序始终处于预期的状态。服务发现…

华为USG系列防火墙 RESTCONF NAT配置 Python实现

目录 前言 文档下载 开启RESTCONF接口 Python 实现SNAT增删改查 查看nat映射列表 查看私网地址池 查看源地址池(公网) 查看nat映射规则 创建nat映射规则 创建私网地址池 创建源地址池 创建nat映射规则 修改NAT映射规则 删除NAT映射规则 …

token失效重新存储发起请求

import axios from axios import { MessageBox, Message } from element-ui import store from /store import Router from /router import { getCookie, setToken, setCookie } from ./auth// 因为后端环境区分v1 v2 剔除测试盛传的环境配置,并添加统一前缀 const …

HTML综合

一.HTML的初始结构 <!DOCTYPE html> <html lang"en"><head><!-- 设置文本字符 --><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><!-- 设置网页…

【合作原创】使用Termux搭建可以使用的生产力环境(六)

前言 在上一篇【合作原创】使用Termux搭建可以使用的生产力环境&#xff08;五&#xff09;-CSDN博客我们讲到了如何美化xfce4桌面&#xff0c;达到类似于Windows的效果&#xff0c;这一篇将继续在上一篇桌面的基础上给我们的系统装上必要的软件&#xff0c;让它做到真正可以使…

python3中幂怎么表示

首先导入math模块&#xff0c;然后调用pow()函数&#xff0c;即可实现幂运算&#xff0c;示例如下&#xff1a; import math math.pow(2&#xff0c;3) 结果如下&#xff1a; 8

AES笔记整理

文章目录 1. 简介2. 密钥加法层2. 字节代换层3. 行位移 - ShiftRows4. 列混淆 - MixColumn5. 其他5.1列混淆矩阵乘法运算5.2 AES密钥生成 6. 参考资料 以下内容为信息安全开发过程中&#xff0c;AES对称加密算法的笔记&#xff0c;大部分内容转载其他文章&#xff0c;若描述不清…

elementUI修改table样式

在Vue项目中&#xff0c;如果使用的是单文件组件&#xff08;.vue&#xff09;&#xff0c;并且样式是通过<style>标签定义的&#xff0c;vue2可以使用/deep/&#xff0c;vue3可以使用::v-deep选择器来修改ElementUI组件的样式。 1.修改表头背景色 /deep/.el-table__head…

【WiFi】WiFi中RSSI、SNR、NF之间关系及说明

RSSI&#xff08;接收信号强度指示&#xff09; 定义&#xff1a; RSSI 是一个相对值&#xff0c;用于表示接收到的无线信号的强度。它通常由无线设备的硬件&#xff08;如无线网卡或无线芯片&#xff09;直接提供。 计算&#xff1a; RSSI 的计算通常是由设备的无线芯片完成的…

爬虫基础知识点

最近看了看爬虫相关知识点&#xff0c;做了记录&#xff0c;具体代码放到了仓库&#xff0c;本文仅学习使用&#xff0c;如有违规请联系博主删除。 这个流程图是我使用在线AI工具infography生成的&#xff0c;这个网站可以根据url或者文本等数据自动生成流程图&#xff0c;挺…

路由引入问题(双点双向路由回馈问题)

简介 总所周知&#xff0c;路由引入import又称路由重分发redistribute&#xff0c;为了解决不同路由协议进程间路由信息不互通而使用的技术&#xff0c;由于不同路由协议的算法、机制、开销等因素的差异&#xff0c;它们之间无法直接交换路由信息。因此&#xff0c;路由引入技…

LAVE——基于大语言模型的新型代理辅助视频编辑工具允许用户根据自己的编辑风格进行调整

概述 论文地址&#xff1a;https://arxiv.org/abs/2402.10294 视频是一种非常强大的交流和讲述故事的媒介。随着社交媒体和视频共享平台的出现&#xff0c;视频的受欢迎程度直线上升&#xff0c;许多人都在制作和分享自己的内容。然而&#xff0c;对于初学者来说&#xff0c;视…

Java安全—SpringBootActuator监控泄露Swagger自动化

前言 今天依旧是SpringBoot框架&#xff0c;估计还要一篇文章才能把它写完&#xff0c;没办法&#xff0c;Java安全的内容太多了。 Actuator SpringBoot Actuator模块提供了生产级别的功能&#xff0c;比如健康检查&#xff0c;审计&#xff0c;指标收集&#xff0c;HTTP跟踪…

docker快速实现ELK的安装和使用

目录 一、ELK功能原理 二、项目功能展示​ 三、日志查询展示​ 四、ELK安装步骤 1、创建elasticsearch、kibana、filebeat相关data、log、conf目录 2、进入/usr/local/elk目录&#xff0c;并创建一个docker网络 3、启动 elasticsearch容器 4、运行kibana容器 5、启动f…

【Spark】Spark Join类型及Join实现方式

如果觉得这篇文章对您有帮助&#xff0c;别忘了点赞、分享或关注哦&#xff01;您的一点小小支持&#xff0c;不仅能帮助更多人找到有价值的内容&#xff0c;还能鼓励我持续分享更多精彩的技术文章。感谢您的支持&#xff0c;让我们一起在技术的世界中不断进步&#xff01; Sp…

从YOLOv5到训练实战:易用性和扩展性的加强

文章目录 前言一、模型介绍二、YOLOv5网络结构1.Input&#xff08;输入端&#xff09;&#xff1a;智能预处理与优化策略2.Backbone&#xff08;骨干网络&#xff09;&#xff1a;高效特征提取3.NECK&#xff08;颈部&#xff09;&#xff1a;特征增强与多尺度融合4.Prediction…

Java爬虫设计:淘宝商品详情接口数据获取

1. 概述 淘宝商品详情接口&#xff08;如Taobao.item_get&#xff09;允许开发者通过编程方式&#xff0c;以JSON格式实时获取淘宝商品的详细信息&#xff0c;包括商品标题、价格、销量等。本文档将介绍如何设计一个Java爬虫来获取这些数据。 2. 准备工作 在开始之前&#x…

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力

AIGC 013-CoT用思维链挖掘自回归语言模型的潜在能力 文章目录 0 论文工作1 论文方法2 实验结果 0 论文工作 纯自回归式语言模型&#xff0c;本来并不具备优秀推理能力&#xff0c;特别是在数学问题的推理。但是现在的生成模型是能实现一些数学的推理的。研究者认为当模型足够大…

上传文件时获取音视频文件时长和文本文件字数

获取音视频文件时长和文本文件字数 一、获取音视频文件时长二、计算文本文件字数 最近有个需求&#xff0c;要求上传文件时获取音视频文件时长和文本文件字数&#x1f436;。 发现这样的冷门资料不多&#xff0c;特做个记录。本文忽略文件上传功能&#xff0c;只封装核心的工具…