本文將向讀者介紹一種通過處理器的調(diào)試機制來實現(xiàn)Rootkit的隱形的技術。這種技術的特點是,無需利用系統(tǒng)的缺陷,直接處理器的正常功能就能達到隱形的目的。本文將以Linux系統(tǒng)為例來介紹如何實現(xiàn)基于調(diào)試寄存器的隱形方法。
一、概述
幾年來,用于在攻陷的機器上實現(xiàn)隱形技術和方法越來越多,讓人目不暇接。其中,有一些直接篡改系統(tǒng)調(diào)用表,有一些修改中斷處理程序,凡此種種,在此不再一一列舉。不過,這些方法的共同之處在于,都以可見的形式修改了底層的操作系統(tǒng),這使得它們很容易被發(fā)現(xiàn)。
本文中,筆者利用調(diào)試機制這一x86平臺的共同特性,用內(nèi)核級Rootkit實現(xiàn)了終極的隱形。雖然該方法通用于所有IA-32兼容平臺,但我們這里以Linux操作系統(tǒng)為例,講解如何在不碰鉤子技術的各種“傳統(tǒng)”目標(如系統(tǒng)調(diào)用表、中斷處理程序等)的情況下攔截正常執(zhí)行流程的技術。 實際上,這種隱形技術是如此高超,以至于還沒有人發(fā)現(xiàn)我們的存在。
在本文中,當我們說“調(diào)試器”時,實際上指的是只能從ring 0訪問的IA-32的調(diào)試機制,對于用戶空間的調(diào)試程序來說,是無法利用這個機制的,只有某些內(nèi)核調(diào)試工具才能使用這個機制。
二、處理器的調(diào)試機制
為了讓開發(fā)人員過得更輕松些,Intel公司引入了一個機制來處理調(diào)試過程。按照Intel公司的用戶手冊的說法,“IA-32架構(gòu)提供了大量的調(diào)試設施,供調(diào)試代碼、監(jiān)視代碼執(zhí)行和處理器性能之用。這些設施對調(diào)試應用程序軟件、系統(tǒng)軟件和多任務操作系統(tǒng)都是非常重要的 ”。開發(fā)人員可以通過一組專用寄存器(稱為調(diào)試寄存器,從DR0至DR7)來使用該機制,這樣他們就可以根據(jù)內(nèi)存地址來設置硬件斷點了。一旦執(zhí)行流到達帶有斷點標記的地址,控制權就會交給調(diào)試中斷處理程序(INT 1),該處理程序繼而調(diào)用do_debug()函數(shù)(定義在/i386/kernel/traps.c文件中)來處理引起異常的實際情況。
可以通過調(diào)試寄存器(DB0~DB7)和兩個與模式特定的寄存器(MSR)來訪問這種調(diào)試支持。對本文而言,我們只需關心調(diào)試寄存器就行了。這些寄存器存放的是內(nèi)存地址和I/O位置,我們將其稱之為斷點。斷點既可以是用戶在程序中選定的位置(指令斷點),也可以是內(nèi)存中的數(shù)據(jù)存儲區(qū)(數(shù)據(jù)斷點),還可以是指定的I/O端口(I/O斷點),程序員或者系統(tǒng)設計人員通常希望程序在這些指定的地方停下來,以便調(diào)用調(diào)試軟件來檢查處理器的狀態(tài)。
當內(nèi)存或I/O設備訪問某個斷點地址時,就會引起一個調(diào)試異常(#DB)。我們可以進一步為斷點規(guī)定引起中斷的具體的內(nèi)存訪問方式或者I/O訪問方式,例如一個內(nèi)存讀和/或?qū)懖僮骰蛘逫/O讀和/或?qū)懖僮鳎匆砸?guī)定之外的方式訪問該斷點時不會引起中斷)。調(diào)試寄存器同時支持指令斷點和數(shù)據(jù)斷點。MSR是從P6系列處理器開始引入IA-32架構(gòu)的,它用于監(jiān)視分支、中斷和異常,并記錄下最后分支、中斷或者異常所使用的源地址和目的地址,以及最后中斷或者異常之前發(fā)生的分支的源地址和目的地址。
共5頁: 1 [2] [3] [4] [5] 下一頁 | |||||||
|