欢迎来到 嗅灵易学

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

[原创][07] HEVD 内核漏洞之任意内存覆盖

[原创][07] HEVD 内核漏洞之任意内存覆盖

0x00 前言

这一节,学习一下任意内存覆盖,本篇相对比较简单。

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

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

0x01 漏洞原理

分析

打开驱动程序代码,可以看到ArbitraryWrite.c中,漏洞函数是这样的:

NTSTATUS

TriggerArbitraryWrite(

    _In_ PWRITE_WHAT_WHERE UserWriteWhatWhere

)

{

    PULONG_PTR What = NULL;

    PULONG_PTR Where = NULL;

    NTSTATUS Status = STATUS_SUCCESS;

    PAGED_CODE();

    __try

    {

        //

        // Verify if the buffer resides in user mode

        //

        ProbeForRead((PVOID)UserWriteWhatWhere, sizeof(WRITE_WHAT_WHERE), (ULONG)__alignof(UCHAR));

        What = UserWriteWhatWhere->What;

        Where = UserWriteWhatWhere->Where;

        DbgPrint("[+] UserWriteWhatWhere: 0x%p\n", UserWriteWhatWhere);

        DbgPrint("[+] WRITE_WHAT_WHERE Size: 0x%X\n", sizeof(WRITE_WHAT_WHERE));

        DbgPrint("[+] UserWriteWhatWhere->What: 0x%p\n", What);

        DbgPrint("[+] UserWriteWhatWhere->Where: 0x%p\n", Where);

#ifdef SECURE

        //

        // Secure Note: This is secure because the developer is properly validating if address

        // pointed by 'Where' and 'What' value resides in User mode by calling ProbeForRead()/

        // ProbeForWrite() routine before performing the write operation

        //

        ProbeForRead((PVOID)What, sizeof(PULONG_PTR), (ULONG)__alignof(UCHAR));

        ProbeForWrite((PVOID)Where, sizeof(PULONG_PTR), (ULONG)__alignof(UCHAR));

        *(Where) = *(What);

#else

        DbgPrint("[+] Triggering Arbitrary Write\n");

        //

        // Vulnerability Note: This is a vanilla Arbitrary Memory Overwrite vulnerability

        // because the developer is writing the value pointed by 'What' to memory location

        // pointed by 'Where' without properly validating if the values pointed by 'Where'

        // and 'What' resides in User mode

        //

        *(Where) = *(What);

#endif

    }

    __except (EXCEPTION_EXECUTE_HANDLER)

    {

        Status = GetExceptionCode();

        DbgPrint("[-] Exception Code: 0x%X\n", Status);

    }

    //

    // There is one more hidden vulnerability. Find it out.

    return Status;

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

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

0 0 0 举报
复制成功