深入理解Os--调用劫持

1.调用劫持
以Linux系统为例,介绍三种可实现调用劫持的技术。

1.1.编译时调用劫持
以一个实例展开介绍
在这里插入图片描述
(1).main.cpp

#include <stdio.h>
#include <malloc.h>
int main()
{
	int* p = (int*)malloc(32);
	free(p);
	return (0);
}

(2).mymalloc.cpp

#include <stdio.h>
#include <malloc.h>
void* mymalloc(size_t nS)
{
    printf("mymalloc\n");
    return malloc(nS);
}

void myfree(void* p)
{
    printf("myfree\n");
    free(p);
}

(3).malloc.h

#pragma once
#define malloc(nS) mymalloc(nS)
#define free(ptr) myfree(ptr)
void* mymalloc(size_t);
void myfree(void*);

(4).makefile

t2 : t1
	g++ -std=c++11 -I. main.cpp mymalloc.o

t1 :
	g++ -std=c++11 mymalloc.cpp -c

clean :
	rm *.o *.out

这样我们编译得到mymalloc.o过程中,mymalloc.cpp的头文件malloc.h将在默认搜索路径中搜索。这样搜索得到的malloc,free将是 c 库中定义的符号。

我们编译main.cpp为main.o过程中由于指定了-I.,所以,会优先在当前目录下搜索main.cpp中的头文件,这样将采用我们自定义的malloc.h,这样main.cpp中对malloc,free的引用将由于宏替换变为引用mymalloc,myfree。这样在基于main.o,mymalloc.o链接得到可执行程序a.out的过程中,main.o中对mymalloc,myfree的引用将关联到mymalloc.o中的定义。mymalloc.o中对malloc,free的引用将关联到c库中的符号定义。进而达到了调用劫持效果。

这里为了达到引用劫持,我们需要干预main.cpp的编译过程。

1.2.链接时劫持
以一个实例展开介绍
在这里插入图片描述
(1). main.cpp

#include <stdio.h>
#include <malloc.h>

int main()
{
    int *p = (int*)malloc(32);
    free(p);
    return 0;
}

(2). mymalloc.cpp

#include <stdio.h>
extern "C" void *__real_malloc(size_t size);
extern "C" void __real_free(void *ptr);
extern "C" void *__wrap_malloc(size_t size)
{
    void *ptr = __real_malloc(size);
    printf("malloc(%d)=%p\n", (int)size, ptr);
    return ptr;
}

extern "C" void __wrap_free(void *ptr)
{
    __real_free(ptr);
    printf("free(%p)\n", ptr);
}

(3). makefile

t : t1 t2
	g++ -std=c++11 -Wl,--wrap,malloc -Wl,--wrap,free main.o mymalloc.o
t1 :
	g++ -std=c++11 mymalloc.cpp -c
t2 :
	g++ -std=c++11 main.cpp -c

我们编译得到mymalloc.o的过程中,按常规方式编译即可。注意,这里对引用的符号__real_malloc__real_free和定义的符号__wrap_malloc__wrap_free均加了extern "C"修饰,这是为了使得通过c++编译器编译时,放置符号名被编译器重新命名。

我们编译得到main.o的过程中,按常规方式编译即可。

我们之所以可以劫持main.cpp中对malloc,free的调用,是因为通过main.o,mymalloc.o链接得到可执行程序过程中我们使用了-Wl,--wrap,malloc-Wl,--wrap,free编译选项。

-Wl,--wrap,malloc可以达到的效果是,将所有引用malloc的地方替换为对__wrap_malloc的引用。将所有引用__real_malloc的地方替换为对malloc的引用。
-Wl,--wrap,free可以达到的效果是,将所有引用free的地方替换为对__wrap_free的引用。将所有引用__real_free的地方替换为对free的引用。

这样通过上述引用替换后,重定位阶段main.o中将分别重定位到对mymalloc.o中定义符号的引用。mymalloc.o中将分别重定位到对 C 库中定义符号的引用。

这里为了达到引用劫持,我们需要干预得到可执行程序的链接过程。

1.3.运行时劫持
以一个实例展开介绍
在这里插入图片描述
(1). main.cp

#include <stdio.h>
#include <malloc.h>

int main()
{
    int *p = (int*)malloc(32);
    free(p);
    return 0;
}

(2).mymalloc.cpp

#include <stdio.h>
#include <stdlib.h>
#include <dlfcn.h>

typedef void *(*Mallocp)(size_t size);
typedef void (*Freep)(void*);
void* malloc(size_t size)
{
    Mallocp mallocp;
    char *error;
    mallocp = (Mallocp)dlsym(RTLD_NEXT, "malloc");
    if((error = dlerror()) != NULL)
    {
        fputs(error, stderr);
        exit(1);
    }

    char *ptr = (char*)mallocp(size);
    printf("malloc(%d) = %p\n", (int)size, ptr);
    return ptr;
}

