計(jì)算機(jī)病毒技術(shù)及其防御 課件 第5、6章-計(jì)算機(jī)病毒傳播、計(jì)算機(jī)病毒潛伏_第1頁
計(jì)算機(jī)病毒技術(shù)及其防御 課件 第5、6章-計(jì)算機(jī)病毒傳播、計(jì)算機(jī)病毒潛伏_第2頁
計(jì)算機(jī)病毒技術(shù)及其防御 課件 第5、6章-計(jì)算機(jī)病毒傳播、計(jì)算機(jī)病毒潛伏_第3頁
計(jì)算機(jī)病毒技術(shù)及其防御 課件 第5、6章-計(jì)算機(jī)病毒傳播、計(jì)算機(jī)病毒潛伏_第4頁
計(jì)算機(jī)病毒技術(shù)及其防御 課件 第5、6章-計(jì)算機(jī)病毒傳播、計(jì)算機(jī)病毒潛伏_第5頁
已閱讀5頁,還剩223頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

MalwarePrinciples&Prevention計(jì)算機(jī)病毒技術(shù)及其防御

ComputerVirusTechnology&ItsDefense主講人:張瑜第五章ChapterFivePropagationofComputerVirus計(jì)算機(jī)病毒傳播前言PREFACE作為網(wǎng)絡(luò)空間的人工生命體,計(jì)算機(jī)病毒傳播是其發(fā)揮影響力的關(guān)鍵因素之一。任何計(jì)算機(jī)病毒都必須借助各種途徑傳播出去,才能真正實(shí)現(xiàn)其威脅目的。與生物病毒類似,計(jì)算機(jī)病毒的傳播也需借助附著體和傳播途徑才能完成。從附著體的角度來看,計(jì)算機(jī)病毒的傳播方式很多,主要通過文件寄生、實(shí)體注入、漏洞利用等方法將病毒附著于傳播體上。從傳播途徑的角度來看,盡管存在多種計(jì)算機(jī)病毒傳播擴(kuò)散的方法,但社會工程學(xué)無疑是最直接有效的傳播方法。本章將從文件寄生、實(shí)體注入、漏洞利用及社會工程學(xué)等層面探討計(jì)算機(jī)病毒傳播技術(shù)方法。蜂蝶紛紛過墻去,卻疑春色在鄰家?!啤ね躐{1文件寄生目錄2實(shí)體注入3漏洞利用4社會工程學(xué)1CHAPTER文件寄生可執(zhí)行文件寄生數(shù)據(jù)文件寄生本章前言作為網(wǎng)絡(luò)空間的人工生命體,計(jì)算機(jī)病毒傳播是其發(fā)揮影響力的關(guān)鍵因素之一。任何計(jì)算機(jī)病毒都必須借助各種途徑傳播出去,才能真正實(shí)現(xiàn)其威脅目的。與生物病毒類似,計(jì)算機(jī)病毒傳播也需借助附著體與傳播途徑才能完成傳播。從附著體的角度來看,計(jì)算機(jī)病毒傳播方式很多,主要通過文件寄生、實(shí)體注入、漏洞利用等方法實(shí)現(xiàn)將病毒附著于傳播體。從傳播途徑的角度來看,盡管存在著多種計(jì)算機(jī)病毒傳播擴(kuò)散方法,但社會工程學(xué)無疑是最直接有效的傳播方法。本章將從文件寄生、實(shí)體注入、漏洞利用以及社會工程學(xué)等層面探討計(jì)算機(jī)病毒傳播技術(shù)方法??蓤?zhí)行文件簡介WindowsLinuxWindows系統(tǒng)支持PE(PortableExecutable)文件格式Linux系統(tǒng)支持ELF(ExecutableandLinkingFormat)文件格式。PE文件和ELF文件非常相似可執(zhí)行文件是操作系統(tǒng)中支持的原生態(tài)可直接運(yùn)行的文件。每種操作系統(tǒng)都有其支持的可執(zhí)行文件格式?;A(chǔ)知識可執(zhí)行文件簡介WindowsLinuxUnixPE文件和ELF文件非常相似,都源于UNIX系統(tǒng)的可執(zhí)行文件格式COFF(Common

ObjectFileFormat)。只要將文件設(shè)計(jì)為可執(zhí)行文件格式,則可在相應(yīng)操作系統(tǒng)中運(yùn)行。可執(zhí)行文件寄生是計(jì)算機(jī)病毒最感興趣最易實(shí)現(xiàn)的傳播方式,借助所寄生的可執(zhí)行文件的執(zhí)行而運(yùn)行病毒自身。計(jì)算機(jī)病毒應(yīng)該怎么做才能感染主機(jī)?由于PE文件是Windows系統(tǒng)的可執(zhí)行文件格式,Windows系統(tǒng)環(huán)境中的程序執(zhí)行多借助PE文件加載機(jī)制完成,因此計(jì)算機(jī)病毒可通過寄生于Windows

PE文件并借助PE文件執(zhí)行機(jī)制完成病毒自身執(zhí)行與后續(xù)感染傳播。在掌握PE文件格式的基礎(chǔ)上,本節(jié)將介紹計(jì)算機(jī)病毒利用PE文件實(shí)現(xiàn)寄生感染、完成傳播的原理與實(shí)踐。計(jì)算機(jī)病毒為完成上述寄生任務(wù),應(yīng)包含如下功能:添加標(biāo)題單擊此處添加文本具體內(nèi)容添加標(biāo)題單擊此處添加文本具體內(nèi)容添加標(biāo)題單擊此處添加文本具體內(nèi)容添加標(biāo)題單擊此處添加文本具體內(nèi)容添加標(biāo)題單擊此處添加文本具體內(nèi)容添加標(biāo)題單擊此處添加文本具體內(nèi)容病毒重定位API函數(shù)獲取目標(biāo)文件搜索內(nèi)存映射文件感染目標(biāo)文件返回宿主程序病毒重定位簡介由于在程序編譯時(shí)已計(jì)算好相關(guān)變量或常量的內(nèi)存位置,當(dāng)程序被加載執(zhí)行時(shí),系統(tǒng)無須為其重定位,因此正常程序不用關(guān)心其變量和常量的位置。計(jì)算機(jī)病毒也是一種程序,同樣需要使用相關(guān)變量或常量。但當(dāng)病毒感染宿主程序時(shí),由于其寄生在宿主程序中的位置各不相同,在病毒隨宿主程序載入內(nèi)存后,勢必導(dǎo)致病毒中的各個(gè)變量或常量的位置發(fā)生改變。如果病毒仍然使用變量或常量的原有編譯位置,將導(dǎo)致其無法正常運(yùn)行。此時(shí),病毒需借助重定位機(jī)制,完成對變量或常量原有編譯位置的實(shí)時(shí)修改,以確保其能正常運(yùn)行病毒重定位演示及解讀1.

call@base2.

@base:popebx3.

subebx,offset@base4.

leaeax,[ebx+(offsetvar1-offset@base)]call指令用于調(diào)用一個(gè)函數(shù)或子程序。當(dāng)該指令執(zhí)行時(shí),會先將返回地址(即call指令之后的那條指令在內(nèi)存中的真正地址)壓入堆棧,再將EIP寄存器設(shè)置為call指令所指向的函數(shù)或子程序的內(nèi)存地址。當(dāng)函數(shù)或子程序執(zhí)行到ret指令后,就會將堆棧頂端ESP所指向的返回地址彈出至EIP寄存器中,主程序得以繼續(xù)往后執(zhí)行。病毒重定位代碼演示及解讀1.

call@base2.

@base:popebx3.

subebx,offset@base4.

leaeax,[ebx+(offsetvar1-offset@base)]call@base執(zhí)行后,堆棧頂端ESP所指的是@base在內(nèi)存中的真正地址。@base:popebx執(zhí)行后,將堆棧頂端ESP所指的@base在內(nèi)存中的真正地址彈出至ebx寄存器。subebx,offset@base執(zhí)行后,ebx寄存器中存放著@base的差距值。病毒重定位代碼演示及解讀1.

call@base2.

@base:popebx3.

subebx,offset@base4.

