緩沖區(qū)溢出攻擊_第1頁(yè)
緩沖區(qū)溢出攻擊_第2頁(yè)
緩沖區(qū)溢出攻擊_第3頁(yè)
緩沖區(qū)溢出攻擊_第4頁(yè)
緩沖區(qū)溢出攻擊_第5頁(yè)
已閱讀5頁(yè),還剩60頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

緩沖區(qū)溢出攻擊第一頁(yè),共六十五頁(yè),2022年,8月28日微軟安全中心微軟每月第二周的周二發(fā)布補(bǔ)?。˙LACKTUESDAY),許多黑客通宵達(dá)旦去研究這些補(bǔ)丁PATCK了哪些漏洞,并寫(xiě)出EXPLOIT,因?yàn)樵谘a(bǔ)丁剛發(fā)布的一段時(shí)間內(nèi),并非所有用戶能及時(shí)修復(fù)。公布漏洞的兩個(gè)權(quán)威機(jī)構(gòu)CEV、CERT。第二頁(yè),共六十五頁(yè),2022年,8月28日二進(jìn)制文件PE(PORTABLEEXECUTABLE)是WIN32平臺(tái)下可執(zhí)行文件(EXE、DLL)的數(shù)據(jù)格式。一個(gè)可執(zhí)行文件除包含二進(jìn)制的機(jī)器代碼外,還帶有字符串、菜單、圖標(biāo)、位圖、字體等,PE文件格式規(guī)定了這些信息在可執(zhí)行文件中如何組織,在程序被執(zhí)行時(shí),OS會(huì)按照PE文件格式的約定去相應(yīng)的地方精確地定位各種資源,并分別裝入內(nèi)存的不同區(qū)域。第三頁(yè),共六十五頁(yè),2022年,8月28日PE文件格式PE文件格式把可執(zhí)行文件分成幾個(gè)數(shù)據(jù)節(jié)(SECTION),不同的資源存放在不同的節(jié)中。TEXT由編譯器產(chǎn)生,存放二進(jìn)制的機(jī)器代碼,是反匯編和調(diào)試的對(duì)象。DATA初始化的數(shù)據(jù)塊,如宏定義、全局變量、靜態(tài)變量等。IDATA可執(zhí)行文件所使用的動(dòng)態(tài)鏈接庫(kù)等外來(lái)函數(shù)與文件的信息。RSRC存放程序的資源,如圖標(biāo)、菜單等。第四頁(yè),共六十五頁(yè),2022年,8月28日PE文件格式其他的節(jié)RELOC\EDATA\TLS\RDATA使用VISUALC++中的編譯指示符#PRAGMADATA_SEG()可把代碼中的任意部分編譯到PE的任意節(jié)中,節(jié)名也可任意定義。如可執(zhí)行文件經(jīng)過(guò)了加殼處理,PE得節(jié)信息會(huì)變得古怪,在CRACK和反病毒分析中要經(jīng)常處理這些古怪的PE文件第五頁(yè),共六十五頁(yè),2022年,8月28日虛擬內(nèi)存WINDOWS的內(nèi)存分成兩個(gè)層面:物理內(nèi)存和虛擬內(nèi)存。物理內(nèi)存很復(fù)雜,需進(jìn)入WINDOWS內(nèi)核級(jí)別RING0才能看到。在用戶模式,我們用調(diào)試器看到的內(nèi)存地址都是虛擬內(nèi)存。每個(gè)進(jìn)程都相信自己擁有獨(dú)立的4GB內(nèi)存空間。第六頁(yè),共六十五頁(yè),2022年,8月28日WINDOWS虛擬內(nèi)存與物理內(nèi)存進(jìn)程1進(jìn)程1的虛擬內(nèi)存(4GB)進(jìn)程2進(jìn)程3進(jìn)程2的虛擬內(nèi)存(4GB)進(jìn)程3的虛擬內(nèi)存(4GB)虛擬內(nèi)存管理器真正的物理內(nèi)存512M第七頁(yè),共六十五頁(yè),2022年,8月28日PE文件與虛擬內(nèi)存之間的映射在調(diào)試漏洞時(shí),要做兩件操作(1)用靜態(tài)反匯編工具看到的PE文件中某條指令的位置是相對(duì)于磁盤(pán)文件而言的,即所謂的文件偏移,我們還需要知道這條指令在內(nèi)存中的位置,即虛擬內(nèi)存地址(VA)。(2)在調(diào)試時(shí)看到的摩條指令的地址是虛擬內(nèi)存地址,我們需要回到PE文件中找到這條指令對(duì)應(yīng)的機(jī)器碼。第八頁(yè),共六十五頁(yè),2022年,8月28日PE文件地址與虛擬內(nèi)存地址之間的映射關(guān)系文件偏移地址(FILEOFFSET)數(shù)據(jù)在PE文件中的地址為文件偏移地址,這是文件在磁盤(pán)上存放時(shí)相對(duì)于文件開(kāi)頭的偏移。裝載基址(IMAGEBASE):PE文件裝入內(nèi)存時(shí)的基地址。默認(rèn)情況下,EXE文件在內(nèi)存中的基址是0X00400000,DLL文件是0X10000000。這些位置可通過(guò)修改編譯選相更改。第九頁(yè),共六十五頁(yè),2022年,8月28日PE文件地址與虛擬內(nèi)存地址之間的映射關(guān)系虛擬內(nèi)存地址(VIRTUALADDRESS,VA)PE文件中的指令被裝入內(nèi)存后的地址。相對(duì)虛擬地址(RELATIVEVIRTUALADDRESS,RVA)相對(duì)虛擬地址是內(nèi)存地址相對(duì)于映射基址的偏移量。他們間的關(guān)系:VA=IMAGEBASE+RVA第十頁(yè),共六十五頁(yè),2022年,8月28日PE文件與虛擬內(nèi)存的映射關(guān)系PE文件內(nèi)存其他DATA節(jié)RDATA節(jié)TEXT節(jié)文件頭、節(jié)表等DATA節(jié)RDATA節(jié)TEXT節(jié)文件頭、節(jié)表等PE文件起始0字節(jié)0X200字節(jié)0X200字節(jié)0X200字節(jié)裝載基址0X004000000X1000字節(jié)0X1000字節(jié)0X1000字節(jié)第十一頁(yè),共六十五頁(yè),2022年,8月28日PE文件與虛擬內(nèi)存的映射關(guān)系在上圖中,在默認(rèn)情況下,一般PE文件的0字節(jié)將映射到虛擬內(nèi)存的0X00400000位置,即為裝載基址(IMAGEBASE)。文件偏移是相對(duì)于文件開(kāi)始處0字節(jié)的偏移,RVA是相對(duì)于裝載基址0X00400000處的偏移,OS在裝載時(shí)基本上保持PE中的各種數(shù)據(jù)結(jié)構(gòu),所以文件偏移地址和RVA有很大的關(guān)系。第十二頁(yè),共六十五頁(yè),2022年,8月28日基本的理由PE文件中的數(shù)據(jù)按照磁盤(pán)數(shù)據(jù)標(biāo)準(zhǔn)存放,以0X200字節(jié)為基本單位進(jìn)行組織。一個(gè)數(shù)據(jù)節(jié)(SECTION)不足0X200字節(jié)時(shí),以0X00填充,因此PE數(shù)據(jù)節(jié)的大小是0X200的整數(shù)倍。同理,當(dāng)代碼裝入內(nèi)存后,按照內(nèi)存數(shù)據(jù)標(biāo)準(zhǔn)存放,以0X1000字節(jié)為基本單位進(jìn)行組織,因此內(nèi)存中的數(shù)據(jù)節(jié)的大小是0X1000的整數(shù)倍。第十三頁(yè),共六十五頁(yè),2022年,8月28日節(jié)偏移由于內(nèi)存中數(shù)據(jù)節(jié)相對(duì)于裝載基址的偏移量和文件中數(shù)據(jù)節(jié)的偏移量有上述差異,在進(jìn)行文件偏移到虛擬內(nèi)存地址之間的換算時(shí)要考慮到所轉(zhuǎn)換的地址位于第幾個(gè)節(jié)中。這種由存儲(chǔ)單位差異引起的節(jié)基址差稱(chēng)為節(jié)偏差第十四頁(yè),共六十五頁(yè),2022年,8月28日轉(zhuǎn)換關(guān)系文件偏移地址=虛擬內(nèi)存地址(VA)-裝載基址(IMAGEBASE)-節(jié)偏移=RVA-節(jié)偏移一些PE工具提供了這類(lèi)地址轉(zhuǎn)換,如LORDPE,他也可用來(lái)查看PE文件中的節(jié)信息。第十五頁(yè),共六十五頁(yè),2022年,8月28日系統(tǒng)棧的工作原理——內(nèi)存的不同用途