void free(void *ptr)
{
    Freep freep;
    char *error;
    if(!ptr)
        return;
    freep = (Freep)dlsym(RTLD_NEXT, "free");
    if((error = dlerror()) != NULL)
    {
        fputs(error, stderr);
        exit(1);
    }

    freep(ptr);
    printf("free(%p)\n", ptr);
}

(3).makefile

t : t1
	g++ -std=c++11 main.cpp
t1 :
	g++ -shared -fpic -o mymalloc.so mymalloc.cpp -ldl

上述过程,我们维持可执行程序编译链接的过程。
我们通过一个额外的动态库,这个动态库里面对我们想劫持的调用提供了新的定义。
(4).s.sh

export LD_PRELOAD="./mymalloc.so" 
./a.out

我们通过在启动可执行进程前,设置LD_PRELOAD,使得,可执行程序执行前首先加载LD_PRELOAD中指定的动态库。
这样,后续可执行程序加载运行时,需要执行对动态链接符号的重定位时,将优先搜索LD_PRELOAD中的库是否提供了符号定义,若提供,则采用库中定义的版本。这样,main.cpp中对malloc,free的引用会被重定位到我们提供的动态库中的版本。
我们动态库中想使用c库中定义的malloc,free时,采用dlsym的方式。通过参数 1 指定RTLD_NEXT来使得跳过LD_PRELOAD库中的定义,继续向后寻找符号定义,最终将其关联到 c 库中的符号定义。

这里为了达到引用劫持,无需干预可执行程序的编译链接过程。只需在启动脚本设置LD_PRELOAD并提供实现了想劫持调用的动态库即可。具有最大的灵活性,最易于实现。

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

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

相关文章

好代码资源网整站打包代码(包含了最新数据),集成了深度二开的ripro主题,非常适合做资源网站创业用

好代码资源网是基于wordpress开发的一个资源分享类网站&#xff0c;在开发者圈子里还算小有名气&#xff0c;这里分享婴整站打包代码&#xff08;包含了最新数据&#xff09;。网站本身集成了深度二开的ripro主题&#xff0c;非常适合做资源网站创业用。 资源下载类网站目前还…

使用条件格式突出显示单元格数据-sdk

使用条件格式突出显示单元格数据 2023 年 12 月 6 日 根据数据值将视觉提示应用于特定单元格、行或列&#xff0c;从而更轻松地识别模式和趋势。 网格中的条件格式允许用户根据单元格或范围包含的数据将视觉样式应用于单元格或范围。它通过以数据驱动的方式突出显示关键值、异常…

Servlet should have a mapping

第一种可能&#xff1a; 你就是没写Servlet <servlet><servlet-name>SpringMVC</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><!-- 配置springMVC需要加载的配置文件--><init-par…

【C语言】——函数递归,用递归简化并实现复杂问题

文章目录 前言一、什么是递归二、递归的限制条件三、递归举例1.求n的阶乘2. 举例2&#xff1a;顺序打印一个整数的每一位 四、递归的优劣总结 前言 不多废话了&#xff0c;直接开始。 一、什么是递归 递归是学习C语言函数绕不开的⼀个话题&#xff0c;那什么是递归呢&#xf…

gittee使用教学

一、git简介 Git是一个开源的分布式版本控制系统&#xff0c;用于敏捷高效的处理任何大小项目的版本管理。 核心功能&#xff1a; 项目的版本管理 团队协同开发 二、准备工作 1、下载 Git 2、除了选择安装位置以外&#xff0c;其他都无脑安装 3、检查一下安装情况 win…

Qt 5.15.2 三维显示功能

Qt 5.15.2 三维显示功能 三维显示效果&#xff1a; .pro项目文件 QT core gui opengl 3dcore 3drender 3dinput 3dextrasgreaterThan(QT_MAJOR_VERSION, 4): QT widgetsCONFIG c17# You can make your code fail to compile if it uses deprecated APIs. # In ord…

【数据结构(九)】顺序存储二叉树(2)

文章目录 1. 相关概念2. 顺序存储二叉树的遍历 1. 相关概念 从数据存储来看&#xff0c;数组存储方式和树的存储方式可以相互转换&#xff0c;即数组可以转换成树&#xff0c;树也可以转换成数组&#xff0c;看右面的示意图。 转换原则:     1.上图的二叉树的结点&#xff…

低代码:轻松构建应用程序的新时代

在当今数字化时代&#xff0c;应用程序对于日常企业业务的开展&#xff0c;已经成为一种刚需。然而&#xff0c;应用程序开发的过程往往耗时耗力&#xff0c;对于企业来讲&#xff0c;是一笔不小的成本开支。低代码问世以来&#xff0c;一直在尝试为业务人员赋能&#xff0c;让…

通过Mock玩转Golang单元测试!