leaeax,[ebx+(offsetvar1-offset@base)]此后,病毒中所有的變量的內(nèi)存地址重定位,通過執(zhí)行l(wèi)eaeax,[ebx+(offsetvar1-offset@base)]后,eax寄存器中就存放在變量var1在內(nèi)存中的真正地址。病毒中其他變量或常量的重定位,均可借助類似leaeax,[ebx+(offsetX-offset@base)]指令完成。API函數(shù)獲取簡介Windows程序一般運(yùn)行在Ring3級,處于保護(hù)模式中。Windows中的系統(tǒng)調(diào)用是通過動態(tài)鏈接庫中的API函數(shù)來實(shí)現(xiàn)。WindowsPE病毒和普通WindowsPE程序一樣都需要調(diào)用API函數(shù)。普通的WindowsPE程序里面有一個(gè)引入函數(shù)表IAT(ImportAddressTable),該函數(shù)表中存放著代碼段中所用到的API函數(shù)在動態(tài)連接庫中的真實(shí)地址。這樣,調(diào)用API函數(shù)時(shí)就可通過該引入函數(shù)表IAT找到相應(yīng)API函數(shù)的真正執(zhí)行地址。API函數(shù)獲取簡介然而,對于WindowsPE病毒來說,它只有一個(gè)代碼段,并不存在引入函數(shù)表。顯然,病毒無法像普通WindowsPE程序那樣直接調(diào)用相關(guān)的API函數(shù),而應(yīng)該先找出這些API函數(shù)在相應(yīng)動態(tài)鏈接庫中的地址。因此,一個(gè)WindowsPE病毒必須具備獲取WindowsAPI函數(shù)地址的模塊。API函數(shù)獲取簡介WindowsPE病毒所需的API函數(shù)都需自己加載函數(shù)導(dǎo)入地址。要獲取API函數(shù)地址必須使用LoadLibrary、GetProcAddress、GetModuleHandle這三個(gè)API函數(shù),這些函數(shù)地址都存在于Kernel32.dll庫中。因此,PE病毒需要首先找到Kernel32.dll的基地址。從這個(gè)基地址找到GetProcAddress函數(shù)地址,再利用GetProcAddress加載其他任何需要的API函數(shù)地址。查找Kernel32.dll基地址的演示代碼如下:查找Kernel32.dll基地址的演示代碼查找需要的API函數(shù)地址代碼演示查找需要的API函數(shù)地址代碼演示病毒要擴(kuò)大影響,就必須進(jìn)行外向傳播。而要進(jìn)行外向傳播,就需搜索目標(biāo)文件,再執(zhí)行感染操作。因此,WindowsPE病毒需有目標(biāo)文件搜索模塊。在Windows系統(tǒng)中要完成目標(biāo)文件搜索,需要FindFirstFile、FindNextFile、FindClose這三個(gè)API函數(shù)。在上述找尋Kernel32.dll庫中API函數(shù)基礎(chǔ)上,找到這三個(gè)API函數(shù)地址,再利用這三個(gè)API函數(shù)就能實(shí)現(xiàn)目標(biāo)文件搜索。目標(biāo)文件搜索演示代碼如下:目標(biāo)文件搜索目標(biāo)文件搜索代碼演示內(nèi)存映射文件是由操作系統(tǒng)支持的一種文件處理方式,通過文件映射,可讓用戶處理磁盤文件時(shí)就如同操作內(nèi)存一樣。這在處理大文件時(shí),效率要遠(yuǎn)超傳統(tǒng)I/O文件訪問。具體而言,內(nèi)存映射文件提供了一組獨(dú)立的函數(shù),使應(yīng)用程序能通過內(nèi)存指針就像訪問內(nèi)存一樣對磁盤上的文件進(jìn)行訪問。內(nèi)存映射文件簡介這組內(nèi)存映射文件函數(shù)將磁盤上文件的全部或者部分映射到進(jìn)程虛擬地址空間某個(gè)位置,以后對該文件內(nèi)容的訪問就如同在該地址區(qū)域內(nèi)直接對內(nèi)存訪問一樣簡便。這樣,對文件中數(shù)據(jù)的操作便是直接對內(nèi)存進(jìn)行操作,大大地提升了訪問速度,這對于要盡可能減少資源占用的計(jì)算機(jī)病毒來說意義非凡。因此,WindowsPE病毒一般具有內(nèi)存映射文件模塊。內(nèi)存映射文件簡介在建立內(nèi)存映射文件時(shí),需先通過CreateFile打開需要映射的文件以獲取該文件Handle(句柄);再通過CreateFileMapping創(chuàng)建該文件映射,并利用MapViewOfFile在虛擬地址空間中建立映射文件視圖。演示代碼如下:內(nèi)存映射文件簡介目標(biāo)文件搜索代碼演示計(jì)算機(jī)病毒如欲寄生于WindowsPE文件中,常見的感染方式是在目標(biāo)文件中添加一個(gè)新節(jié),然后往該新節(jié)中添加病毒代碼和病毒執(zhí)行后的返回Host程序的代碼,并修改文件頭中代碼開始執(zhí)行位置(AddressOfEntryPoint)指向新添加的病毒節(jié)的代碼入口,以便程序運(yùn)行后先執(zhí)行病毒代碼。演示代碼如下:感染目標(biāo)文件感染目標(biāo)文件代碼演示感染目標(biāo)文件代碼演示為了提高自己的生存能力,計(jì)算機(jī)病毒要盡量不破壞HOST宿主程序。顯然,計(jì)算機(jī)病毒應(yīng)在其執(zhí)行完畢后,將控制權(quán)交給HOST宿主程序。將控制權(quán)返還給Host宿主程序,只需計(jì)算機(jī)病毒在修改被感染文件代碼開始執(zhí)行位置(AddressOfEntryPoint)時(shí),保存原來的值,并在執(zhí)行完病毒代碼后用一個(gè)跳轉(zhuǎn)語句jmp[AddressOfEntryPoint],跳到原來保存的代碼位置值繼續(xù)執(zhí)行即可。返回宿主程序簡介數(shù)據(jù)文件寄生眾所周知,文件寄生型計(jì)算機(jī)病毒都是利用“搭順風(fēng)車”機(jī)制完成病毒傳播功能。對于可執(zhí)行文件寄生病毒,其利用Windows系統(tǒng)加載PE文件機(jī)制來完成自身運(yùn)行并啟動傳播功能。對于數(shù)據(jù)文件寄生病毒,則是通過寄生在Word文檔或模板的宏(Macro)中,借助此類數(shù)據(jù)文檔宏的啟動機(jī)制,激活宏病毒并復(fù)制自身來感染其他文件從而完成傳播功能。數(shù)據(jù)文件寄生MicrosoftWord對宏定義為:“宏(Macro)就是能組織到一起作為獨(dú)立命令使用的一系列Word命令,它能使日常工作變得更簡易與自動化”。Word使用宏語言Word_Basic編寫作為一系列指令的宏。在Office系列辦公軟件中,宏分為兩類:內(nèi)置宏,全局宏。內(nèi)置宏是一種局部宏,位于文檔中,只對該文檔有效,如文檔打開(AutoOpen)、保存(AutoSave)、打印(AutoPrint)、關(guān)閉(AutoClose)等。全局宏則位于Office模板中,為所有文檔共用,如打開Word程序(AutoExec)、退出Word程序(AutoExit)等。數(shù)據(jù)文件寄生Word宏病毒是利用MicrosoftWord的開放性,即Word中提供的Word_Basic語言編程接口,而編寫的一個(gè)或多個(gè)具有病毒特點(diǎn)的宏的集合。此類宏病毒能通過.DOC文檔及.DOT模板感染Normal.dot公共模板,從而完成自我復(fù)制及外向傳播功能。Word宏病毒的感染傳播原理如圖所示。數(shù)據(jù)文件寄生傳播機(jī)制——以宏病毒代碼為例數(shù)據(jù)文件寄生傳播機(jī)制——以宏病毒代碼為例在上述宏病毒代碼中,宏病毒在進(jìn)行感染傳播之前需要進(jìn)行自我隱匿來保護(hù)自身,通常借助如下三類方法完成:OnErrorResumeNext,如果發(fā)生錯(cuò)誤,不彈出錯(cuò)窗口,繼續(xù)執(zhí)行下面語句;Application.DisplayAlerts=wdAlertsNone,不彈出警告窗口;Application.DisplayStatusBar=False,不顯示狀態(tài)欄,以免顯示宏的運(yùn)行狀態(tài);Options.VirusProtection=False,關(guān)閉病毒保護(hù)功能,運(yùn)行前如果包含宏,不提示通過特定宏定義來禁止查看宏。SubViewVBCode()

MsgBox"Unexcpectederror",16

EndSub屏蔽特定菜單項(xiàng),“開發(fā)工具→宏”菜單失效。CommandBars(“Tools”).Controls(16).Enabled=False通過間接方式隱藏宏,如在“全局宏”中無任何感染或破壞代碼,但卻包含創(chuàng)建、執(zhí)行和刪除新宏(感染與破壞的宏)的代碼;或者將宏代碼字體顏色設(shè)置成與背景顏色相同。在完成自我隱匿功能之后,宏病毒將通過類似這樣的語句完成感染傳播功能(.InsertLines1,MyCode)。隱藏宏的真實(shí)代碼屏蔽命令菜單禁止提示信息實(shí)體注入DLL注入進(jìn)程鏤空注冊表注入映像劫持2CHAPTER本章前言計(jì)算機(jī)病毒除借助文件寄生來完成感染傳播之外,還可通過實(shí)體注入來實(shí)現(xiàn)隱匿傳播功能。所謂實(shí)體注入,是指計(jì)算機(jī)病毒通過在目標(biāo)進(jìn)程地址空間中注入自身代碼,從而規(guī)避安全軟件查殺而實(shí)現(xiàn)隱匿與持久潛伏并完成傳播功能。實(shí)體注入的類型很多,本節(jié)主要介紹4種實(shí)體注入技術(shù):DLL(DynamicLinkLibrary,動態(tài)鏈接庫)注入,進(jìn)程鏤空,注冊表注入、映像劫持。DLL注入簡介計(jì)算機(jī)病毒通過CreateRemoteThread和LaodLibrary進(jìn)行經(jīng)典DLL注入,是其規(guī)避安全軟件查殺和實(shí)現(xiàn)隱匿傳播的最佳方法之一。該技術(shù)方法將計(jì)算機(jī)病毒所依賴的DLL(DynamicLinkLibrary,動態(tài)鏈接庫)的路徑寫入目標(biāo)進(jìn)程的虛擬地址空間,并通過在目標(biāo)進(jìn)程中創(chuàng)建一個(gè)遠(yuǎn)程線程來確保目標(biāo)進(jìn)程加載該DLL。DLL注入原理計(jì)算機(jī)病毒首先找尋被注入的目標(biāo)進(jìn)程(如svchost.exe),一般通過三個(gè)API函數(shù)搜索進(jìn)程來完成:CreateToolhelp32Snapshot,Process32First和Process32Next。在上述三個(gè)API函數(shù)中,CreateToolhelp32Snapshot用于枚舉指定進(jìn)程或所有進(jìn)程的堆或模塊狀態(tài)的API,將返回一個(gè)快照;Process32First將檢索有關(guān)快照中第一個(gè)進(jìn)程的信息,然后通過循環(huán)Process32Next來迭代。找到目標(biāo)進(jìn)程后,計(jì)算機(jī)病毒通過調(diào)用OpenProcess獲取目標(biāo)進(jìn)程的句柄。DLL注入原理接著,計(jì)算機(jī)病毒將調(diào)用VirtualAllocEx來獲得寫入其DLL路徑的空間;然后調(diào)用WriteProcessMemory在已分配的內(nèi)存中寫入路徑;最后,為讓代碼在另一個(gè)進(jìn)程中執(zhí)行,計(jì)算機(jī)病毒會調(diào)用CreateRemoteThread,NtCreateThreadEx或RtlCreateUserThread等API函數(shù),并將LoadLibrary的地址傳遞給其中一個(gè)API,以便遠(yuǎn)程進(jìn)程代表計(jì)算機(jī)病毒執(zhí)行病毒的DLL。DLL注入代碼實(shí)現(xiàn)步驟提升進(jìn)程權(quán)限01查看獲得的特權(quán)信息02調(diào)節(jié)進(jìn)程權(quán)限03獲取窗口句柄04獲取進(jìn)程的PID05獲取進(jìn)程句柄06申請一塊內(nèi)存地址空間07將病毒DLL路徑寫入遠(yuǎn)程進(jìn)程08在遠(yuǎn)程進(jìn)程中開辟一個(gè)線程09注入代碼實(shí)現(xiàn)步驟1:獲取權(quán)限鎖注入代碼實(shí)現(xiàn)步驟2:查看進(jìn)程的特權(quán)信息注入代碼實(shí)現(xiàn)步驟3:調(diào)節(jié)進(jìn)程權(quán)限注入代碼實(shí)現(xiàn)步驟4:查找窗口,獲取指定目標(biāo)應(yīng)用程序的進(jìn)程注入代碼實(shí)現(xiàn)步驟5:獲取進(jìn)程PID注入代碼實(shí)現(xiàn)步驟6:根據(jù)PID(進(jìn)程的序號)獲取進(jìn)程句柄注入代碼實(shí)現(xiàn)步驟

