释放重引用漏洞就是使用到已被释放的内存,最终导致内存崩溃或任意代码执行的漏洞。UAF漏洞在浏览器中最常见,比如IE、Chrome、Firefox等。

通过以下代码对UAF漏洞进行测试和分析:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 32int main(int argc, char **argv) {char *buf1;char *buf2;buf1 = (char *)malloc(size);printf("buf1:0x%p\n", buf1);free(buf1);// 分配 buf2 去“占坑”buf1 的内存位置buf2 = (char *) malloc(size);printf("buf2:0x%p\n\n", buf2);// 对buf2进行内存清零memset(buf2, 0, size);printf("buf2:%d\n", *buf2);// 重引用已释放的buf1指针,但却导致buf2值被篡改printf("==== Use After Free ===\n");strncpy(buf1, "hack", 5);printf("buf2:%s\n\n", buf2);free(buf2);return 0;
}

编译运行后结果如下:

程序通过分配与buf1大小相等的堆块buf2实现“占坑”,使得buf2分配到已释放的buf1内存位置,但由于buf1指针仍然有效,并且指向的内存数据不可预测(可能被堆管理器回收,也可能被其他数据占用填充)。正是这种指针的不可预测性,将buf1指针称为“悬挂指针”,借助悬挂指针buf1将其赋值为“hack”字符串,从而导致buf2也被篡改为“hack”字符串(虽然程序未对buf2赋值,但是buf1与buf2指针指向同一块内存)。

如果原有的漏洞程序引用到悬挂指针指向的数据,用于执行指令或作为索引地址去执行,就有可能导致任意代码执行,前提是用可控数据去“占坑”已释放的对象。

在浏览器UAF漏洞中,通常都是某个C++对象被释放重引用。假设存在一下C++类CTest及实例化对象Test:

class CTest{

int one = 1;           //类成员变量

public:

virtual void vFun1();        //虚函数

virtual void vFun2();

int getOne(){        //类成员函数

return one;

}

}

void main(){

CTest Test;        //实例化类对象

}

此时,Test对象在内存中的布局如下图所示。对象Test开头的内存数据是个虚表指针,用于索引虚函数,后面接成员变量。而成员函数getOne属于执行代码,不属于类对象数据。

再假设此时程序存在释放重引用Test对象漏洞,有个悬挂指针指向以释放的Test对象,要实现对此漏洞的利用,可以通过“占坑”的方式覆盖Test对象的虚表指针,使其指向恶意构造的shellcode。当程序再次引用到Test对象时(比如调用到虚函数vFun1),就可能导致执行任意代码。UAF漏洞利用原理如下图所示:

其中通过索引虚函数表调用虚函数的常见汇编代码形式如下:

mov ecx, [eax]        ; eax指向C++对象,即悬挂指针,而对象头的4字节为虚表指针,所以ecx为虚表指针

call [ecx+4]             ; 通过虚函数表偏移找到指定的虚函数进行调用

释放重引用(Use After Free,UAF)漏洞原理相关推荐

  1. 安全漏洞--释放重引用(UAF)漏洞分析

    一 漏洞简介 未初始化漏洞(UAF)一般是指堆栈变量没有设置就使用导致,或者可能更多的是部分初始化导致. 释放后再用漏洞是堆上的数据被释放后,某个残留地址没清除再用导致.其实就是未初始化漏洞. 二 原 ...

  2. 堆栈上的舞蹈之释放重引用(UAF) 漏洞原理实验分析

    0x01 前言 释放重引用的英文名名称是 Use After Free,也就是著名的 UAF 漏洞的全称.从字面意思可以看出 After Free 就是释放后的内存空间,Use 就是使用的意思,使用释 ...

  3. CVE-2013-1347:从入门到放弃之调试分析令人崩溃的 Microsoft IE CGenericElement UAF 漏洞...

    0x01 2013 年 "水坑" APT 攻击事件 在 2013 年 5 月,美国的劳工部网站被黑,利用的正是 CVE-2013-1347 这个漏洞,在当时导致大量使用 IE8 访 ...

  4. 看雪软件安全精选:二进制各种漏洞原理实战分析总结

    看雪安全二进制漏洞专区0xbird原创 本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器. 0x01栈溢出漏洞原理 栈溢出漏洞属于缓冲区漏洞的一 ...

  5. CVE-2015-3636(pingpong root) android内核 UAF漏洞分析

    前言 去年差不多这个时候就计划把这个漏洞给分析了,由于android没有经常搞,所以踩了很多坑,中间一度因为各种原因停滞放弃,最近遇到一个事情让我下定决心把它了结,也算是解决一个心病.过程会写详细一点 ...

  6. Android内核层驱动程序UAF漏洞提权实例

    文章目录 前言 UAF漏洞 babydriver 环境搭建 漏洞分析 提权exp cred结构 fork()函数 总结 前言 自 2021 年 11 月从国企离职并入职互联网私企后,发现博客很少更新了 ...

  7. 软件安全实验——pre12(UAF漏洞预习)

    目录标题 1.名词解释:double free,UAF (Use After Free),RELRO(Relocation Read Only),Dangling pointer,Control Fl ...

  8. 漏洞学习笔记——UAF漏洞

    UAF即为Use After Free.也就是使用了已经被释放的内存,最终导致内存崩溃或任意代码被执行的漏洞.UAF漏洞常见于浏览器中,如IE.Chrome.Firefox等. 当分配有内存的指针被释 ...

  9. 安卓内核UAF漏洞利用探秘

    雷锋网编者按:8月16日,第三届中国互联网安全领袖峰会(CSS 2017)在北京国家会议中心召开.作为九大分会场之一的腾讯安全探索论坛(TSec)以"安全新探索"为主题,云集了国际 ...

最新文章

  1. VDI序曲二十三 制作OFFICE 2003应用程序虚拟化序列
  2. Ez*** on ASA
  3. 代码恒久远,GitHub 永流传!
  4. 项目管理的十大谈判必杀技
  5. 【转】理解OAuth 2.0
  6. 数学难题html5小游戏答案,小学数学难题讲解及答案
  7. java 截取汉字首字母,java 取汉字首字母
  8. vue 新建的页面如何访问_Vue.js—实现前后端分离架构中前端页面搭建(四)(完)...
  9. 独立站适合做B端吗?外贸B2B独立站怎么做?
  10. myeclipse的优化
  11. 基于opencv利用霍夫变换实现圆形物体的检测
  12. VC知识库1-54期合订本索引文件
  13. 【C语言】指针(野指针)
  14. Activity启动模式singleTask的理解
  15. python画球面投影_Python中球面投影图像的高程畸变
  16. matlab中gen2par函数,R语言中的par()函数终于明白了
  17. 常用算法——解析算法
  18. IDEA中Git的配置及其使用(图文结合,步骤详解)
  19. 系统或应用计算机指令的术语叫什么意思,[计算机软件及应用]BPM术语解释.doc
  20. 基于JAVA口红专卖网站计算机毕业设计源码+数据库+lw文档+系统+部署

热门文章

  1. 谷粒学院(七)讲师列表前端实现
  2. TI的STELLARIS芯片不能使用JTAG仿真器进行仿真
  3. 加密货币开年第一波行情,看看谁涨得最猛
  4. 深入理解中英文字符utf-8编码
  5. 计算机笔记--【并发编程②】
  6. 微信小程序开发(后端Java)
  7. 趋势预测方法(二)其他函数拟合_函数拟合
  8. Ubuntu下运行Swarm Bee节点
  9. PointNet++论文解读和代码解析
  10. 2023东南大学计算机考研经验分享