UAF释放后重引用原理

news2024/11/15 4:59:46

原地址:https://blog.csdn.net/qq_31481187/article/details/73612451

原作者代码是基于linux系统的演示代码,因为windows和Linux 内存管理机制上略有不同,该程序在Windows需要稍微做些改动。

  1. Windows上执行free释放malloc函数分配的内存后,内存地址一般不被收回,从Windows7到Windows11都是这样,这一点根Linux完全相同。
  2. Linux上再一次调用malloc后,返回的是上一个fee掉的内存地址;而window不同,free执行后再一次执行malloc,两次的内存地址不同。
  3. 基于第二点,代码没有再次申请内存,而是直接在free掉的内存地址上修改函数指针,达到了同样的效果。

源码如下:




#include <Windows.h>

#include <stdio.h>
#include <cstdlib>
#include <string.h>

#include <stdlib.h>
#include <conio.h>


typedef void (*func_ptr)(char*);


void evil_fuc(char command[])
{
    system(command);
}

void echo(char content[])
{
    printf("%s", content);
}

int main()
{
    func_ptr* p1 = (func_ptr*)malloc(4 * sizeof(int));
    printf("malloc addr: %p\n", p1);
    p1[3] = echo;
    p1[3]((char*)"hello world\n");
    free(p1); //在这里free了p1,但并未将p1置空,导致后续可以再使用p1指针
    p1[3]((char*)"hello again\n"); //p1指针未被置空,虽然free了,但仍可使用.

    p1[3] = evil_fuc; //在这里将p1指针里面保存的echo函数指针覆盖成为了evil_func指针.
    p1[3]((char*)"cmd /c calc.exe");

    _getch();
    return 0;


    func_ptr* p2 = (func_ptr*)malloc(4 * sizeof(int));//malloc在free一块内存后,再次申请同样大小的指针会把刚刚释放的内存分配出来.
    printf("malloc addr: %p\n", p2);
    printf("malloc addr: %p\n", p1);//p2与p1指针指向的内存为同一地址
    p2[3] = evil_fuc; //在这里将p1指针里面保存的echo函数指针覆盖成为了evil_func指针.
    p1[3]((char*)"cmd /c calc.exe");
    return 0;
}

执行结果截图如下:
在这里插入图片描述

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

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

相关文章

javascript期末作业【三维房屋设计】 【源码+文档下载】

1、引入three.js库 官网下载three.js 库 放置目录并引用 引入js文件: 设置场景&#xff08;scene&#xff09; &#xff08;1&#xff09;创建场景对象 &#xff08;2&#xff09;设置透明相机 1,透明相机的优点 透明相机机制更符合于人的视角,在场景预览和游戏场景多有使用…

[gdc23]《战神:诸神黄昏》中的积雪系统

overview gdc23上santa monica带来基于tesselation的displacement map的可交互积雪系统&#xff0c;这是一个对于前作&#xff08;战神4&#xff09;的screen space parallax mapping的升级&#xff0c;而且是一个由自身render programmer在一个项目周期内&#xff0c;完成的&…

代码随想录算法训练营day38 | 70. 爬楼梯,509. 斐波那契数,746. 使用最小花费爬楼梯

目录 动态规划五部曲&#xff1a; 确定dp数组&#xff08;dp table&#xff09;以及下标的含义确定递推公式dp数组如何初始化确定遍历顺序举例推导dp数组 509. 斐波那契数 类型&#xff1a;动态规划 难度&#xff1a;easy 思路&#xff1a; f&#xff08;n&#xff09; f&am…

基于Echarts的大数据可视化模板:智慧门店管理

目录 引言智慧门店管理的重要性Echarts在智慧门店管理中的应用智慧门店概述定义智慧门店的概念和核心智慧门店的关键技术智慧门店的发展趋势与方向智慧门店管理的作用Echarts与大数据可视化Echarts库以及其在大数据可视化领域的应用优势开发过程和所选设计方案模板如何满足管理…

Slingshot | 细胞分化轨迹的这样做比较简单哦!~(一)

1写在前面 今天是医师节&#xff0c;祝各位医护节日快乐&#xff0c;夜班平安&#xff0c;病历全是甲级&#xff0c;没有错误。&#x1f970; 不知道各位医师节的福利是什么&#xff01;&#xff1f;&#x1f602; 我们医院是搞了义诊活动&#xff0c;哈哈哈哈哈哈哈。&#x1…

【SS927V100/22AP70超高清录像机SOC 4KP60】

SS927/22AP70 是一颗面向市场推出的专业超高清智 能网络录像机SoC。该芯片最高支持四路sensor 输入&#xff0c;支持最高4K60的ISP图像处理能力&#xff0c;支持 3F WDR、多级降噪、六轴防抖、硬件拼接等多种 图像增强和处理算法&#xff0c;为用户提供了卓越的图像 处理能力。…

归并排序:从二路到多路