7:根據(jù)進(jìn)程句柄在指定的進(jìn)程中申請一塊內(nèi)存地址空間注入代碼實(shí)現(xiàn)步驟8:將DLL路徑寫入遠(yuǎn)程進(jìn)程中注入代碼實(shí)現(xiàn)步驟8:將DLL路徑寫入遠(yuǎn)程進(jìn)程中注入代碼實(shí)現(xiàn)步驟9:在遠(yuǎn)程線程中開辟一個(gè)線程進(jìn)程鏤空簡介與DLL注入類似,進(jìn)程鏤空(ProcessHollowing)也是一種實(shí)體注入以隱匿傳播計(jì)算機(jī)病毒的方法。所不同的是DLL注入會將病毒代碼注入到目標(biāo)進(jìn)程中并利用創(chuàng)建的線程加載病毒攻擊載荷,而進(jìn)程鏤空則是計(jì)算機(jī)病毒先創(chuàng)建一個(gè)正常的子進(jìn)程,該子進(jìn)程具有與父進(jìn)程相同的權(quán)限,再刪除這個(gè)正常子進(jìn)程的內(nèi)存映射,并將病毒載荷寫入到這個(gè)正常子進(jìn)程的內(nèi)存空間,從而實(shí)現(xiàn)規(guī)避安全軟件查殺和隱匿傳播功能。進(jìn)程鏤空原理計(jì)算機(jī)病毒首先會通過調(diào)用CreateProcess創(chuàng)建一個(gè)新的正常的進(jìn)程,并將ProcessCreationFlag設(shè)置為CREATE_SUSPENDED(0x00000004)以掛起模式托管病毒代碼。由于該進(jìn)程的主線程是在掛起狀態(tài)下創(chuàng)建的,在調(diào)用ResumeThread函數(shù)之前不會執(zhí)行。計(jì)算機(jī)病毒將用病毒攻擊載荷交換合法進(jìn)程文件內(nèi)容,這可通過調(diào)用ZwUnmapViewOfSection或NtUnmapViewOfSection來取消映射目標(biāo)進(jìn)程的內(nèi)存來完成。由于當(dāng)前內(nèi)存處于未映射狀態(tài),計(jì)算機(jī)病毒可利用VirtualAllocEx為病毒攻擊載荷分配新內(nèi)存,并使用WriteProcessMemory將病毒攻擊載荷寫入目標(biāo)進(jìn)程空間。然后,計(jì)算機(jī)病毒通過調(diào)用SetThreadContext將入口點(diǎn)指向已加載的病毒代碼段。最后,通過調(diào)用ResumeThread恢復(fù)掛起的線程,使進(jìn)程退出掛起狀態(tài)開始執(zhí)行已加載的病毒攻擊載荷。進(jìn)程鏤空實(shí)現(xiàn)步驟通過CreateProcess創(chuàng)建掛起的傀儡進(jìn)程通過VirtualAllocEx申請新的內(nèi)存,并利用WriteProcessMemory向內(nèi)存寫入新的計(jì)算機(jī)病毒載荷通過UnMapViewOfSection卸載掉原來的進(jìn)程數(shù)據(jù)通過SetThreadContext設(shè)置新的入口點(diǎn),并通過ResumeThread喚醒進(jìn)程,執(zhí)行新裝載的計(jì)算機(jī)病毒載荷①②③④進(jìn)程鏤空代碼實(shí)現(xiàn)步驟1:通過CreateProcess創(chuàng)建掛起的傀儡進(jìn)程在Windows系統(tǒng)中可通過CreateProcess函數(shù)創(chuàng)建進(jìn)程,該函數(shù)說明如下:創(chuàng)建過程如下:進(jìn)程鏤空代碼實(shí)現(xiàn)步驟2:通過UnMapViewOfSection卸載掉原來的進(jìn)程數(shù)據(jù)進(jìn)程鏤空代碼實(shí)現(xiàn)步驟3:寫入新的計(jì)算機(jī)病毒載荷進(jìn)程鏤空代碼實(shí)現(xiàn)步驟3:寫入新的計(jì)算機(jī)病毒載荷進(jìn)程鏤空代碼實(shí)現(xiàn)步驟4:恢復(fù)現(xiàn)場執(zhí)行病毒載荷注冊表注入簡介注冊表是Windows操作系統(tǒng)中的一個(gè)核心數(shù)據(jù)庫,其中存放著各種參數(shù),直接控制著Windows的啟動、硬件驅(qū)動程序的裝載以及一些Windows應(yīng)用程序的運(yùn)行,從而在整個(gè)系統(tǒng)中起著核心作用。所謂注冊表注入,就是利用Windows系統(tǒng)加載注冊表時(shí)通過對某些配置信息的修改達(dá)到執(zhí)行指定程序的目的。計(jì)算機(jī)病毒有時(shí)會利用注冊表注入來執(zhí)行其設(shè)定的病毒攻擊載荷。注冊表注入原理Windows系統(tǒng)注冊表保存了整個(gè)系統(tǒng)的配置。通過修改注冊表中的配置來改變系統(tǒng)的行為,也可改變某個(gè)進(jìn)程的某些行為。當(dāng)User32.dll被映射到Windows新創(chuàng)建的進(jìn)程中時(shí),User32.dll會收DLL_PROCESS_ATTACH通知,當(dāng)User32.dll對這個(gè)通知進(jìn)行處理的時(shí)候,會讀取注冊表HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\Windows對應(yīng)的值,并調(diào)用LoadLibrary來加載這個(gè)字符串中指定的每個(gè)DLL時(shí),會調(diào)用每個(gè)DLL中的DLLMain函數(shù),并將參數(shù)fdwReason的值設(shè)置為DLL_PROCESSS_ATTACH,這樣每個(gè)DLL就能對自己進(jìn)行初始化。注冊表注入原理——示例演示下列代碼演示了在加載進(jìn)程為“notepad.exe”時(shí),則將以隱匿方式運(yùn)行IE并打開指定網(wǎng)站。注冊表注入原理——示例演示注冊表注入原理——示例演示注冊表注入代碼實(shí)現(xiàn)在眾多的DLL注入方法中,使用注冊表注入是最簡單的一種方式。但要注意:如注入的進(jìn)程是32位,那么注入的DLL也應(yīng)是32位,64位的進(jìn)程則對應(yīng)64位DLL。在Windows桌面,使用Win+R打開快速運(yùn)行,輸入regedit或regedt32,回車打開注冊表注冊表注入代碼實(shí)現(xiàn)如注入32位進(jìn)程,應(yīng)修改的注冊表鍵為:如注入64位進(jìn)程,應(yīng)修改的注冊表鍵為:注冊表注入同樣可通過編程實(shí)現(xiàn),代碼如下:注冊表注入代碼實(shí)現(xiàn)注冊表注入代碼實(shí)現(xiàn)注冊表注入代碼實(shí)現(xiàn)注冊表注入缺點(diǎn)注冊表注入的方法只能將DLL注入到使用了User32.dll的GUI程序中(GUI程序中大多使用了User32.dll)。CUI程序大多不使用User32.dll,所以就不能使用注冊表注入。由于注冊表注入的方法會將DLL注入到系統(tǒng)中所有使用了User32.dll的所有GUI進(jìn)程,如注入的DLL中因有錯(cuò)誤而導(dǎo)致崩潰,則會影響到被注入的所有進(jìn)程。映像劫持簡介在WindowsNT架構(gòu)中,映像劫持(ImageFileExecutionOptions,IFEO)的初衷是為一些在默認(rèn)系統(tǒng)環(huán)境中運(yùn)行時(shí)可能引發(fā)錯(cuò)誤的程序執(zhí)行體提供特殊的環(huán)境設(shè)定。當(dāng)一個(gè)PE可執(zhí)行程序位于IFEO的控制中時(shí),它的內(nèi)存分配則根據(jù)該程序的參數(shù)來設(shè)定,而WindowsNT系統(tǒng)能通過這個(gè)注冊表項(xiàng)使用與可執(zhí)行程序文件名匹配的項(xiàng)目作為程序載入時(shí)的控制依據(jù),最終得以設(shè)定一個(gè)程序的堆管理機(jī)制和一些輔助機(jī)制等。出于簡化目的,IFEO采用忽略路徑的方式來匹配它所要控制的程序文件名,因此程序無論放在哪個(gè)路徑,只要名字沒有變化,它就能運(yùn)行。由于這個(gè)項(xiàng)主要是用來調(diào)試程序用的,對一般用戶意義不大。默認(rèn)時(shí)只有管理員和LocalSystem有權(quán)讀寫修改。映像劫持位于注冊表的HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\WindowsNT\CurrentVersion\ImageFileExecutionOptions鍵值中。映像劫持原理①

映像劫持(ImageFileExecutionOptions,IFEO)是Windows系統(tǒng)的一項(xiàng)正常功能,主要用于調(diào)試程序,其初衷是在程序啟動時(shí)開啟調(diào)試器來調(diào)試程序,這樣便可在調(diào)試器中觀察程序在難以重現(xiàn)的環(huán)境中的行為。例如,某個(gè)程序在隨用戶登錄自動啟動時(shí)會出錯(cuò),但在登錄后手動啟動時(shí)卻一切正常,這就可通過IFEO設(shè)置一個(gè)調(diào)試器,無論程序何時(shí)啟動,都會開啟這個(gè)調(diào)試器對其進(jìn)行調(diào)試,以便找出問題。當(dāng)前仍有不少計(jì)算機(jī)病毒或木馬會利用IFEO來阻止安全軟件的運(yùn)行,或者利用IFEO功能來完成病毒的間接運(yùn)行。映像劫持原理②

既然IFEO是Windows系統(tǒng)為某些可能以早期設(shè)計(jì)模式運(yùn)行的軟件提供的一種保全措施而設(shè)計(jì),目前已知的IFEO參數(shù)很多,對其稍加擴(kuò)充便能形成用于調(diào)試程序的簡易方案。IFEO參數(shù)大致如下:映像劫持原理③

