欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创][03] HEVD 内核漏洞之UAF

[原创][03] HEVD 内核漏洞之UAF

0x00 前言

上一节研究了内核栈溢出相关问题,事实上利用已经成功了, 但是源码在vs环境下编译的驱动文件和利用程序,在最后返回时的堆栈平衡出现了问题,由于时间有限,暂时搁置,后面有时间将继续研究。

这一节学习释放后引用漏洞,即UAF。

实验环境:Win10专业版+VMware Workstation 15 Pro+Win7 x86 sp1

实验工具:VS2015+Windbg+KmdManager+DbgViewer


0x01 漏洞原理

UAF

Use After Free 就是其字面所表达的意思,当一个内存块被释放之后再次被使用。但是其实这里有以下几种情况(引用Thunder J师傅的总结,到位):

①内存块被释放后,其对应的指针被设置为 NULL , 然后再次使用,自然程序会崩溃。
②内存块被释放后,其对应的指针没有被设置为 NULL ,然后在它下一次被使用之前,没有代码对这块内存块进行修改,那么程序很有可能可以正常运转。
③内存块被释放后,其对应的指针没有被设置为 NULL,但是在它下一次使用之前,有代码对这块内存进行了修改,那么当程序再次使用这块内存时,就很有可能会出现奇怪的问题。

一般Use After Free 漏洞主要是后两种。

Demo

#include <stdio.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);

}

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功