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

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

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

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define size 32
 
int 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]             ; 通过虚函数表偏移找到指定的虚函数进行调用

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值