其中,一個(gè)導(dǎo)致映像劫持的參數(shù)就是:Debugger。如果Windows系統(tǒng)在IFEO程序列表里匹配了當(dāng)前運(yùn)行的文件名,它就會讀取該文件名下的參數(shù),這些參數(shù)在未被人為設(shè)置之前均有個(gè)默認(rèn)值,且它們具備優(yōu)先權(quán),“Debugger”的優(yōu)先權(quán)是最高的,它是第一個(gè)被讀取的參數(shù),如果該參數(shù)未被設(shè)置,則默認(rèn)不作處理;如果設(shè)置了這個(gè)參數(shù),系統(tǒng)則會將Debugger參數(shù)里指定的程序文件名視為用戶試圖啟動的程序進(jìn)行執(zhí)行。映像劫持應(yīng)用禁止某些程序運(yùn)行隱匿加載計(jì)算機(jī)病毒狙擊安全軟件將如下代碼保存為NoWeChat.reg,在雙擊后寫入注冊表,原來能運(yùn)行的微信程序已無法運(yùn)行,而是會運(yùn)行其他的程序(cmd.exe)映像劫持應(yīng)用禁止某些程序運(yùn)行隱匿加載計(jì)算機(jī)病毒狙擊安全軟件有些計(jì)算機(jī)病毒利用映像劫持功能來隱匿完成病毒自身加載與傳播。在具體實(shí)現(xiàn)時(shí),計(jì)算機(jī)病毒通常會通過對常用程序的映像劫持來完成自身隱匿加載。例如,計(jì)算機(jī)病毒在如下代碼中添加其他常用程序,并將“Debugger”參數(shù)設(shè)置為計(jì)算機(jī)病毒自身即可。映像劫持應(yīng)用禁止某些程序運(yùn)行隱匿加載計(jì)算機(jī)病毒狙擊安全軟件“掛羊頭賣狗肉”,是映像劫持的通俗表達(dá)。計(jì)算機(jī)病毒為免遭安全軟件的查殺,有時(shí)也會借助映像劫持來狙擊安全軟件。只要IFEO鍵值下添加常見的安全軟件程序,再在“Debugger”參數(shù)中進(jìn)行相關(guān)設(shè)置,即可輕松完成對安全軟件的狙擊。映像劫持應(yīng)用禁止某些程序運(yùn)行隱匿加載計(jì)算機(jī)病毒狙擊安全軟件常見安全軟件進(jìn)程名映像劫持防范在了解映像劫持原理后,可通過限制權(quán)限來禁止用戶修改IFEO鍵值。也可編寫一個(gè)簡單的reg文件刪除IFEO鍵值,如下所示;在了解映像劫持原理后,可通過限制權(quán)限來禁止用戶修改IFEO鍵值。也可編寫一個(gè)簡單的reg文件刪除IFEO鍵值,如下所示;漏洞利用3CHAPTER本章前言漏洞利用(Exploit)是針對已有的漏洞,并根據(jù)漏洞類型及特點(diǎn)而采取相應(yīng)的嘗試性或?qū)嵸|(zhì)性的攻擊。漏洞利用的核心就是利用程序漏洞去劫持進(jìn)程的控制權(quán),實(shí)現(xiàn)控制流劫持,以便執(zhí)行植入的Shellcode或者達(dá)到其它攻擊目的。例如,在棧溢出漏洞的利用過程中,攻擊目的是淹沒返回地址,以便劫持進(jìn)程的控制權(quán),讓程序跳轉(zhuǎn)去執(zhí)行ShellcodeExploit結(jié)構(gòu)①

要利用漏洞完成計(jì)算機(jī)病毒植入或攻擊,Exploit需要具備特殊的結(jié)構(gòu)。一般而言,Exploit結(jié)構(gòu)主要包括攻擊特定目標(biāo)的有效載荷Payload

和實(shí)現(xiàn)具體功能的Shellcode。Exploit用集合代數(shù)可表示為:Shellcode∈Payload∈Exploit。如將漏洞利用過程比作導(dǎo)彈發(fā)射過程,則Exploit、Payload和Shellcode分別是導(dǎo)彈發(fā)射裝置、導(dǎo)彈和彈頭。Exploit結(jié)構(gòu)②

其中,Exploit是導(dǎo)彈發(fā)生裝置,針對目標(biāo)發(fā)射導(dǎo)彈(Payload);導(dǎo)彈到達(dá)目標(biāo)之后,釋放實(shí)際危害的彈頭(類似Shellcode)爆炸;導(dǎo)彈除了彈頭之外的其余部分用來實(shí)現(xiàn)對目標(biāo)進(jìn)行定位追蹤、對彈頭引爆等功能,在漏洞利用中,對應(yīng)Payload的非Shellcode部分。Exploit原理01馮·諾依曼存儲程序思想02緩沖區(qū)溢出03函數(shù)棧幀04棧溢出原理05Shellcode構(gòu)造要詳細(xì)了解Exploit原理,需要了解計(jì)算機(jī)及操作系統(tǒng)的底層邏輯及機(jī)制。本節(jié)主要涉及以下五個(gè)方面的知識。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造現(xiàn)代計(jì)算機(jī)采用馮·諾依曼體系結(jié)構(gòu),即由控制器、運(yùn)算器、存儲器、輸入設(shè)備和輸出設(shè)備五大部分組成。程序代碼和數(shù)據(jù)以二進(jìn)制形式不加區(qū)別地存放于存儲器相應(yīng)地址中??刂破鞲鶕?jù)存放于存儲器中的指令序列(程序代碼)進(jìn)行工作,并由一個(gè)程序計(jì)數(shù)器控制指令執(zhí)行及根據(jù)計(jì)算結(jié)果選擇不同的控制邏輯流。依據(jù)馮·諾依曼存儲程序思想,程序代碼和數(shù)據(jù)都是以二進(jìn)制數(shù)據(jù)形式存儲在內(nèi)存中,因此,存儲于內(nèi)存中的二進(jìn)制數(shù)據(jù),從形式上是無法區(qū)分哪些是程序代碼哪些是數(shù)據(jù),這為漏洞利用(緩沖區(qū)溢出攻擊)提供了可能。Exploit原理緩沖區(qū)溢出(BufferOverflow),是為緩沖區(qū)提供了多于其存儲容量的數(shù)據(jù),就像往杯子里倒入過量的水會溢出一樣。一般而言,緩沖區(qū)溢出的數(shù)據(jù)能破壞原來程序的數(shù)據(jù),會造成意想不到的結(jié)果。然而,如果是有意精心構(gòu)造溢出數(shù)據(jù)的內(nèi)容,那么就有可能獲得系統(tǒng)的控制權(quán),使系統(tǒng)按照預(yù)定的邏輯執(zhí)行相應(yīng)代碼。在馮·諾依曼系統(tǒng)中,緩沖區(qū)可視為一段可讀寫的內(nèi)存區(qū)域。高級語言中定義的變量、數(shù)組、結(jié)構(gòu)體等數(shù)據(jù),在運(yùn)行時(shí)都存儲于緩沖區(qū)內(nèi)。緩沖區(qū)攻擊的終極目的就是控制系統(tǒng)去執(zhí)行緩沖區(qū)(可讀寫內(nèi)存)中已設(shè)計(jì)好的計(jì)算機(jī)病毒。馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造Exploit原理從進(jìn)程地址空間分布來看,代碼段存儲著用戶程序的所有可執(zhí)行代碼,在程序正常執(zhí)行的情況下,程序計(jì)數(shù)器(PC指針)只會在代碼段和操作系統(tǒng)地址空間(內(nèi)核態(tài))內(nèi)尋址和取指令。數(shù)據(jù)段存儲著用戶程序的全局變量、文字池(LiteralPool)等。??臻g存儲著用戶程序的函數(shù)棧幀(包括參數(shù)、局部變量等),用于實(shí)現(xiàn)函數(shù)調(diào)用機(jī)制,其數(shù)據(jù)增長方向是:高地址→低地址。堆空間存儲著程序運(yùn)行時(shí)動態(tài)申請的內(nèi)存數(shù)據(jù)等,其數(shù)據(jù)增長方向是:低地址→高地址。除代碼段和受操作系統(tǒng)保護(hù)的數(shù)據(jù)區(qū)域,其他的內(nèi)存區(qū)域都可作為緩沖區(qū)。因此,緩沖區(qū)溢出的位置可能在數(shù)據(jù)段、堆空間、??臻g等。如果程序代碼有漏洞,計(jì)算機(jī)病毒能使程序計(jì)數(shù)器從上述緩沖區(qū)內(nèi)取指令,并執(zhí)行計(jì)算機(jī)病毒設(shè)定的代碼馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造棧空間主要用于存儲函數(shù)的參數(shù)、局部變量及返回地址,并借此實(shí)現(xiàn)函數(shù)調(diào)用機(jī)制。在函數(shù)調(diào)用時(shí),系統(tǒng)會把函數(shù)的返回地址(函數(shù)調(diào)用指令后緊跟指令的地址)、一些關(guān)鍵的寄存器值、函數(shù)的實(shí)際參數(shù)和局部變量(包括數(shù)據(jù)、結(jié)構(gòu)體、對象等)都存儲于??臻g中。這些數(shù)據(jù)統(tǒng)稱為函數(shù)調(diào)用的棧幀(如圖所示),且每次函數(shù)調(diào)用都會有獨(dú)立的棧幀,這也為遞歸函數(shù)的實(shí)現(xiàn)提供了可能。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造由于棧空間中保存著函數(shù)的返回地址,該地址保存了函數(shù)調(diào)用結(jié)束后要執(zhí)行指令的位置,如果有意修改了這個(gè)返回地址,則能使該返回地址指向一個(gè)新的代碼位置,程序?qū)念A(yù)定的位置執(zhí)行相關(guān)代碼。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造通常情況下,應(yīng)用程序的相關(guān)函數(shù)會接受用戶輸入的信息。當(dāng)函數(shù)內(nèi)的一個(gè)數(shù)組緩沖區(qū)能接受用戶輸入外界信息時(shí),如函數(shù)內(nèi)的程序代碼未對輸入信息的類型或長度進(jìn)行合法性檢查,則緩沖區(qū)溢出便極有可能觸發(fā)。舉例一個(gè)簡單函數(shù):Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造上述自定義函數(shù)Function在使用strcpy庫函數(shù)時(shí),系統(tǒng)會不在任何檢查地將data數(shù)據(jù)全部拷貝至buffer緩沖區(qū)。由于buffer緩沖區(qū)的長度有限,一旦data數(shù)據(jù)長度超過buffer緩沖區(qū)長度BUF_LEN,就會產(chǎn)生緩沖區(qū)溢出Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造由于??臻g是從高地址向低地址方向增長的,因此函數(shù)Function內(nèi)部的數(shù)組buffer的指針在緩沖區(qū)下方。當(dāng)將外界輸入的data數(shù)據(jù)拷貝至buffer數(shù)組時(shí),超過緩沖區(qū)區(qū)域的高地址部分?jǐn)?shù)據(jù)會“淹沒”原有的其他棧幀數(shù)據(jù)。根據(jù)“淹沒”的數(shù)據(jù)不同,可能會產(chǎn)生如右所述的意外情形:Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造如果將函數(shù)的返回地址“淹沒”而填入一個(gè)新地址,使該地址指向內(nèi)存中預(yù)設(shè)的一條特殊指令jmpesp(跳板),則函數(shù)執(zhí)行結(jié)束返回后,就將執(zhí)行該指令并跳轉(zhuǎn)至esp所指向的地址執(zhí)行。這樣就能確保無論程序被加載到何處,最終都會跳轉(zhuǎn)至棧內(nèi)來執(zhí)行相關(guān)代碼Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造利用“跳板”可解決棧幀移位(棧加載地址不固定)的問題,但跳板指令如何找到?由于Windows系統(tǒng)會加載很多動態(tài)鏈接庫DLL,其中包含有這樣的指令,例如Kernel32.dll、NTdll.dll等。Windows系統(tǒng)加載DLL時(shí)一般都用固定地址,因此,這些DLL內(nèi)的跳板指令的地址一般都是固定的。我們可利用OllyDBG離線搜索出跳板執(zhí)行在DLL內(nèi)的偏移,并加上DLL的加載地址,就能得到一個(gè)合適的跳板指令地址。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造查詢DLL內(nèi)jmpesp指令位置的源代碼如下:Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造在如圖所示的利用跳板進(jìn)行棧溢出攻擊中,由于在jmpesp后的Shellcode代碼可能會淹沒上級函數(shù)的棧幀,這可能會令原程序執(zhí)行崩潰。因此Shellcode最好能放在函數(shù)棧幀的緩沖區(qū)內(nèi)。通過在jmpesp之后跟上一條跳轉(zhuǎn)指令可轉(zhuǎn)移至原有的緩沖區(qū)。但這樣會使Shellcode代碼位置在esp指針之前(低地址位置),如果Shellcode中使用了push指令便會讓esp指針與Shellcode代碼很近,甚至淹沒Shellcode自身代碼。因此,可強(qiáng)制改變esp指針,使它Shellcode之前(低地址位置),這樣即使在Shellcode內(nèi)使用push指令也安全無虞。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造通過如下代碼就可調(diào)整Shellcode和棧指針位置:在第一條指令中,X代表Shellcode起始地址與esp的偏移。如Shellcode從緩沖區(qū)起始位置開始,則就是buffer的地址偏移。這里不使用subesp,X指令主要是避免X的高位字節(jié)為0的情形。因?yàn)榫彌_區(qū)溢出是針對字符串緩沖區(qū)的,如出現(xiàn)字節(jié)0則會導(dǎo)致緩沖區(qū)截?cái)啵瑥亩咕彌_區(qū)溢出失敗。第二條指令jmpesp直接跳轉(zhuǎn)至Shellcode的起始位置繼續(xù)執(zhí)行。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造緩沖區(qū)溢出成功后,通常想開啟一個(gè)遠(yuǎn)程shell以控制被攻擊的計(jì)算機(jī)。開啟shell最直接的方式是直接調(diào)用C語言的庫函數(shù)system,該函數(shù)可執(zhí)行操作系統(tǒng)中的命令,就像在命令行方式下執(zhí)行命令一樣。為使system函數(shù)調(diào)用成功,需要將“cmd”字符串內(nèi)容壓入??臻g,并將其地址壓入作為system函數(shù)的參數(shù),然后使用call指令調(diào)用system函數(shù)的地址,完成函數(shù)的執(zhí)行。但是,如果被溢出的程序沒有加載C語言函數(shù)庫,則還需要調(diào)用Windows的API函數(shù)Loadlibrary去加載C語言的函數(shù)庫msvcrt.dll,因此也需要為字符串“msvcrt.dll”開辟??臻g。Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造①