前言 我们所熟知的快速排序和归并排序都是非常优秀的排序算法。 但是快速排序和归并排序的一个区别就是&#xff1a;快速排序是一种内部排序&#xff0c;而归并排序是一种外部排序。 简单理解归并排序&#xff1a;递归地拆分&#xff0c;回溯过程中&#xff0c;将排序结果进…

Servlet 初步学习

文章目录 Servlet1 简介2 快速入门3 执行流程4 生命周期5 方法介绍6 体系结构7 urlPattern配置8 XML配置 Servlet 1 简介 Servlet是JavaWeb最为核心的内容&#xff0c;它是Java提供的一门 动态 web资源开发技术。 使用Servlet就可以实现&#xff0c;根据不同的登录用户在页面…

基于IMX6ULLmini的linux裸机开发系列八:按键处理实验

目录 GIC相关寄存器 GPIO中断相关寄存器 中断服务函数表 中断向量表偏移位置 make有报错 解决方法&#xff1a;error: for loop initial declarations are only allowed in C99 mode_‘for’ loop initial declarations are only allowed i_Young_2717的博客-CSDN博客 GIC…

19-普通组件的注册使用

普通组件的注册使用-局部注册 一. 组件注册的两种方式:1.局部注册:只能在注册的组件内使用 (1) 创建 vue 文件(单文件组件) (2) 在使用的组件内导入,并注册 components:{ 组件名: 组件对象 } // 导入需要注册的组件 import 组件对象 from.vue文件路径 import HmHeader from ./…

element表格多选实现

表格实现多选 实现表格多选很简单&#xff0c;只需要在表格里加上一列即可&#xff0c;加完之后就会在表格里出现一列白色的四方块按钮&#xff0c;可以多选&#xff0c;也可以单选 <el-table-columntype"selection"width"55"align"center"&…

第17集丨Vue中的render函数

目录 一、脚手架中不能使用template配置二、基本使用三、关于不同版本的Vue 一、脚手架中不能使用template配置 // 引入vue import Vue from vue import App from ./Appnew Vue({el:#app,template:<h1>hhh</h1>,comments:{App},})上面案例中&#xff0c;配置了temp…

Python标准库-追踪异常,定位问题-traceback

在日常的编程过程中&#xff0c;我们经常会遇到各种错误和异常。而当程序发生异常时&#xff0c;了解如何有效地追踪异常信息并定位问题&#xff0c;是每个开发者必备的技能之一。 Python 提供了一个强大的工具&#xff0c;称为 Traceback&#xff0c;它可以帮助我们跟踪异常的…

通过 OpenAI 引入superalignment

推荐&#xff1a;使用 NSDT场景编辑器助你快速搭建可二次编辑的3D应用场景 首席执行官Sam Altman曾多次谈到AI的安全性&#xff0c;例如在美国参议院委员会上&#xff0c;他说&#xff1a; “我认为如果这项技术出错&#xff0c;它可能会出错......我们想对此直言不讳。我们希…

Vue 2 处理边界情况

访问元素和组件 通过Vue 2 组件基础一文的学习&#xff0c;我们知道组件之间可以通过传递props或事件来进行通信。 但在一些情况下&#xff0c;我们使用下面的方法将更有用。 1.访问根实例 根实例可通过this.$root获取。 我们在所有子组件中都可以像上面那样访问根实例&…

使用 umap 图形化展示原文在嵌入后的位置情况

使用 umap_plot 图形化展示原文在嵌入后的位置情况 1. 效果展示2. 工具函数3. 示例代码14. 示例代码2 1. 效果展示 2. 工具函数 import umap import altair as altfrom numba.core.errors import NumbaDeprecationWarning, NumbaPendingDeprecationWarning import warningswar…

对前端PWA应用的部分理解和基础Demo

一、什么是PWA应用&#xff1f; 1、PWA简介 ​ 渐进式Web应用&#xff08;Progressive Web App&#xff09;&#xff0c;简称PWA&#xff0c;是 Google 在 2015 年提出的一种使用web平台技术构建的应用程序&#xff0c;官方认为其核心在于Reliable&#xff08;可靠的&#xf…

kubernetes(namespace、pod、deployment、service、ingress)

NameSpace NameSpace名称空间 用来隔离资源&#xff0c;但是不隔离网络 使用命令行&#xff1a; kubectl create ns hello #创建 kubectl delete ns hello #删除 kubectl get ns #查看使用配置文件&#xff1a; vi hello.yamlapiVersion: v1 kind: Namespace metadata:name…

Transformer 相关模型的参数量计算

如何计算Transformer 相关模型的参数量呢&#xff1f; 先回忆一下Transformer模型论文《Attention is all your need》中的两个图。 设Transformer模型的层数为N&#xff0c;每个Transformer层主要由self-attention 和 Feed Forward组成。设self-attention模块的head个数为 …

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测(多指标,多图)

回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09; 目录 回归预测 | MATLAB实现CSO-SVM布谷鸟优化算法优化支持向量机多输入单输出回归预测&#xff08;多指标&#xff0c;多图&#xff09;效果一…