緩沖區(qū)溢出就是在大緩沖區(qū)中的數(shù)據(jù)向小緩沖區(qū)復(fù)制的過(guò)程中,由于沒(méi)注意小緩沖區(qū)的邊界,”撐破“了較小的緩沖區(qū),從而覆蓋了與小緩沖區(qū)相鄰內(nèi)存區(qū)域的其他數(shù)據(jù)而引起的內(nèi)存問(wèn)題。緩沖區(qū)溢出是攻擊者入侵系統(tǒng)時(shí)所用到的最強(qiáng)大、最經(jīng)典的一種漏洞利用方式。利用緩沖區(qū)溢出漏洞可以修改內(nèi)存中變量的值,可以劫持進(jìn)程,執(zhí)行惡意代碼,最終控制主機(jī)。第十六頁(yè),共六十五頁(yè),2022年,8月28日理解緩沖區(qū)溢出攻擊的條件CPU、寄存器、內(nèi)存的協(xié)同工作讓程序流暢地執(zhí)行。第十七頁(yè),共六十五頁(yè),2022年,8月28日內(nèi)存的不同用途不同的OS,一個(gè)進(jìn)程可被分配到不同的內(nèi)存區(qū)域去執(zhí)行,但進(jìn)程使用的內(nèi)存可按功能大致分成4個(gè)部分。代碼區(qū):存儲(chǔ)被裝入執(zhí)行的二進(jìn)制機(jī)器代碼,處理器會(huì)到這個(gè)區(qū)域取指令并執(zhí)行。數(shù)據(jù)區(qū):存儲(chǔ)全局變量等。堆區(qū):進(jìn)程可在堆區(qū)動(dòng)態(tài)請(qǐng)求一定大小的內(nèi)存,并在用完后還給堆區(qū),是動(dòng)態(tài)分配和回收。第十八頁(yè),共六十五頁(yè),2022年,8月28日內(nèi)存的不同用途棧區(qū):用于動(dòng)態(tài)地存儲(chǔ)函數(shù)之間的調(diào)用關(guān)系,以保證被調(diào)用函數(shù)在返回時(shí)恢復(fù)到母函數(shù)中繼續(xù)執(zhí)行。深入理解程序的運(yùn)行機(jī)制,請(qǐng)參閱《深入理解計(jì)算機(jī)系統(tǒng)》一書(shū)。在WINDOWS平臺(tái),高級(jí)語(yǔ)言寫(xiě)的程序經(jīng)過(guò)編譯連接后變成了PE文件。當(dāng)PE文件被裝載運(yùn)行后,就成了所謂的進(jìn)程。第十九頁(yè),共六十五頁(yè),2022年,8月28日程序運(yùn)行的協(xié)作過(guò)程PE文件代碼段中包含的二進(jìn)制機(jī)器代碼會(huì)被裝入內(nèi)存的代碼區(qū)(TEXT),處理器會(huì)到內(nèi)存的這個(gè)區(qū)域一條一條地取出指令和操作數(shù),并送入算術(shù)邏輯單元進(jìn)行運(yùn)算。如代碼請(qǐng)求開(kāi)辟動(dòng)態(tài)內(nèi)存,則會(huì)在內(nèi)存的堆區(qū)分配一塊大小合適的區(qū)域返回給代碼區(qū)的代碼使用。如函數(shù)調(diào)用發(fā)生時(shí),函數(shù)的調(diào)用關(guān)系等信息會(huì)動(dòng)態(tài)地保存在內(nèi)存的棧區(qū),以供處理器在執(zhí)行完被調(diào)用函數(shù)的代碼時(shí),返回母函數(shù)。第二十頁(yè),共六十五頁(yè),2022年,8月28日協(xié)作過(guò)程PE文件裝載運(yùn)行------------XOREBX,EBXMOVBH,4SUBESP,EBPMOVBX,3234PUSHEBXPUSH723456PUSHESPXOREDX,EDX----------------進(jìn)程的虛擬內(nèi)存空間堆數(shù)據(jù)區(qū)(全局變量)當(dāng)前函數(shù)的棧幀函數(shù)棧幀函數(shù)棧幀函數(shù)棧幀--------函數(shù)棧幀ESPEBPEIP第二十一頁(yè),共六十五頁(yè),2022年,8月28日緩沖區(qū)的分類(lèi)進(jìn)程中所用的緩沖區(qū)可以是堆區(qū)、棧區(qū)和存放靜態(tài)變量的數(shù)據(jù)區(qū)。緩沖區(qū)溢出的利用方法和緩沖區(qū)到底屬于上面哪個(gè)內(nèi)存區(qū)域密不可分,我們主要針對(duì)系統(tǒng)棧的情形。第二十二頁(yè),共六十五頁(yè),2022年,8月28日棧與系統(tǒng)棧棧是一種數(shù)據(jù)結(jié)構(gòu),是一種先進(jìn)后出的數(shù)據(jù)表,他有兩種常見(jiàn)操作:壓棧(PUSH)、彈棧(POP),標(biāo)示棧頂(TOP),棧低(BASE)。內(nèi)存的棧區(qū)實(shí)際上指的就是系統(tǒng)棧,由系統(tǒng)自動(dòng)維護(hù),它用于實(shí)現(xiàn)高級(jí)語(yǔ)言中函數(shù)的調(diào)用,對(duì)類(lèi)C的高級(jí)語(yǔ)言來(lái)說(shuō),PUSH和POP是透明的,在用匯編語(yǔ)言設(shè)計(jì)程序時(shí),才需和它直接打交道。第二十三頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)調(diào)用時(shí)發(fā)生了什么先看一段代碼:int func_B(intarg_B1,intarg_B2){ intvar_B1,var_B2; var_B1=arg_B1+arg_B2; var_B2=arg_B1-arg_B2; returnvar_B1*var_B2;}int func_A(intarg_A1,intarg_A2){ intvar_A; var_A=func_B(arg_A1,arg_A2)+arg_A1; returnvar_A;}intmain(intargc,char**argv,char**envp){ intvar_main; var_main=func_A(4,3); returnvar_main;}第二十四頁(yè),共六十五頁(yè),2022年,8月28日機(jī)器指令在代碼區(qū)中的分布上段代碼經(jīng)過(guò)編譯器編譯后,各個(gè)對(duì)應(yīng)的機(jī)器指令在代碼區(qū)中可能是這樣分布的-------(其他指令)-------(FUNC_A的指令)-------------(MAIN函數(shù)指令)----------------(其他指令)------FUNC_B的指令-----------第二十五頁(yè),共六十五頁(yè),2022年,8月28日機(jī)器指令在代碼區(qū)中的分布依據(jù)OS的不同,編譯器和編譯選項(xiàng)的不同,同一文件不同函數(shù)的代碼在內(nèi)存代碼區(qū)中的分布可能相鄰,也可能相離甚遠(yuǎn),可能先后有序,也可能無(wú)序,但他們都在同一個(gè)PE文件的代碼所影射的一個(gè)節(jié)里。當(dāng)CPU在執(zhí)行調(diào)用FUNC_A函數(shù)時(shí),會(huì)從代碼區(qū)中MAIN函數(shù)對(duì)應(yīng)的機(jī)器指令的區(qū)域跳轉(zhuǎn)到FUNC_A函數(shù)對(duì)應(yīng)的機(jī)器指令區(qū)域,在那里取指并執(zhí)行;當(dāng)FUNC_A函數(shù)執(zhí)行完畢,需返回時(shí),又會(huì)跳回到MAIN函數(shù)對(duì)應(yīng)的機(jī)器指令區(qū)域,緊接著調(diào)用FUNC_A函數(shù)后面的指令繼續(xù)執(zhí)行MAIN函數(shù)的代碼。第二十六頁(yè),共六十五頁(yè),2022年,8月28日CPU在代碼區(qū)中的取指軌跡MAIN函數(shù)入口---------CALLFUNC_A后繼的指令--------返回指令FUNC_B函數(shù)入口---------返回指令FUNC_A函數(shù)入口-----------CALLFUNC_B后繼的指令-----------返回指令返回到上層函數(shù)的代碼空間,緊接著執(zhí)行函數(shù)調(diào)用的后繼指令處理器跳轉(zhuǎn)去FUNC_A的代碼空間去繼續(xù)執(zhí)行跳轉(zhuǎn)去FUNC_B的代碼空間取指執(zhí)行第二十七頁(yè),共六十五頁(yè),2022年,8月28日系統(tǒng)棧的作用CPU是如何知道要去FUNC_A的代碼區(qū)取指,在執(zhí)行完FUNC_A后又是如何知道跳回到MAIN函數(shù)(而不是FUNC_B的代碼區(qū))?CPU從何得知這些函數(shù)的調(diào)用及返回信息?在代碼區(qū)中精確的跳轉(zhuǎn)都是借助系統(tǒng)棧的配合。當(dāng)函數(shù)被調(diào)用時(shí),系統(tǒng)棧會(huì)為這個(gè)函數(shù)開(kāi)辟一個(gè)新的棧幀,并把它壓入棧中,這個(gè)棧幀中的內(nèi)存空間被它所屬的函數(shù)獨(dú)占,是不會(huì)和別的函數(shù)共享的。當(dāng)函數(shù)返回時(shí),系統(tǒng)棧會(huì)彈出該函數(shù)所對(duì)應(yīng)的棧幀。第二十八頁(yè),共六十五頁(yè),2022年,8月28日系統(tǒng)棧在函數(shù)調(diào)用時(shí)的變化棧頂方向TOP棧底方向BASEMAIN函數(shù)棧幀其他函數(shù)棧幀-------------FUNC_A棧幀局部變量返回地址MAIN函數(shù)棧幀其他函數(shù)棧幀F(xiàn)UNC_B棧幀局部變量返回地址FUNC_A棧幀局部變量返回地址MAIN函數(shù)棧幀其他函數(shù)棧幀F(xiàn)UNC_A棧幀局部變量返回地址MAIN函數(shù)棧幀其他函數(shù)棧幀MAIN函數(shù)棧幀其他函數(shù)棧幀用彈出的返回地址回溯出上一個(gè)函數(shù)的代碼空間用彈出的返回地址回溯出上一個(gè)函數(shù)的代碼空間第二十九頁(yè),共六十五頁(yè),2022年,8月28日在函數(shù)調(diào)用過(guò)程中系統(tǒng)棧中的操作MAIN函數(shù)調(diào)用FUNC_A時(shí),首先在自己的棧幀中壓入函數(shù)返回地址,然后為FUNC_A創(chuàng)建新棧幀并壓入系統(tǒng)棧。在FUNC_A調(diào)用FUNC_B時(shí),首先在自己的棧幀中壓入函數(shù)返回地址,然后為FUNC_B創(chuàng)建新棧幀并壓入系統(tǒng)棧。在FUNC_B返回時(shí),F(xiàn)UNC_B的棧幀被彈出系統(tǒng)棧,F(xiàn)UNC_A棧幀中的返回地址被露在棧頂,此時(shí)處理器按照這個(gè)返回地址重新調(diào)到FUNC_A代碼區(qū)中執(zhí)行。在FUNC_A返回時(shí),F(xiàn)UNC_A的棧幀被彈出系統(tǒng)棧,MAIN函數(shù)棧幀中的返回地址被露在棧頂,此時(shí)處理器按照這個(gè)返回地址跳到MAIN函數(shù)代碼區(qū)中執(zhí)行。第三十頁(yè),共六十五頁(yè),2022年,8月28日寄存器與函數(shù)棧幀每一個(gè)函數(shù)獨(dú)占自己的棧幀空間,當(dāng)前正在運(yùn)行的函數(shù)的棧幀總是在棧頂。WIN32系統(tǒng)用兩個(gè)特殊的寄存器來(lái)標(biāo)識(shí)位于棧頂?shù)臈?。ESP:棧指針寄存器(EXTENDEDSTACKPOINTER),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的棧頂。EBP:基址指針寄存器(EXTENDEDBASEPOINTER),其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向系統(tǒng)棧最上面一個(gè)棧幀的底部。第三十一頁(yè),共六十五頁(yè),2022年,8月28日寄存器對(duì)棧幀的標(biāo)識(shí)作用棧幀1棧幀2棧幀3棧幀----EBPESP棧頂以上的未使用的內(nèi)存空間棧幀2棧幀3棧幀----EBPESP棧幀1被釋放棧頂以上的未使用的內(nèi)存空間----------------------------------------第三十二頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)棧幀ESP和EBP之間的內(nèi)存空間為當(dāng)前棧幀,ESP標(biāo)識(shí)了當(dāng)前棧幀的頂部,EBP標(biāo)識(shí)了當(dāng)前棧幀的底部。在函數(shù)棧幀中,一般包含以下幾類(lèi)重要信息:局部變量:為函數(shù)局部變量開(kāi)辟的內(nèi)存空間。棧幀狀態(tài)值:保存前棧幀的頂部和底部(實(shí)際上只保存前棧幀的底部),用于在本棧幀被彈出后恢復(fù)出上一個(gè)棧幀。函數(shù)返回地址:第三十三頁(yè),共六十五頁(yè),2022年,8月28日EIP指令寄存器(EXTENDEDINSTRUCTIONPOINTER)其內(nèi)存放著一個(gè)指針,該指針永遠(yuǎn)指向下一條等待執(zhí)行的指令地址。如控制了EIP指令寄存器的內(nèi)容,就控制了進(jìn)程——我們讓EIP指向哪里,CPU就會(huì)去執(zhí)行那里的指令。第三十四頁(yè),共六十五頁(yè),2022年,8月28日EIP指令寄存器的作用------------XOREBX,EBXMOVBH,4SUBESP,EBPMOVBX,3234PUSHEBXPUSH723456PUSHESPXOREDX,EDX----------------EIPEIP為指令寄存器,永遠(yuǎn)指向下一條等待執(zhí)行的指令。CPU按照EIP寄存器的所指位置取出指令和操作數(shù)后,送入算術(shù)邏輯單元運(yùn)算處理。第三十五頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)調(diào)用約定與相關(guān)指令函數(shù)調(diào)用約定描述了函數(shù)傳遞參數(shù)方式和棧協(xié)同工作的細(xì)節(jié)。約定:傳遞參數(shù)方式,參數(shù)入棧次序,函數(shù)返回時(shí)恢復(fù)堆棧平衡的操作在母還是子函數(shù)中進(jìn)行等。CSYSCALLSTDCALLBASICFORTRANPASCAL參數(shù)入棧次序右左右左右左左右左右左右恢復(fù)堆棧平衡的操作母函數(shù)子函數(shù)子函數(shù)子函數(shù)子函數(shù)子函數(shù)第三十六頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)調(diào)用約定對(duì)于VISUALC++來(lái)說(shuō),可支持3種函數(shù)調(diào)用約定。VC在默認(rèn)情況下使用_STDCALL調(diào)用方式。同段代碼不同的編譯選項(xiàng)、不同的編譯器編譯鏈接后,得到的可執(zhí)行文件有很多不同。調(diào)用約定的聲明參數(shù)入棧次序恢復(fù)堆棧平衡的操作_CDECL右左母函數(shù)_FASTCALL右左子函數(shù)_STDCALL右左子函數(shù)第三十七頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)調(diào)用大致包括的幾個(gè)步驟參數(shù)入棧:將參數(shù)從右向左依次壓入系統(tǒng)棧中。返回地址入棧:將當(dāng)前代碼區(qū)調(diào)用指令的下一條指令地址壓入棧中,供函數(shù)返回時(shí)繼續(xù)執(zhí)行。代碼區(qū)跳轉(zhuǎn):處理器從當(dāng)前代碼區(qū)跳轉(zhuǎn)到被調(diào)用函數(shù)的入口處。第三十八頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)調(diào)用大致包括的幾個(gè)步驟棧幀調(diào)整:具體包括保存當(dāng)前棧幀狀態(tài)值,以備后面恢復(fù)本棧時(shí)使用(EBP入棧)。將當(dāng)前棧幀切換到新棧幀(將ESP值裝入EBP,更新新棧幀底部)。給新棧幀分配空間(把ESP減去所需空間的大小,抬高棧頂)。第三十九頁(yè),共六十五頁(yè),2022年,8月28日_STDCALL調(diào)用約定時(shí)函數(shù)調(diào)用用到的指令序列;調(diào)用前PUSH參數(shù)3(設(shè)有三個(gè)參數(shù))PUSH參數(shù)2PUSH參數(shù)1CALL函數(shù)地址;CALL指令向棧中壓入當(dāng)前指令在內(nèi)存中的位置,即保存返回地址。然后跳轉(zhuǎn)到被調(diào)用函數(shù)的入口處。PUSHEBP;保存舊棧幀的底部MOVEBP,ESP;設(shè)置新棧幀的底部(棧幀切換)SUBESP,XXX;設(shè)置新棧幀的頂部(抬高棧頂,為新棧幀開(kāi)辟空間)第四十頁(yè),共六十五頁(yè),2022年,8月28日上段用于函數(shù)調(diào)用的指令在棧中引起的變化ESPEBP函數(shù)調(diào)用前當(dāng)前函數(shù)棧幀ARG1ARG2ARG3ESPEBP當(dāng)前函數(shù)棧幀PUSHARG_X函數(shù)參數(shù)從右到左入棧返回地址ARG1ARG2ARG3ESPEBP當(dāng)前函數(shù)棧幀CALL指令引起的壓棧操作。緊接CALL后面那條指令的內(nèi)存地址被壓入棧中,即返回地址EBP返回地址ARG1ARG2ARG3前棧幀EBPESPEBP當(dāng)前函數(shù)棧幀PUSHEBP保存當(dāng)前棧幀的底部位置,備棧幀恢復(fù)時(shí)使用前棧幀EBP返回地址ARG1ARG2ARG3前棧幀EBPESPEBP當(dāng)前函數(shù)棧幀MOVEBP,ESP設(shè)置新棧幀的底部開(kāi)始棧幀切換前棧幀EBP返回地址ARG1ARG2ARG3前棧幀EBPEBPESP舊函數(shù)棧幀新函數(shù)棧幀SUBESP,XXX設(shè)置新棧幀的頂部,新棧幀切換完畢第四十一頁(yè),共六十五頁(yè),2022年,8月28日說(shuō)明前棧幀EBP值既屬于上一個(gè)棧幀,也屬于下一個(gè)棧幀,返回地址成為棧幀頂部的數(shù)據(jù)第四十二頁(yè),共六十五頁(yè),2022年,8月28日函數(shù)返回時(shí)步驟保存返回值:通常將函數(shù)返回值保存在EAX寄存器中。彈出當(dāng)前棧幀,恢復(fù)上一個(gè)棧幀。具體包括在堆棧平衡的基礎(chǔ)上,給ESP加上棧幀的大小,降低棧頂,回收當(dāng)前棧幀的空間。將當(dāng)前棧幀底部保存的前棧幀EBP值彈入EBP寄存器,恢復(fù)上一個(gè)棧幀。將函數(shù)返回地址彈給EIP寄存器。跳轉(zhuǎn):按照函數(shù)返回地址跳回母函數(shù)中繼續(xù)執(zhí)行。第四十三頁(yè),共六十五頁(yè),2022年,8月28日WIN32平臺(tái)函數(shù)返回時(shí)相關(guān)指令序列ADDESP,XXX;降低棧頂,回收當(dāng)前棧幀POPEBP;將上一個(gè)棧幀底部位置恢復(fù)到EBPRETN;彈出當(dāng)前棧頂元素,即彈出返回地址,棧幀恢復(fù)完成。讓處理器跳轉(zhuǎn)到彈出的返回地址,恢復(fù)調(diào)用前的代碼區(qū)。第四十四頁(yè),共六十五頁(yè),2022年,8月28日最終按函數(shù)調(diào)用約定組織起來(lái)的系統(tǒng)棧結(jié)構(gòu)圖局部變量VAR_B2局部變量VAR_B1前棧幀EBP返回地址FUNC_B第一個(gè)參數(shù)ARG_B1FUNC_B第二個(gè)參數(shù)ARG_B2局部變量VRA_A前棧幀EBP返回地址FUNC_A第一個(gè)參數(shù)ARG_A1FUNC_A第二個(gè)參數(shù)ARG_A2局部變量VRA_MAIN前棧幀EBP返回地址MAIN第一個(gè)參數(shù)INTARGCMAIN第二個(gè)參數(shù)CHAR**ARGVMAIN第三個(gè)參數(shù)CHAR**ENVP其他數(shù)據(jù)---------------------MAIN棧幀F(xiàn)UNC_A棧幀F(xiàn)UNC_B棧幀ESPEBPFUNC_A代碼區(qū)------CALLFUNC_BMOVVAR-A,EAX-------MAIN代碼區(qū)-------CALLFUNC_AMOVVAR-MAIN,EAX-------第四十五頁(yè),共六十五頁(yè),2022年,8月28日代碼植入原理如果在BUFFER中包含我們自己想要執(zhí)行的代碼,然后通過(guò)返回地址讓程序跳轉(zhuǎn)到系統(tǒng)棧里執(zhí)行。在實(shí)驗(yàn)中,我們向PASSWORD.TXT文件里植入二進(jìn)制的機(jī)器碼,并用這段機(jī)器碼來(lái)調(diào)用WINDOWS的一個(gè)API函數(shù)MESSAGEBOXA,最終在桌面彈出一個(gè)消息框并顯示“MAOTEACH”。第四十六頁(yè),共六十五頁(yè),2022年,8月28日示例代碼#include<stdio.h>#include<windows.h>#definePASSWORD"1234567"intverify_password(char*password){ intauthenticated; charbuffer[44]; authenticated=strcmp(password,PASSWORD); strcpy(buffer,password);//overflowedhere! returnauthenticated;}main(){ intvalid_flag=0; charpassword[1024]; FILE*fp; LoadLibrary("user32.dll");//prepareformessagebox if(!(fp=fopen("password.txt","rw+"))) { exit(0); } fscanf(fp,"%s",password); valid_flag=verify_password(password); if(valid_flag) { printf("incorrectpassword!\n"); } else { printf("Congratulation!Youhavepassedtheverification!\n"); } fclose(fp);}第四十七頁(yè),共六十五頁(yè),2022年,8月28日利用棧溢出植入可執(zhí)行代碼-----------BUFFER(可執(zhí)行機(jī)器碼)-----------(可執(zhí)行機(jī)器碼)-----------(可執(zhí)行機(jī)器碼)Authenticated(覆蓋)前棧幀EBP(覆蓋)返回地址(覆蓋)------------溢出后被改寫(xiě)的新返回地址------用包含可正確執(zhí)行的機(jī)器碼填充緩沖區(qū),并將返回地址覆蓋成BUFFER的起址,成功后可讓程序跳轉(zhuǎn)到棧區(qū)執(zhí)行我們輸入的代碼-----CALLverify_passwordADDESP,4MOVDWORDPTRSS:[EBP-4],EAXMOVDWORDPTRSS:[EBP-4],0--------正常情況下的返回地址第四十八頁(yè),共六十五頁(yè),2022年,8月28日要做的幾項(xiàng)工作分析并調(diào)試漏洞程序,獲得淹沒(méi)返回地址的偏移。獲得BUFFER的起始地址,并將其寫(xiě)入PASSWORD.TXT的相應(yīng)偏移處,用來(lái)覆蓋返回地址。向PASSWORD.TXT中寫(xiě)入可執(zhí)行的機(jī)器代碼,用來(lái)調(diào)用API彈出一個(gè)消息框。第四十九頁(yè),共六十五頁(yè),2022年,8月28日示例代碼的說(shuō)明verify_password函數(shù)的局部變量buffer為44個(gè)字節(jié),buffer的大小依賴于我們要植入代碼的大小。Main函數(shù)中使用LoadLibrary(“user32.dll”);用于初始化裝載USER32.DLL,以便在植入代碼中調(diào)用MESSAGEBOX函數(shù)。第五十頁(yè),共六十五頁(yè),2022年,8月28日代碼植入的事先分析verify_password函數(shù)的局部變量buffer為44個(gè)字節(jié),當(dāng)MAIN函數(shù)調(diào)用它時(shí),棧的結(jié)構(gòu)為右圖。-----------BUFFER[0-3]機(jī)器碼-----(可執(zhí)行機(jī)器碼)BUFFER[40-43]機(jī)器碼Authenticated(覆蓋)前棧幀EBP(覆蓋)返回地址(覆蓋)------------44個(gè)字節(jié)-----------第五十一頁(yè),共六十五頁(yè),2022年,8月28日代碼植入的事先分析如在PASSWORD.TXT中恰好寫(xiě)入44個(gè)字符,那么第45個(gè)隱藏的截?cái)喾鸑ULL將覆蓋Authenticated底字節(jié)中的1。用11組“4321”輸入單元來(lái)填充buffer。則第12個(gè)輸入單元將覆蓋Authenticated;第13個(gè)輸入單元將覆蓋前棧幀EBP;第14個(gè)輸入單元將覆蓋返回地址。接下去我們要驗(yàn)證上述分析的正確性。第五十二頁(yè),共六十五頁(yè),2022年,8月28日驗(yàn)證在PASSWORD.TXT中恰好寫(xiě)入44個(gè)字符。第五十三頁(yè),共六十五頁(yè),2022年,8月28日驗(yàn)證程序運(yùn)行后,如我們所料,Authenticated被覆蓋

溫馨提示

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

評(píng)論

0/150

提交評(píng)論