Shellcode主要代碼如下:②將Shellcode用匯編語言表示為:Exploit原理馮·諾依曼存儲程序思想緩沖區(qū)溢出函數(shù)棧幀棧溢出原理Shellcode構(gòu)造在構(gòu)造上述匯編代碼時(shí)一定不能出現(xiàn)字節(jié)0。為填充字符串的結(jié)束字符0,可使用已經(jīng)初始化為0的ebx寄存器代替。此外,在進(jìn)行庫函數(shù)調(diào)用時(shí),需要提前計(jì)算好函數(shù)的地址,如Loadlibrary函數(shù)的0x77b62864。計(jì)算方式如下:Exploit實(shí)現(xiàn)PPT模板/moban/

我們已對Exploit結(jié)構(gòu)與原理進(jìn)行了充分說明與解釋,相信大家也能應(yīng)用相關(guān)原理進(jìn)行真實(shí)的Exploit實(shí)驗(yàn)。下面將簡要介紹實(shí)現(xiàn)一個(gè)簡單的Exploit的全過程①構(gòu)造一個(gè)有漏洞的程序代碼如右圖所示Exploit實(shí)現(xiàn)PPT模板/moban/

選取跳板如何讓程序跳轉(zhuǎn)至esp的位置?可使用jmpesp指令,該指令的機(jī)器碼是0xFFE4。我們可編寫一個(gè)程序,在User32.dll中查找這條指令的地址。Exploit實(shí)現(xiàn)PPT模板/moban/

PPT模板/moban/

接下來將要編寫“name”數(shù)組中的內(nèi)容,經(jīng)過分析可知,其形式為“AAAAAAAAAAAAXXXXSSSS……SSSS”。其中前12個(gè)字符為任意字符,XXXX為返回地址,可使用上述程序返回的地址0x77e35b79,而SSSS則是想要讓計(jì)算機(jī)執(zhí)行的代碼。查找jmpesp指令的地址Exploit實(shí)現(xiàn)PPT模板/moban/

PPT模板/moban/

③獲取Shellcode中API函數(shù)地址我們?yōu)槭股鲜龃嬖诰彌_區(qū)溢出漏洞的程序顯示一個(gè)對話框,需要調(diào)用MessageBox()函數(shù)以及ExitProcess()函數(shù),因此,需要獲取該API函數(shù)的地址,可通過如下程序來獲取。Exploit實(shí)現(xiàn)PPT模板/moban/

PPT模板/moban/

