版權(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 二零二五年度殘障人士職業(yè)康復(fù)服務(wù)合同2篇
- 溫州職業(yè)技術(shù)學(xué)院《BM概論與實(shí)訓(xùn)》2023-2024學(xué)年第一學(xué)期期末試卷
- 2025年度智能設(shè)備租賃服務(wù)與技術(shù)支持合同2篇
- 二零二五年度金融資產(chǎn)證券化股份質(zhì)押交易合同3篇
- 2025年度學(xué)校窗簾更換及節(jié)能環(huán)保合同3篇
- 個(gè)人財(cái)產(chǎn)質(zhì)押借款協(xié)議書(shū)(2024年修訂)版
- 個(gè)人房產(chǎn)抵押貸款協(xié)議范本(2024版)版B版
- 渭南師范學(xué)院《樂(lè)理視唱二》2023-2024學(xué)年第一學(xué)期期末試卷
- 2024版簡(jiǎn)易自愿離婚合同書(shū)范例一
- 二零二五年度新能源汽車(chē)采購(gòu)合同質(zhì)量監(jiān)控與配送管理細(xì)則3篇
- DB33T 2570-2023 營(yíng)商環(huán)境無(wú)感監(jiān)測(cè)規(guī)范 指標(biāo)體系
- 上海市2024年中考英語(yǔ)試題及答案
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳海報(bào)
- 房屋市政工程生產(chǎn)安全重大事故隱患判定標(biāo)準(zhǔn)(2024版)宣傳畫(huà)冊(cè)
- 垃圾車(chē)駕駛員聘用合同
- 2025年道路運(yùn)輸企業(yè)客運(yùn)駕駛員安全教育培訓(xùn)計(jì)劃
- 南京工業(yè)大學(xué)浦江學(xué)院《線(xiàn)性代數(shù)(理工)》2022-2023學(xué)年第一學(xué)期期末試卷
- 2024版機(jī)床維護(hù)保養(yǎng)服務(wù)合同3篇
- 《論拒不執(zhí)行判決、裁定罪“執(zhí)行能力”之認(rèn)定》
- 工程融資分紅合同范例
- 2024年貴州省公務(wù)員錄用考試《行測(cè)》真題及答案解析
評(píng)論
0/150
提交評(píng)論