1.单元测试中的困难 如果项目中没有单元测试&#xff0c;对于刚刚开始或者说是规模还小的项目来说&#xff0c;效率可能还不错。但是一旦项目变得复杂起来&#xff0c;每次新增功能或对旧功能的改动都要重新手动测试一遍所有场景&#xff0c;费时费力&#xff0c;而且还有可能…

JS加密/解密之HOOK实战2

上一篇文章介绍了HOOK常规的应用场景&#xff0c;这篇我们讲一下HOOK其他原生函数。又是一个新的其他思路 很多时候&#xff0c;当我们想要某些网站的请求参数的时候&#xff0c;因为某些加密导致了获取起来很复杂。 这时候hook就十分方便了 源代码 var _JSON_Parse JSON.…

ShardingSphere数据分片之分表操作

1、概述 Apache ShardingSphere 是一款分布式的数据库生态系统&#xff0c; 可以将任意数据库转换为分布式数据库&#xff0c;并通过数据分片、弹性伸缩、加密等能力对原有数据库进行增强。 Apache ShardingSphere 设计哲学为 Database Plus&#xff0c;旨在构建异构数据库上…

基于ssm高校实验室管理系统的设计与实现论文

摘 要 互联网发展至今&#xff0c;无论是其理论还是技术都已经成熟&#xff0c;而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播&#xff0c;搭配信息管理工具可以很好地为人们提供服务。针对高校实验室信息管理混乱&#xff0c;出错率高&#xff0c;信息安全性…

(二)五种最新算法(SWO、COA、LSO、GRO、LO)求解无人机路径规划MATLAB

一、五种算法&#xff08;SWO、COA、LSO、GRO、LO&#xff09;简介 1、蜘蛛蜂优化算法SWO 蜘蛛蜂优化算法&#xff08;Spider wasp optimizer&#xff0c;SWO&#xff09;由Mohamed Abdel-Basset等人于2023年提出&#xff0c;该算法模型雌性蜘蛛蜂的狩猎、筑巢和交配行为&…

区块链实验室(29) - 关闭或删除FISCO日志

1. FISCO日志 缺省情况下&#xff0c;FISCO启动日志模块&#xff0c;日志记录的位置在节点目录中。以FISCO自带案例为例&#xff0c;4节点的FISCO网络&#xff0c;24个区块产生的日志大小&#xff0c;见下图所示。 2.关闭日志模块 当节点数量增大&#xff0c;区块高度增大时&…

CMake ‘3.10.2‘ was not found in PATH or by cmake.dir property.

在部署Yolov5到安卓端的过程中出现&#xff1a;CMake ‘3.10.2’ was not found in PATH or by cmake.dir property. 原因&#xff1a; cmake版本太高&#xff0c;需要安装低版本的cmake 最开始下载的是默认最高版本的cmake,默认是3.22.1&#xff0c;解决方案是&#xff0c;下载…

MarsEdit 5 for Mac(博客编辑软件) - 博客创作的完美拍档!

您是一位热爱写作和分享的博主吗&#xff1f;如果是的话&#xff0c;那么MarsEdit 5 for Mac将成为您创作之旅中的完美拍档&#xff01;这款博客编辑软件为Mac用户提供了无与伦比的便捷和灵活性。 MarsEdit 5具有直观的界面和强大的功能&#xff0c;让您轻松管理和编辑多个博客…

使用 PyTorch 完全分片数据并行技术加速大模型训练

本文&#xff0c;我们将了解如何基于 PyTorch 最新的 完全分片数据并行 (Fully Sharded Data Parallel&#xff0c;FSDP) 功能用 Accelerate 库来训练大模型。 动机 &#x1f917; 随着机器学习 (ML) 模型的规模、大小和参数量的不断增加&#xff0c;ML 从业者发现在自己的硬件…

什么是网站劫持

网站劫持是一种网络安全威胁&#xff0c;它通过非法访问或篡改网站的内容来获取机密信息或者破坏计算机系统。如果您遇到了网站劫持问题&#xff0c;建议您立即联系相关的安全机构或者技术支持团队&#xff0c;以获得更专业的帮助和解决方案。

短视频矩阵系统多账号搭建技术源码(源头3年开发者技术独立搭建)

一、短视频账号矩阵系统源码搭建源码步骤&#xff1a; 1. 选择适合的云服务环境搭建虚拟机。这里以AWS为例&#xff0c;购买并配置相应数量的EC2实例以及相应的网络设置。 2. 根据需要搭建多个抖音、快手等平台的官方账号&#xff0c;并根据各个平台的要求和规则进行内容创作和…

Web漏洞扫描工具有哪些?使用教程讲解

作为网络安全工程师&#xff0c;了解并掌握各种Web漏洞扫描工具对于识别和防御网络威胁至关重要。以下是一些常用且广受推崇的Web漏洞扫描工具&#xff0c;它们覆盖了从自动扫描到深度定制的各种需求。希望你能用得到呢。 1. OWASP ZAP (Zed Attack Proxy) 原理&#xff1a;…