③獲取Shellcode中API函數(shù)地址運(yùn)行上述程序后,可得到MessageBoxA和ExitProcess的地址分別為0x763e19e0和0x770a5980,之前獲取的跳板jmpesp地址為0x764f25e9。Exploit實(shí)現(xiàn)④編寫匯編代碼我們編寫一個(gè)能彈出對話框的Shellcode匯編代碼如下:Exploit實(shí)現(xiàn)⑤獲取Shellcode的機(jī)器碼在VC中,可在上述程序的“_asm”位置先下一個(gè)斷點(diǎn),然后按下F5(Go),再單擊Disassembly,就能夠查看所轉(zhuǎn)換出來的機(jī)器碼(使用OD或IDApro也可查看):Exploit實(shí)現(xiàn)⑤獲取Shellcode的機(jī)器碼在VC中,可在上述程序的“_asm”位置先下一個(gè)斷點(diǎn),然后按下F5(Go),再單擊Disassembly,就能夠查看所轉(zhuǎn)換出來的機(jī)器碼(使用OD或IDApro也可查看):4CHAPTER社會工程學(xué)本章前言社會工程學(xué)(SocialEngineering)是凱文·米特尼克(KevinMitnick)在著作《欺騙的藝術(shù)》(TheArtofDeception)中提出的概念,是為讓大眾認(rèn)識網(wǎng)絡(luò)安全,提高安全意識,防范不必要的各類損失。他在書中詳細(xì)地描述了許多運(yùn)用社會工程學(xué)入侵網(wǎng)絡(luò)的方法,入侵了包括美國國防部、IBM等幾乎不可能潛入的網(wǎng)絡(luò)系統(tǒng),并獲取了管理員特權(quán)。這些方法無需太多技術(shù)基礎(chǔ),一旦懂得如何利用人性心理弱點(diǎn),例如:輕信、健忘、膽小、貪便宜等,就可輕易潛入防護(hù)最嚴(yán)密的網(wǎng)絡(luò)系統(tǒng)。廣義上說,社會工程學(xué)是一種通過對“人性”的心理弱點(diǎn)、本能反應(yīng)、好奇心、信任、貪婪等心理陷阱進(jìn)行諸如欺騙、傷害等危害手段。在網(wǎng)絡(luò)空間安全中,人的因素是最不穩(wěn)定和脆弱的環(huán)節(jié)。社會工程學(xué)就是利用人的薄弱點(diǎn),通過欺騙手段而入侵計(jì)算機(jī)系統(tǒng)的一種攻擊方法。諸多企業(yè)和機(jī)構(gòu)在網(wǎng)絡(luò)安全上投入大量資金和人力,最后仍存在數(shù)據(jù)泄露,究其原因就在人本身。通過研究人性弱點(diǎn)的社會工程學(xué)攻擊,可獲得技術(shù)手段難以獲取的信息,并借此傳播計(jì)算機(jī)病毒、入侵目標(biāo)網(wǎng)絡(luò)系統(tǒng)郵件欺騙郵件欺騙是最好實(shí)施的社會工程學(xué)攻擊方法。通常借用某個(gè)熱點(diǎn)話題引導(dǎo)受害者去下載文件或訪問某個(gè)鏈接等?;蛘邔⑧]件中的附件替換成計(jì)算機(jī)病毒,或者直接把計(jì)算機(jī)病毒捆綁進(jìn)附件中,誘使受害者運(yùn)行,以達(dá)到傳播計(jì)算機(jī)病毒或其他目的。此外,利用應(yīng)用程序漏洞捆綁計(jì)算機(jī)病毒進(jìn)行郵件欺騙,隱蔽性強(qiáng)、成功率高、危害性大,且能隱藏身份、冒充他人,已是目前網(wǎng)絡(luò)攻擊的主要方式之一。消息欺騙消息欺騙是指攻擊者利用網(wǎng)絡(luò)消息發(fā)送工具,例如QQ、微信等,向目標(biāo)發(fā)送欺騙信息。如果遇到經(jīng)常不聯(lián)系的同學(xué)或朋友突然跟你聊天,找你借錢或說他現(xiàn)在不方便讓你幫忙充話費(fèi)之類的情況,就是典型的消息詐騙。對于消息欺騙,最好是視頻或電話核實(shí)對方身份,辨別真?zhèn)魏笤俨扇『罄m(xù)行動。通常情況下,用戶在收到欺騙消息時(shí)可能會不予理睬,但如果接收到好友發(fā)來的信息,其可信度就大幅提升。尤其當(dāng)目標(biāo)正在使用聊天工具時(shí),如攻擊者在某句話后“加入”或“補(bǔ)充”與當(dāng)前內(nèi)容相關(guān)的消息,信息接收者看到信息與自己密切相關(guān),無形中會放松警惕,攻擊者再以發(fā)送文件、文字推薦等多種方式誘使目標(biāo)訪問網(wǎng)站或執(zhí)行計(jì)算機(jī)病毒程序,以達(dá)到攻擊目的。窗口欺騙窗口欺騙是指網(wǎng)頁彈出窗口欺騙,攻擊者利用用戶貪婪的心理,給出一個(gè)巨大“餡餅”,誘使用戶按照攻擊者預(yù)先指定的方式訪問網(wǎng)頁或執(zhí)行計(jì)算機(jī)病毒程序等操作,達(dá)到入侵者預(yù)定的攻擊目的。例如,許多騷擾廣告通過彈出窗口欺騙用戶單擊錯(cuò)誤按鈕,而不告知會使終端設(shè)備感染各種惡意代碼。在使用瀏覽器搜索網(wǎng)絡(luò)信息時(shí),經(jīng)常會遇到此類欺騙窗口,點(diǎn)擊后可能會出現(xiàn)無法預(yù)知的情形。地址欺騙IP地址欺騙鏈接文字欺騙Unicode編碼欺騙在網(wǎng)絡(luò)協(xié)議中,IP地址可轉(zhuǎn)化為十進(jìn)制數(shù)字來表示。例如,Google的IP地址是47,采用計(jì)算公式:66*256^3+102*256^2+7*256+147=1113982867,在命令行下輸入“ping1113982867”會發(fā)現(xiàn)有數(shù)據(jù)包回應(yīng),與“ping47”的結(jié)果一樣,如圖5-17所示。如用十進(jìn)制數(shù)字代替IP地址,會具有很強(qiáng)的迷惑性,讓用戶在訪問植入計(jì)算機(jī)病毒的此類網(wǎng)站而不自知。因此,在瀏覽器中訪問47與http://1113982867是相同的效果,而對于后者,多數(shù)用戶無法辨識網(wǎng)站的IP地址。地址欺騙IP地址欺騙鏈接文字欺騙Unicode編碼欺騙網(wǎng)頁中的鏈接文字如與實(shí)際網(wǎng)址不同,單擊該連接時(shí),首先指向的網(wǎng)站地址是攻擊者提供的偽地址,用戶在訪問攻擊者提供的偽地址后再訪問實(shí)際的網(wǎng)站網(wǎng)站。很多釣魚網(wǎng)站通常假冒其他的知名網(wǎng)站,設(shè)計(jì)精美,令人無法區(qū)分真假。攻擊者可以在用戶訪問偽地址時(shí)進(jìn)行計(jì)算機(jī)病毒植入或用戶名和密碼的竊取等,危害性極大。地址欺騙IP地址欺騙鏈接文字欺騙Unicode編碼欺騙對于Unicode編碼,它本身就有一定的漏洞,同時(shí)它也給網(wǎng)址的識別帶來了麻煩。例如,在瀏覽器中輸入可訪問廣東技術(shù)師范大學(xué),這從網(wǎng)址也能猜出。但如用Unicode編碼表示為:“https://www.gpnu.edu.cn”,盡管也是訪問上述網(wǎng)站,但這樣的字符是很難識別其真正內(nèi)容的。倘若攻擊者將計(jì)算機(jī)病毒植入此類網(wǎng)站,再利用Unicode編碼來欺騙用戶訪問,將能快速傳播計(jì)算機(jī)病毒,實(shí)現(xiàn)其攻擊目的。THANKYOU謝謝觀看惡

MalwarePrinciples&Prevention計(jì)算機(jī)病毒技術(shù)及其防御

ComputerVirusTechnology&ItsDefense主講人:張瑜第六章ChapterSixIncubationofComputerViruses計(jì)算機(jī)病毒潛伏前言PREFACE計(jì)算機(jī)病毒在傳播至目標(biāo)系統(tǒng)后,為避免被安全軟件查殺及實(shí)現(xiàn)其后續(xù)目的,通常會采取各類隱匿方法潛伏在目標(biāo)系統(tǒng)中,伺機(jī)發(fā)作完成致命一擊。為完成潛伏功能,計(jì)算機(jī)病毒會通過隱匿、加密、變形、加殼等方法改變自身特征,或者劫持API函數(shù)調(diào)用信息,或者合法利用系統(tǒng)工具,使安全軟件難以識別和查殺。計(jì)算機(jī)病毒潛伏方法很多,本章將從病毒隱匿、病毒混淆、病毒多態(tài)及病毒加殼等方面探討計(jì)算機(jī)病毒潛伏技術(shù)。清溪深不測,隱處唯孤云。——唐·常建1病毒隱匿目錄2病毒混淆3病毒多態(tài)4病毒加殼1CHAPTER病毒隱匿Rootkit技術(shù)無文件病毒Rootkit簡介Rootkit屬性Rootkit作用Rootkit是一種通過修改操作系統(tǒng)內(nèi)核或更改指令執(zhí)行路徑,來隱藏系統(tǒng)對象(包括文件、進(jìn)程、驅(qū)動、注冊表項(xiàng)、開放端口、網(wǎng)絡(luò)連接等)以逃避或者規(guī)避標(biāo)準(zhǔn)系統(tǒng)機(jī)制的程序。攻擊者借助于Rootkit隱遁技術(shù)對已被滲透的目標(biāo)網(wǎng)絡(luò)系統(tǒng)發(fā)動的網(wǎng)絡(luò)攻擊,如入無人之境,令人束手無策,安全威脅極大。網(wǎng)絡(luò)攻擊者已開始使用ChatGPT創(chuàng)建惡意軟件、暗網(wǎng)站點(diǎn)和其他實(shí)施網(wǎng)絡(luò)攻擊的工具。此外,使用ChatGPT編寫用于網(wǎng)絡(luò)攻擊的惡意軟件代碼,將會大大降低攻擊者的編程或技術(shù)能力門檻。基礎(chǔ)知識Rootkit定義WindowsRootkit是能夠持久或可靠地、無法檢測地存在于計(jì)算機(jī)上的一組程序和代碼。一種將自身或其他對象隱藏起來,以躲過標(biāo)準(zhǔn)診斷、管理和安全軟件查看的軟件Rootkit是能夠長時(shí)間存在于計(jì)算機(jī)上或自動化信息系統(tǒng)上的未被發(fā)現(xiàn)的程序和代碼集合Rootkit在機(jī)器上建立一個(gè)遠(yuǎn)程接口,該接口允許攻擊者以一種難以察覺的方式(隱藏)對系統(tǒng)進(jìn)行操縱(指揮與控制)和收集數(shù)據(jù)(偵察)。它是一種通過使用隱形技術(shù)來隱藏系統(tǒng)對象(包括文件、進(jìn)程、驅(qū)動、服務(wù)、注冊表項(xiàng)、開放端口、網(wǎng)絡(luò)連接等)以逃避或者規(guī)避標(biāo)準(zhǔn)系統(tǒng)機(jī)制的程序。

定義

WindowsRootkit是一種越權(quán)執(zhí)行的程序或代碼,常以驅(qū)動模塊加載至系統(tǒng)內(nèi)核層或硬件層,擁有與系統(tǒng)內(nèi)核相同或優(yōu)先的權(quán)限,進(jìn)而修改系統(tǒng)內(nèi)核數(shù)據(jù)結(jié)構(gòu)或改變指令執(zhí)行流程,以隱匿相關(guān)對象、規(guī)避系統(tǒng)檢測取證,并維持對被入侵系統(tǒng)的超級用戶訪問權(quán)限。Rootkit原理如何化繁為簡,將復(fù)雜系統(tǒng)簡潔化?Rootkit設(shè)計(jì)理念是什么?

