释放重引用(Use After Free,UAF)漏洞原理
释放重引用漏洞就是使用到已被释放的内存,最终导致内存崩溃或任意代码执行的漏洞。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)漏洞原理相关推荐
- 安全漏洞--释放重引用(UAF)漏洞分析
一 漏洞简介 未初始化漏洞(UAF)一般是指堆栈变量没有设置就使用导致,或者可能更多的是部分初始化导致. 释放后再用漏洞是堆上的数据被释放后,某个残留地址没清除再用导致.其实就是未初始化漏洞. 二 原 ...
- 堆栈上的舞蹈之释放重引用(UAF) 漏洞原理实验分析
0x01 前言 释放重引用的英文名名称是 Use After Free,也就是著名的 UAF 漏洞的全称.从字面意思可以看出 After Free 就是释放后的内存空间,Use 就是使用的意思,使用释 ...
- CVE-2013-1347:从入门到放弃之调试分析令人崩溃的 Microsoft IE CGenericElement UAF 漏洞...
0x01 2013 年 "水坑" APT 攻击事件 在 2013 年 5 月,美国的劳工部网站被黑,利用的正是 CVE-2013-1347 这个漏洞,在当时导致大量使用 IE8 访 ...
- 看雪软件安全精选:二进制各种漏洞原理实战分析总结
看雪安全二进制漏洞专区0xbird原创 本部分将对常见的二进制漏洞做系统分析,方便在漏洞挖掘过程中定位识别是什么类型漏洞,工欲善其事,必先利其器. 0x01栈溢出漏洞原理 栈溢出漏洞属于缓冲区漏洞的一 ...
- CVE-2015-3636(pingpong root) android内核 UAF漏洞分析
前言 去年差不多这个时候就计划把这个漏洞给分析了,由于android没有经常搞,所以踩了很多坑,中间一度因为各种原因停滞放弃,最近遇到一个事情让我下定决心把它了结,也算是解决一个心病.过程会写详细一点 ...
- Android内核层驱动程序UAF漏洞提权实例
文章目录 前言 UAF漏洞 babydriver 环境搭建 漏洞分析 提权exp cred结构 fork()函数 总结 前言 自 2021 年 11 月从国企离职并入职互联网私企后,发现博客很少更新了 ...
- 软件安全实验——pre12(UAF漏洞预习)
目录标题 1.名词解释:double free,UAF (Use After Free),RELRO(Relocation Read Only),Dangling pointer,Control Fl ...
- 漏洞学习笔记——UAF漏洞
UAF即为Use After Free.也就是使用了已经被释放的内存,最终导致内存崩溃或任意代码被执行的漏洞.UAF漏洞常见于浏览器中,如IE.Chrome.Firefox等. 当分配有内存的指针被释 ...
- 安卓内核UAF漏洞利用探秘
雷锋网编者按:8月16日,第三届中国互联网安全领袖峰会(CSS 2017)在北京国家会议中心召开.作为九大分会场之一的腾讯安全探索论坛(TSec)以"安全新探索"为主题,云集了国际 ...
最新文章
- VDI序曲二十三 制作OFFICE 2003应用程序虚拟化序列
- Ez*** on ASA
- 代码恒久远,GitHub 永流传!
- 项目管理的十大谈判必杀技
- 【转】理解OAuth 2.0
- 数学难题html5小游戏答案,小学数学难题讲解及答案
- java 截取汉字首字母,java 取汉字首字母
- vue 新建的页面如何访问_Vue.js—实现前后端分离架构中前端页面搭建(四)(完)...
- 独立站适合做B端吗?外贸B2B独立站怎么做?
- myeclipse的优化
- 基于opencv利用霍夫变换实现圆形物体的检测
- VC知识库1-54期合订本索引文件
- 【C语言】指针(野指针)
- Activity启动模式singleTask的理解
- python画球面投影_Python中球面投影图像的高程畸变
- matlab中gen2par函数,R语言中的par()函数终于明白了
- 常用算法——解析算法
- IDEA中Git的配置及其使用(图文结合,步骤详解)
- 系统或应用计算机指令的术语叫什么意思,[计算机软件及应用]BPM术语解释.doc
- 基于JAVA口红专卖网站计算机毕业设计源码+数据库+lw文档+系统+部署