內核基礎知識介紹:安全
內核概述:Interx86系列處理器使用「環」的概念實施訪問控制,共4個權限級別。通常狀況下,操做系統的內核程序、驅動程序等都在Ring0級別上運行。研究內核漏洞,須要首先掌握一些內核基礎知識、例如內核驅動程序的開發、編譯和運行,以及內核中重要的數據結構等。網絡
驅動編寫之Hello World數據結構
代碼,保存爲Helloworld.c 路徑 D:\0day\HelloWorld\helloworld.c函數
#include <ntddk.h> #define DEVICE_NAME L"\\Device\\HelloWorld" #define DEVICE_LINK L"\\DosDevices\\HelloWorld" // 建立的設備對象指針 PDEVICE_OBJECT g_DeviceObject; // 驅動卸載函數 VOID DriverUnload(IN PDRIVER_OBJECT driverObject){ // 什麼都不用作,打印一句話,helloword就這套路 KdPrint(("DriverUnload: 88!\n")); } // 驅動派遣例程函數 NTSTATUS DrvDispatch(IN PDEVICE_OBJECT driverObject, IN PIRP pIrp){ KdPrint(("Enter DrvDispatch\n")); // 設置IRP的完成狀態 pIrp->IoStatus.Status = STATUS_SUCCESS; // 設置IRP的操做字節數 pIrp->IoStatus.Information = 0; // 完成IRP處理 IoCompleteRequest(pIrp, IO_NO_INCREMENT); return STATUS_SUCCESS; } // 驅動入口函數(至關於main函數) NTSTATUS DriverEntry(IN PDRIVER_OBJECT driverObject, IN PUNICODE_STRING registryPath){ NTSTATUS ntStatus; UNICODE_STRING devname; UNICODE_STRING symLinkName; int i; // 打印一句調試信息 KdPrint(("DriverEntry: Hello world driver demo!")); // 設置該驅動對象的卸載函數 //driverObject->DriverUnload = DriverUnload; // 建立設備 RtlInitUnicodeString(&devname, DEVICE_NAME); ntStatus = IoCreateDevice(driverObject, 0, &devname, FILE_DEVICE_UNKNOWN, 0, TRUE, &g_DeviceObject); if (!NT_SUCCESS(ntStatus)) { return ntStatus; } // 建立符號連接 RtlInitUnicodeString(&symLinkName, DEVICE_LINK); ntStatus = IoCreateSymbolicLink(&symLinkName, &devname); if (!NT_SUCCESS(ntStatus)){ IoDeleteDevice(g_DeviceObject); return ntStatus; } // 設置該驅動對象的派遣例程函數 for (i = 0; i < IRP_MJ_MAXIMUM_FUNCTION; i++){ driverObject->MajorFunction[i] = DrvDispatch; } // 返回成功結果 return STATUS_SUCCESS; }
安裝WDK工具
檢查安裝學習
安裝成功ui
build後的結果和做者不同spa
排查,是細節問題,忘記改文件名後綴了,哈哈,編譯成功操作系統
不能直接雙擊運行,使用工具運行,設計
這不能像exe那樣運行,須要做爲內核模塊來加載和運行
咱們能夠在用戶態使用服務管理器建立服務,將xxx.sys和服務關聯在一塊兒,經過啓動服務向內核加載xxx.sys
查看代碼,與做者代碼比對,去掉註釋。
驅動能夠安裝,開啓,卸載
派遣例程與IRP結構
IRP「輸入/輸出請求包」,Ring3經過DeviceIoControl等函數向驅動發出I/O請求,在內核中由操做系統轉化爲IRP的數據結構,並「派遣」到對應驅動的派遣函數中
XP下打不開,用win8打開的,文檔中保函的屬性沒有書裏面說的多,做者說的0x1b,27個
使用PDB輔助工具查閱內核數據結構信息(SymbolTypeViewer,PEB explorer)
S 看完沒有成功下載pdb文件,網絡沒問題
後兩節稍微看了看
Ring3打開驅動設備
Ring3訪問設備時要求建立符號連接,Ring3能夠經過CreateFile函數打開設備。「\\.\DosDeviceName」格式。
Ring3/Ring0四種通訊方式
METHOD_BUFFERED:緩衝區方式、METHOD_IN_DIRECT、METHOD_OUT-DIRECT、:對Ring3的輸入緩衝區進行緩衝,對Ring3的輸出緩衝區沒有緩衝。METHOD_NEITHER:其餘方式
緩衝方式,
內核調試入門
建立內核調試環境
《軟件調試》一書講的多。
內核調試主要三種:1,硬件調試。2,內核中插入用於調試的中斷處理函數和驅動程序。3,系統內核中加入調試支持,三種連接方式:串行口,1394,usb2.0.
本書「利用命名管道模擬串行端口」:原理:虛擬一個串行端口,映射到宿主機的命名管道上,虛擬機中全部對該串口的讀寫操做都會被虛擬機管理軟件轉換爲對宿主系統中命名管道的讀寫。缺點:硬件相關驅動調試不了,涉及底層操做(中斷、異常、I/O)函數或指令可能致使虛擬機重啓,CPU佔用路高,90%以上。
搭建調試內核的環境
須要兩個,WinDbg,VMware
設置串口,,
此處打鉤
修改啓動配置文件
增長系統啓動選項
恢復保護屬性
關機
設置WinDbg參數 目標後面加上
-b -k com:port=\\.\pipe\com_1,baud=115200,pipe
(須要把打印機移除)
選擇調試系統
出現此問題,須要將打印機移除,並從新添加串口模式。
成功
藍屏分析:(之後學習調試內核的時候補上)
"啓動和故障恢復",完整轉儲,內核轉儲,小型內存轉儲。
內核漏洞概述
內核漏洞的分類:
按照嚴重程度: 遠程拒絕服務、本地拒絕服務、遠程任意代碼執行、本地權限提高。
按漏洞利用原理分類:拒絕服務、緩衝區溢出、內存篡改:任意地址寫任意數據,固定地址寫任意數據,任意地址寫固定數據、設計缺陷。
內核漏洞研究過程:
4個過程:漏洞重現,漏洞分析,漏洞利用,漏洞總結。
內核漏洞挖掘:手工、工具,加上經驗與知識。 go on
編寫安全的驅動程序:
開發者角度:未驗證輸入、輸出,未驗證調用者,代碼邏輯錯誤,系統設計存在安全缺陷等
1,輸入、輸出檢查:對不可信的輸入輸出地址及數據長度進行合法性檢查。
2,驗證驅動的調用者
3,白名單機制的挑戰