兩個(gè)問題1、計(jì)算機(jī)系統(tǒng)的抽象在計(jì)算機(jī)科學(xué)中,抽象是簡化復(fù)雜的現(xiàn)實(shí)問題的途徑,它可以為具體問題找到最恰當(dāng)?shù)念惗x,并且可以在最恰當(dāng)?shù)睦^承級別解釋問題。它可以忽略一個(gè)主題中與當(dāng)前目標(biāo)無關(guān)的那些方面,以便更充分地注意與當(dāng)前目標(biāo)有關(guān)的方面。抽象并不打算了解全部問題,而只是選擇其中的一部分,暫時(shí)不考慮其他部分細(xì)節(jié),即抽象側(cè)重于相關(guān)的細(xì)節(jié)和忽略不相關(guān)的細(xì)節(jié)。在進(jìn)行軟件設(shè)計(jì)時(shí),抽象與逐步求精、模塊化密切相關(guān),幫助定義軟件結(jié)構(gòu)中模塊的實(shí)體,由抽象到具體地分析和構(gòu)造出軟件的層次結(jié)構(gòu),提高軟件的可理解性。Rootkit原理1、計(jì)算機(jī)系統(tǒng)的抽象復(fù)雜問題局部化,增加系統(tǒng)可讀性層次之間的組織結(jié)構(gòu)與依賴關(guān)系清晰化,增加系統(tǒng)可靠性層次的增減簡單化,增加系統(tǒng)靈活性與可適應(yīng)性。層次結(jié)構(gòu)1112采用此類結(jié)構(gòu)的軟件系統(tǒng)由2大部分組成:①運(yùn)行于核心態(tài)的內(nèi)核,②運(yùn)行于用戶態(tài)并以客戶/服務(wù)器方式運(yùn)行的進(jìn)程層內(nèi)核提供所有操作系統(tǒng)的基本操作,如線程調(diào)度、虛擬存儲、消息傳遞、設(shè)備驅(qū)動以及內(nèi)核的原語操作集和中斷處理等??蛻?服務(wù)器結(jié)構(gòu)Rootkit原理1、計(jì)算機(jī)系統(tǒng)的抽象在軟件系統(tǒng)中,所有高級語言都以迭代或遞歸算法來處理數(shù)據(jù),且所有語言均須翻譯成更低級的機(jī)器語言方能執(zhí)行或解釋。在硬件系統(tǒng)中,所有物理機(jī)器均由邏輯門構(gòu)成的組合或時(shí)序電路組成。操作系統(tǒng)通過3個(gè)抽象概念來實(shí)現(xiàn)這兩個(gè)功能:①文件、②虛擬存儲器,③進(jìn)程。文件是對IO設(shè)備的抽象表示,虛擬存儲器是對主存和IO設(shè)備的抽象表示,進(jìn)程是對CPU、主存和IO設(shè)備的抽象表示。Rootkit原理2、Rootkit設(shè)計(jì)理念(1)確保獲得控制權(quán)在計(jì)算機(jī)系統(tǒng)中,這種層與層之間的耦合機(jī)制就是接口(Interface)。接口從本質(zhì)上說是信息中轉(zhuǎn)站,完成各層之間的信息交互,起著承前啟后、承上啟下的信息傳遞與轉(zhuǎn)換作用。如能突破系統(tǒng)安全機(jī)制,通過替換該接口、修改接口信息或者修改接口所使用的數(shù)據(jù)結(jié)構(gòu),就能使該接口為我所控、為我所用,以至縱橫馳騁、為所欲為。(2)確保隱藏自身作為隱遁攻擊技術(shù),Rootkit如能在CPU的環(huán)О級別運(yùn)行,將能獲得如下優(yōu)勢:①執(zhí)行特權(quán)指令②訪問所有內(nèi)存地址空間③控制CPU表和系統(tǒng)表④監(jiān)控其他軟件執(zhí)行。Rootkit原理運(yùn)行于計(jì)算機(jī)系統(tǒng)的應(yīng)用層,處于Windows系統(tǒng)的用戶模式,其權(quán)限受控。-01--02--03-用戶層運(yùn)行于Windows系統(tǒng)的內(nèi)核模式,擁有特權(quán)可執(zhí)行CPU的特權(quán)指令主要包括固件Rootkit和硬件Rootkit。其中固件Rootkit運(yùn)行于計(jì)算機(jī)系統(tǒng)的固件中,先于操作系統(tǒng)啟動,其執(zhí)行不受操作系統(tǒng)約束內(nèi)核層底層Rootkit原理1、應(yīng)用層Rootkit技術(shù)減少外部導(dǎo)入例程所占用的內(nèi)存容量。DLL允許程序?qū)⑼ㄓ美讨糜诠蚕砟K中來共享內(nèi)存,即DLL代碼在物理內(nèi)存中只有一個(gè)運(yùn)行實(shí)例。盡管每個(gè)導(dǎo)入DLL例程的應(yīng)用程序都可獲得DLL副本,但卻將其所導(dǎo)入的DLL代碼分配的線性地址范圍映射至相同的物理內(nèi)存區(qū)。DLL的設(shè)計(jì)初衷IAT鉤子InlineFunction鉤子DLL注入DLL劫持Rootkit常用的4種技術(shù)Rootkit原理IAT(ImportAddressTable,導(dǎo)入地址表),是嵌于Windows應(yīng)用程序中的調(diào)用表,用于存儲該程序從外部DLL(DynamicLinkLibrary,動態(tài)鏈接庫)導(dǎo)入的例程地址。當(dāng)應(yīng)用程序執(zhí)行時(shí),IAT將被自動填充以便其調(diào)用DLL中的相關(guān)庫例程。IAT表是PE(PortableExecutable,可移植的執(zhí)行體)文件格式的重要組成部分。所謂IAT鉤子,就是用Rootkit設(shè)計(jì)的例程地址替換目標(biāo)進(jìn)程IAT表中的地址,從而實(shí)現(xiàn)Rootkit想完成的隱匿功能。為實(shí)現(xiàn)IAT鉤子,大致需按如下步驟來完成:在內(nèi)存中定位IAT表→保存表中操作項(xiàng)→以新地址替換該操作項(xiàng)→完成后再恢復(fù)該操作項(xiàng)。①IAT鉤子Rootkit原理就是將Rootkit實(shí)現(xiàn)的DLL加載至目標(biāo)程序的內(nèi)存空間,使其能訪問目標(biāo)程序的IAT表,并用Rootkit實(shí)現(xiàn)的DLL對目標(biāo)程序的IAT進(jìn)行替換,以使目標(biāo)程序訪問Rootkit'實(shí)現(xiàn)的例程,從而達(dá)到隱匿等相關(guān)目的。因此,DLL注入實(shí)質(zhì)上是玩“借刀殺人”計(jì)謀來實(shí)施Rootkit相關(guān)隱匿功能。概括起來,DLL注入方法大致有4種:⑴修改注冊表鍵值,⑵利用SetWindowsHookEx進(jìn)行注入,⑶利用BHO(BrowserHelperObject,瀏覽器輔助對象),(4使用CreateRemoteThread進(jìn)行注入。②

DLL注入Rootkit原理在Windows系統(tǒng)中,當(dāng)應(yīng)用程序執(zhí)行時(shí),Windows加載器將其可執(zhí)行模塊映射至該進(jìn)程地址空間,同時(shí)分析可執(zhí)行模塊的IAT表,查找所需的DLL并將其映射至該進(jìn)程的地址空間。由于應(yīng)用程序的IAT表只包含DLL名稱而無其具體路徑名,因此,Windows加載器將在磁盤上搜索IAT表所包含的DLL文件。搜索DLL文件的順序?yàn)?首先,從當(dāng)前應(yīng)用程序所在目錄加載DLL;其次,如沒找到,則在Windows系統(tǒng)目錄查找;最后,在環(huán)境變量中所列出的各個(gè)目錄中查找。③

