大三上課程-安全程序設(shè)計(jì)02內(nèi)存_第1頁(yè)
大三上課程-安全程序設(shè)計(jì)02內(nèi)存_第2頁(yè)
大三上課程-安全程序設(shè)計(jì)02內(nèi)存_第3頁(yè)
大三上課程-安全程序設(shè)計(jì)02內(nèi)存_第4頁(yè)
大三上課程-安全程序設(shè)計(jì)02內(nèi)存_第5頁(yè)
已閱讀5頁(yè),還剩76頁(yè)未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

關(guān) 成為隱患;另外,數(shù)組越界問(wèn)題、字符串格式化問(wèn)題,都是需考慮的問(wèn)題型的多個(gè)實(shí)例。舉例說(shuō)明,如下代碼voidvoidfunction(char{charbuffer[16];}這是一個(gè)Csc(),該函數(shù)的功能是將中的內(nèi)容c到ff中在該代碼中,r數(shù)據(jù)類(lèi)型相同), 動(dòng) 動(dòng)態(tài)PUSH:在堆棧的頂部加入一個(gè)元素,棧頂上移O下移。函數(shù)調(diào)用函數(shù)的現(xiàn)場(chǎng),函數(shù)中又的現(xiàn)場(chǎng),再恢復(fù)、、一個(gè)名為堆棧指針(SP)的寄存器指向堆棧的堆棧的大小在運(yùn)行時(shí)由內(nèi)核動(dòng)態(tài)地調(diào)CPU使用指令PUSH和POP來(lái)向堆棧中添加元素和中移去 函數(shù)局部變量等。觀(guān)察如下例子voidvoidfunction(inta,int{}void{}令,將源代碼編譯并生成匯編代碼輸出_mainproc;?debugL5movax,2pushaxmovax,1pushaxcallnearptr 英文名稱(chēng),如bufferoverflow、bufferoverrun、smashthestack、trashthestack等等,它也是一種比較有歷史的、多、多

作系果包

是Morris蠕致的程系: 程系: voidvoidfunction(char{charbuffer[16];}tp()inputpbuffinput,就會(huì)造成buffr。我們可以假設(shè)最理想的情況是:程序?qū)斎胱址L(zhǎng)行檢查,確保輸入的長(zhǎng)度不超過(guò)緩沖區(qū) 存在象strcpyscanf();等等。具體大家可以參考相應(yīng)文檔下面用一個(gè)程序來(lái)介紹緩沖區(qū)溢出的具#include#include#includevoidfunction(char{charbuffer[10];}intmain(intargc,char*{return}在Turboc2下面生成exe文件:P02_02.exe,到達(dá)該文件存放 ,在因?yàn)閒unction函數(shù)中的buffer大小定義為10,在輸入?yún)?shù)沒(méi)有超過(guò)10個(gè)字的情況下,程序沒(méi)有問(wèn)本章是基于CC語(yǔ)言具有不安全性的某些特性,。在這個(gè)程序中, 程序執(zhí)行發(fā)生不正常現(xiàn)象。從的角度講,因?yàn)檫@種事情完全是“碰巧”,等到人員去維護(hù)時(shí),問(wèn)題就找不到了,白白花費(fèi)人員的精緩沖區(qū)溢出程序是否試 溢出時(shí)被覆蓋的數(shù)據(jù);等的目的站在量的下面用一個(gè)例子來(lái)介紹緩沖 的原理。所使用的環(huán)境 5 f 5 f u

#include<string.h>voidfun1(char*input){charprintf("Call}intmain(intargc,char{return}由該代碼生成exe文件(具體和相應(yīng)的IDE有關(guān)),在結(jié)果(下面分析以下錯(cuò) )的ASCII碼 46#include<stdio.h>#include<string.h>voidfun1(char*input){charbuffer[10];printf("Call}void{printf("Call}intmain(intargc,char{printf("AddressOfreturn}生成,運(yùn)行如下命令此處我們可以知道,u2報(bào)錯(cuò):址

#include#include 3,voidfun1(char 3,{char printf("Call}void{printf("Call}intmain(intargc,char{printf("AddressOffun2=%p\n",fun2);return0;}注意!fun2函數(shù)被調(diào)用了在中文in、07ff52,可以用sdesd以下sd"\x77\x1d\x80\x7c""\x52\x8D\x45\xF4\x50\xFF\x55\xF0"F\x8D\x45\xF4""\x50\xB8""\xc7\x93\xbf\x77""\xFF\xD0"#include<stdio.h>#include<string.h>voidfun1(char*input){charbuffer[10];}intmain(intargc,char{charbuffer[]="abcdefghijklmnopqrstuvwxyz12\x12\x45\xfa\x7f""\x45\xFB\x44\xC6\x45\xFC\x4C\xC6\x45\xFD\x4C\xBA""\x77\x1d\x80\x7c"45\xF4""\x50\xB8""\xc7\x93\xbf\x77""\xFF\xD0""\x83\xC4\x12\x5D";return}生成,運(yùn)行相應(yīng)exe運(yùn)行時(shí),能夠打開(kāi)控制臺(tái)命令如 限,可以進(jìn)行任意操 看以下#include<stdio.h>#include<string.h>#includemain(intargc,char{char*buffer1,*charstr[]=buffer1=(char*)malloc(32);buffer2=(char*)malloc memcpy(buffer1,str,32+6);free(buffer1);free(buffer2);return0;}生成exe文件效果 者如果精心構(gòu)造這個(gè)6個(gè)字節(jié),也可以達(dá) 的的緩沖區(qū)溢 ,由于實(shí)現(xiàn)起來(lái)比較方便,成為一種常見(jiàn)的安。因此,相對(duì)于其 ,緩沖區(qū)溢 比較普 者可以通過(guò)很多利用緩沖區(qū)溢出并且進(jìn)行。一般說(shuō)來(lái),緩沖區(qū)溢出的目的在于使得者取得某些程序的控制權(quán),執(zhí)行某些功能,實(shí)現(xiàn)操作的目的;情況下,如果該程序具有管理者為了達(dá)到目的,一般情況下 行為分為兩步行 直接輸入法。者向被個(gè)指令序列,的地址傳遞參數(shù)法。在這種情況下,者想要執(zhí) 碼要求執(zhí)行exec(“某個(gè)命令”),而在被 函數(shù)為exec(arg),那么 怎樣讓程序跳轉(zhuǎn)到相應(yīng)的程序代碼,一般情況下有如法束時(shí)返回的地址,指示函數(shù)結(jié)束后會(huì)執(zhí)行的功能。代碼擊者只需在函數(shù)指針附近將緩沖區(qū)溢出,用一個(gè)目的具體案例:本世紀(jì)初,Cerberus安全小組發(fā)布了微軟的IIS4/5存在 瀏覽器向IIS提出一個(gè)HTTP請(qǐng)求, (或IP地址)后,加上一個(gè)件名,該文件名以“.htr”做后ServiceAPI)應(yīng)用程序;IIS將所有針對(duì)“.htr”資源的請(qǐng)求定向到ISM.DLL程序,ISM.DLL這個(gè)文件并執(zhí)行瀏覽器將提交的請(qǐng)求中包含的文件名在緩沖區(qū)中,若它很長(zhǎng),會(huì)導(dǎo)致局部變量緩沖區(qū)溢出,覆蓋返回地址空間,使IIS。更進(jìn)一步,在 利用CompaqC編譯器等。 :成一習(xí)不因?yàn)橐晃蹲烦绦蚓帉?xiě)些安隱多的碼,別是不要使用一些能有 P少 發(fā)生的可可以一錯(cuò)工,限一能具緩溢出 的函數(shù)的用如tcp和t等)使一個(gè) 成功地變了程的針,為系統(tǒng)事檢測(cè)到指的改變這個(gè)指將會(huì)被使達(dá)不到 的的整數(shù) 方以int為例,在TurboC中,一個(gè)整數(shù)用2個(gè)字節(jié)(16位)存放;在某些C編譯器(如DevC++)中,整數(shù)用4個(gè)字節(jié)(32位)存放;在Java語(yǔ)言中,一個(gè)字節(jié)存放的字節(jié)整數(shù)短整數(shù)長(zhǎng)整數(shù)in編碼方101102212進(jìn)制和 16進(jìn)制表示 加1,成為:16進(jìn)制表示為:0xFFFFFFFE一般說(shuō)來(lái),如果 置1,這個(gè)變量就被解釋為負(fù)數(shù);如果置0,這個(gè)變就解 什么情況下會(huì)出現(xiàn)整數(shù)溢出呢一數(shù)num1=num2= num3=num1+由于整數(shù)在內(nèi)存里面保存在一個(gè)固定長(zhǎng)度(在本章中使用32位)的空間內(nèi)一數(shù)num1=num2= num3=num1+整舉個(gè)例,有兩個(gè)無(wú)符號(hào)整數(shù),u1n,個(gè)數(shù)是32首值n1一32位整的大,num2被賦值為。后讓um和u2加,后 結(jié)果第33位整um代如:很顯然,num1的值是;num2的值;兩者相因此,num3中的值是0,發(fā)生了整數(shù)溢出試#include試int{儲(chǔ)int {short能char來(lái)l=來(lái)大sc=明printf("l=0x%x(%dbytes)\n",l, printf("s=0x%x(%dbytes)\n",s,可printf("c=0x%x(%dbytes)\n"creturn}生成可執(zhí)行文件,運(yùn)行,顯示#include<stdio.h>#include<string.h> 不。int 不。{般unsignedshort般int以char以i=法s=法if(s>= return-}memcpy(buf,argv[2buf[i]=下printf("成功拷貝%d個(gè)字節(jié)\nreturn}然后這個(gè)值被賦予unndhot類(lèi)型的整數(shù),由于位進(jìn) ,16位能 的最大數(shù)是即:十進(jìn)制的65535,因此,unsignedshort 的范圍是0–65535,如果這個(gè)值大于unsignedshort類(lèi)型所能夠 1系統(tǒng)只取后面16位進(jìn)行。下面的例子列舉了另#includeintmain(intargc,char{intn1=intn2=0x intn6=0x8fffffff;printf("%d(0x%x)+1=%d(0x%x)\n",n1,n1,n1+1,n1+1);printf("%d(0x%x)+%d(0x%x)=%d(0x%x)\n",n2,n2,n2,n2,n2+n2,printf("%d(0x%x)*4=%d(0x%x)\n",n2,n2,n2*4,n2*4);printf("%d(0x%x)-%d(0x%x)=%d(0x%x)\n",n2,n2,n6,n6,n2-n6,n2-return}整數(shù)溢出還有可能在動(dòng)態(tài)分配內(nèi)存時(shí)被利用。請(qǐng)看代碼P02_11.c該代碼將array拷貝到newarray中,生成exe文件,運(yùn)行看似沒(méi)有問(wèn)題。但是如果輸入下 令我們知道,1073741824的16進(jìn)制是 ,從前一個(gè)例子可看出 *4=0x0。因此,屏幕上顯示很顯然,這個(gè)看起來(lái)沒(méi)有問(wèn)題的函數(shù),可能出現(xiàn)在沒(méi)有為nw分配內(nèi)存況向里面拷貝組元環(huán)次數(shù)還非多重時(shí)造成系統(tǒng) 。 者通過(guò)選擇一個(gè)合適的值給n可使得循環(huán)復(fù)執(zhí)行導(dǎo)致緩沖溢出#include#include<stdio.h>int*arraycpy(int*array,intlen)newarray=if(newarray==NULL)return- for(i=0;i<len;i++)newarray[i]=}return}intmain(intargc,char*argv[]){intarray[]={1,2,3,4,5};return0;}還有一種情況,通過(guò)改寫(xiě)m的控制結(jié),也能夠在正常的函數(shù)運(yùn)行的過(guò)程中插入其他可執(zhí)行 代碼。請(qǐng)看P02_12.c該例子看起來(lái)無(wú)懈可擊,并且進(jìn)行了len1和len2相加之后的檢查,2147483647的16進(jìn)制為0x7FFFFFFF。該運(yùn)行結(jié)果為程 。根本不會(huì)顯示:"超出mybuf容納范圍!"。是什么原因?大家自#include#include<stdio.h>intcatstring(char*buf1,char*buf2,intlen1,int{charmybuf[256];if((len1+len2)>256){return-}memcpy(mybuf+len1,buf2, return}intmain(intargc,char*argv[])return} 充分考慮各種數(shù)據(jù)的取值范圍,使用合適的數(shù)據(jù)類(lèi)型盡量不要在不同范圍的數(shù)據(jù)類(lèi)型之間進(jìn)行賦值;等voidInsertInt(intindex,int{Array[index]=}intmain(intargc,char*argv[])intindex=atoi(argv[1]);intvalue=atoi(argv[2]);return0;}相當(dāng)于在A(yíng)rray基址后偏移600個(gè)整數(shù)元素空間字符串格式化不當(dāng),也可能造成,其方法和緩沖這種的函數(shù)有printf函數(shù)、sprintf函數(shù)等等。不過(guò)一般說(shuō)來(lái),這種可以很容易避免printf("%s",此種是怎樣出現(xiàn)的呢?下面舉一個(gè)例子。如:打印輸printf("%s",則會(huì)出現(xiàn)安全隱患,在不知不覺(jué)中打開(kāi)了一個(gè)安pipid的參數(shù)值就從堆棧中取出,并取代所在的為止。很明顯,者可以通過(guò)打印出堆棧中的這些值來(lái)偷看程序或是向運(yùn)行中程序的內(nèi)存里寫(xiě)入任意值#include#includeintmain(intargc,char{return

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
  • 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ì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論