DLL劫持Rootkit原理DLL劫持就是利用了Windows加載器搜索DLL順序,通過偽造一個(gè)與系統(tǒng)同名的DLL,提供同樣的輸出表,每個(gè)輸出函數(shù)轉(zhuǎn)向真正的系統(tǒng)DLL。應(yīng)用程序調(diào)用系統(tǒng)DLL時(shí),將首先調(diào)用當(dāng)前目錄中偽造的系統(tǒng)DLL,完成相關(guān)隱匿功能后,再跳轉(zhuǎn)至真正的系統(tǒng)DLL的函數(shù)執(zhí)行。因此,DLL劫持實(shí)質(zhì)上就是利用Windows系統(tǒng)正常搜索路徑的“貍貓換太子”替換操作來完成Rootkit相關(guān)功能。Rootkit原理2、內(nèi)核層Rootkit技術(shù)內(nèi)核層Rootkit是一種運(yùn)行于操作系統(tǒng)內(nèi)核,能以CPU的最高權(quán)限執(zhí)行的,以隱遁、操縱、收集數(shù)據(jù)為主要目的的惡意代碼。與用戶層Rootkit一樣,內(nèi)核層Rootkit要能順利執(zhí)行,同樣需要解決兩個(gè)問題:⑴如何進(jìn)入系統(tǒng)內(nèi)核,⑵如何修改內(nèi)核以隱匿自身。在Windows環(huán)境中,內(nèi)核層Rootkit定義系統(tǒng)表格鉤子映像修改過濾驅(qū)動程序直接內(nèi)核對象操縱內(nèi)核層Rootkit技術(shù)內(nèi)容Rootkit原理①系統(tǒng)表格鉤子在內(nèi)核空間中,系統(tǒng)表格可分為2類:(1)Windows系統(tǒng)的調(diào)用表(軟件表),譬如:實(shí)現(xiàn)系統(tǒng)服務(wù)調(diào)用的SSDT(SystemServiceDescriptorTable)表,實(shí)現(xiàn)IO操作的IRP(IORequestPackets)調(diào)度表;(2)IA-32處理器的調(diào)用表(硬件表),譬如:進(jìn)行內(nèi)存訪問所用的GDT(GlobalDescriptorTable)表。此類系統(tǒng)表格中記載著內(nèi)核函數(shù)具體地址的重要信息,能影響系統(tǒng)的指令指令流程和執(zhí)行結(jié)果,因此,一直是內(nèi)核層Rootkit必爭之地。Rootkit原理SSDT:由于SSDT包含著龐大的地址索引表和其它重要信息,諸如地址索引的基地址、服務(wù)函數(shù)個(gè)數(shù)等,因此,通過修改此表的函數(shù)地址就可對常用WindowsAPI函數(shù)進(jìn)行鉤掛,從而實(shí)現(xiàn)對相關(guān)系統(tǒng)動作的過濾、監(jiān)控。目前商用的HIPS、防毒軟件、系統(tǒng)監(jiān)控、注冊表監(jiān)控軟件無一例外不是通過SSDT鉤子方式來實(shí)現(xiàn)其監(jiān)控功能。SSDTHook:由于SSDT中保存著系統(tǒng)函數(shù)地址,如Rootkit能鉤掛該表中相應(yīng)表項(xiàng),就可重定向程序執(zhí)行邏輯,使相關(guān)的系統(tǒng)調(diào)用請求被重定向至Rootkit代碼,從而實(shí)現(xiàn)Rootkit想要完成的操作。這也是SSDTHook的基本原理。Rootkit原理②映像修改映像修改,是指對目標(biāo)程序文件本身的二進(jìn)制代碼的修改。通過修改目標(biāo)程序文件的二進(jìn)制代碼,Rootkit可改變程序執(zhí)行邏輯,從而達(dá)到操控執(zhí)行流程的目的。映像修改常采用2種策略實(shí)現(xiàn):⑴靜態(tài)磁盤代碼修改,⑵運(yùn)行時(shí)代碼修改。對于前者,涉及修改磁盤上的靜態(tài)二進(jìn)制代碼,會留下明顯取證蹤跡,對于后者,涉及修改目標(biāo)代碼的內(nèi)存映像,事后取證困難。常見的映像修改方法有2類:(1)Detours,(2)內(nèi)聯(lián)函數(shù)鉤子(InlineFunctionHook)(請參考應(yīng)用層Rootkit技術(shù))。Rootkit原理針對一個(gè)函數(shù),Detours通常使用JMP或CALL指令來覆蓋函數(shù)序言,跳轉(zhuǎn)至Detours自己的函數(shù)。被替換的API函數(shù)的前幾條指令被保存到Trampoline函數(shù)中。Trampoline保存了被替換的目標(biāo)API的前幾條指令和一個(gè)無條件轉(zhuǎn)移,轉(zhuǎn)移到目標(biāo)API余下的指令。當(dāng)執(zhí)行到目標(biāo)API時(shí),直接跳到用戶提供的攔截函數(shù)中執(zhí)行,這時(shí)攔截函數(shù)就可以執(zhí)行自己的代碼了。Rootkit原理③過濾驅(qū)動程序借助Windows系統(tǒng)過濾驅(qū)動范式,Rootkit同樣可攔截IRP請求,進(jìn)而根據(jù)需要修改、過濾相關(guān)數(shù)值,達(dá)到隱匿自身目的。Windows系統(tǒng)支持堆疊式的設(shè)備添加機(jī)制,通過將自身驅(qū)動棧疊加至系統(tǒng)驅(qū)動設(shè)備棧上,就可實(shí)現(xiàn)設(shè)備過濾驅(qū)動。首先,調(diào)用IoGetDeviceObjectPointer獲得指向設(shè)備棧中第一個(gè)設(shè)備的指針;其次,使用來自設(shè)備棧中下一個(gè)低層的驅(qū)動程序的設(shè)備對象信息,用自定義數(shù)據(jù)初始化自己的設(shè)備對象;之后,調(diào)用IoAttachDeviceToDeviceStack,傳遞一個(gè)指向需加入的初始化對象的指針和一個(gè)指向希望連接的設(shè)備棧的指針。Rootkit原理④直接內(nèi)核對象操縱DKOM直接修改內(nèi)存中本次執(zhí)行流內(nèi)核和內(nèi)核對象(內(nèi)核數(shù)據(jù)結(jié)構(gòu)),從而完成進(jìn)程隱藏、驅(qū)動隱藏、特權(quán)提升等功能。在Windows系統(tǒng)中,每個(gè)運(yùn)行進(jìn)程都在內(nèi)存中存儲信息,對應(yīng)一個(gè)EPROCESS結(jié)構(gòu),其中保存著進(jìn)程的各種信息和相關(guān)結(jié)構(gòu)的指針。該結(jié)構(gòu)中的雙向鏈表成員FLINK和BLINK分別指向當(dāng)前進(jìn)程描述符的前方和后方進(jìn)程。Rootkit原理3、底層Rootkit技術(shù)從功能實(shí)現(xiàn)的角度,計(jì)算機(jī)系統(tǒng)的上層,其實(shí)現(xiàn)抽象、功能復(fù)雜、權(quán)限受限;反之,計(jì)算機(jī)系統(tǒng)的低層,其實(shí)現(xiàn)具體、功能簡單、權(quán)限充分。因此,對于側(cè)重于獲取執(zhí)行特權(quán)的Rootkit而言,其駐留之地越往低層,則其所展示的權(quán)限控制與隱匿技巧就越出神入化、其自身就越難以被察覺。內(nèi)核層Rootkit概述擴(kuò)展的處理器模式固件硬件內(nèi)核層Rootkit技術(shù)內(nèi)容Rootkit原理①擴(kuò)展的處理器模式對于處理器而言,其所處的具體模式將決定其內(nèi)存組織、機(jī)器指令集以及其可用的系統(tǒng)架構(gòu)。底層Rootkit如能充分利用處理器模式,將能在內(nèi)存與指令集利用方面展現(xiàn)其特殊技能,達(dá)到擴(kuò)權(quán)與隱匿效果。目前,就IA-32體系結(jié)構(gòu)的處理器而言,主要有3種模式:⑴實(shí)模式,⑵保護(hù)模式,⑶系統(tǒng)管理模式。對于前兩種處理器模式,Rootkit技術(shù)已進(jìn)行了充分利用,上述應(yīng)用層和內(nèi)核層所討論的Rootkit技術(shù)就是基于這兩種模式。本部分著重討論基于系統(tǒng)管理模式的Rootkit技術(shù)。Rootkit原理②固件對于計(jì)算機(jī)系統(tǒng)而言,層次越低,其啟動順序就越靠前,反之亦然。如想盡可能靠前啟動,則程序就必須盡可能駐留于系統(tǒng)低層。對于Rootkit而言,想擺脫操作系統(tǒng)中安裝的各類相關(guān)安全軟件的檢測,就應(yīng)該駐留低層,使自身先期啟動,再通過捕獲并修改相關(guān)操作,達(dá)到隱匿自身、逍遙法外的目的。固件,就是將相關(guān)代碼固化于可編程存儲設(shè)備中,再通過相關(guān)機(jī)制啟動其中代碼執(zhí)行,以此來簡化系統(tǒng)設(shè)計(jì)、快速執(zhí)行的硬件。由于固件通常都有存儲代碼與數(shù)據(jù)的存儲器,Rootkit只要能修改固件存儲器中的數(shù)據(jù),就能實(shí)現(xiàn)隱匿自身、隱遁攻擊的目的。Rootkit原理③硬件計(jì)算機(jī)主板是計(jì)算機(jī)系統(tǒng)資源聚集地,除了能提供常規(guī)功能之外,還能為新技術(shù)提供支撐。Intel公司推出的AMT(ActiveManagementTechnoloy,主動管理技術(shù)),通過在主板上提供獨(dú)立的CPU和內(nèi)存,借助AMT芯片組與RAM隔離,并通過專用通道與網(wǎng)絡(luò)硬件相連。因此,如能基于該項(xiàng)技術(shù),繞過AMT芯片組的內(nèi)存隔離并修改相關(guān)代碼,則完全不需要與操作系統(tǒng)交互就能達(dá)到隱遁攻擊目的。譬如,InvisibleThingLab在2009年BlackHat大會上所展示的RootkitoRootkit原理無文件病毒是一種利用已安裝在計(jì)算機(jī)上合法的系統(tǒng)工具或應(yīng)用程序的惡意攻擊,其主要目的是為規(guī)避安全軟件查殺并維持持久駐留目標(biāo)系統(tǒng)。它通常利用合法或正當(dāng)活動的應(yīng)用程序在內(nèi)存中執(zhí)行計(jì)算機(jī)病毒。與多數(shù)計(jì)算機(jī)病毒不同,無文件病毒不會在目標(biāo)計(jì)算機(jī)的硬盤中留下蛛絲馬跡,而是通過使用漏洞、宏、腳本或合法的系統(tǒng)工具,直接將病毒代碼隱匿于內(nèi)存或注冊表中。由于沒有病毒文件落地,傳統(tǒng)基于文件掃描的安全軟件難以檢測到它們的存在。

無文件病毒定義根據(jù)無文件病毒所采用的隱匿技術(shù)不同灰色工具型潛伏型腳本型內(nèi)存型無文件病毒分類1灰色工具型代換密碼灰色工具型無文件病毒,又稱為離地攻擊(Living-0ff-the-Land),是利用系統(tǒng)或應(yīng)用程序提供的合法組件或工具,如:注冊表、NTFS數(shù)據(jù)流、Powershell、CMD、VBScript、JavaScript、RundI132、Explorer、Perl等去隱匿或執(zhí)行計(jì)算機(jī)病毒由于這些合法的系統(tǒng)組件或工具是為管理員維護(hù)計(jì)算機(jī)環(huán)境以及對系統(tǒng)的管理,安全軟件一般不會限制其使用,但這易為計(jì)算機(jī)病毒所使用我們將以NTFS的ADS數(shù)據(jù)流和系統(tǒng)合法組件注冊表為例來解釋說明此類灰色工具型無文件病毒。無文件病毒分類眾所周知,NTFS(NewTechnologyFileSystem)是WindowsNT系列操作系統(tǒng)支持的、為網(wǎng)絡(luò)和磁盤配額、文件加密等管理安全特性設(shè)計(jì)的磁盤文件格式,它提供長文件名、數(shù)據(jù)保護(hù)和恢復(fù),能通過目錄和文件許可實(shí)現(xiàn)安全性,并支持跨越分區(qū)。NTFS備用數(shù)據(jù)流(AlternateDataStreams,ADS)是NTFS磁盤文件格式的一個(gè)特性。NTFSADS推出的初衷是為兼容蘋果公司的分層文件系統(tǒng)(HierarchicalFileSystem,HFS)。HFS文件系統(tǒng)將不同的數(shù)據(jù)存儲于不同的分支文件,文件數(shù)據(jù)存放在數(shù)據(jù)分支而文件參數(shù)存放在資源分支。在NTFS文件系統(tǒng)下,文件或目錄可由兩個(gè)部分組成:主數(shù)據(jù)流(PrimaryDataStream,PDS),備用數(shù)據(jù)流(AlternateDataStreams,ADS)。主數(shù)據(jù)流(PDS)是指文件或目錄的標(biāo)準(zhǔn)內(nèi)容,通常對用戶可見。備用數(shù)據(jù)流(ADS)則允許將一些元數(shù)據(jù)嵌入文件或是目錄,而不需要修改其原始功能或內(nèi)容,其內(nèi)容通常是隱藏的。無文件病毒分類1.NTFSADS數(shù)據(jù)流文件創(chuàng)建在NTFS分區(qū)創(chuàng)建ADS數(shù)據(jù)流文件有兩種形式:一是指定宿主文件;二是創(chuàng)建單獨(dú)的ADS文件。常用的創(chuàng)建命令有兩個(gè):echo和type。echo用于輸入常規(guī)字符,type則用于將文件附加到目標(biāo)文件。①使用echo命令創(chuàng)建指定宿主文件的ADS數(shù)據(jù)流文件Echo命令會將輸入的字符串送往標(biāo)準(zhǔn)輸出,可使用echo命令創(chuàng)建文本類型的ADS數(shù)據(jù)流文件。例如,使用echo命令為primary.txt宿主文件創(chuàng)建ADS數(shù)據(jù)流文件gpnu.txt,在cmd控制臺輸入內(nèi)容為:無文件病毒分類在正常情況下,ADS數(shù)據(jù)流文件是不可見的,但可使用如下命令查看無文件病毒分類可使用Notepad(

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論