 緩沖區溢出指的是什么
							時間:2018-12-28      來(lai)源:華清遠見(jian)
							緩沖區溢出指的是什么
							時間:2018-12-28      來(lai)源:華清遠見(jian) 
							緩沖(chong)區(qu)溢出,是針(zhen)對程(cheng)序設計(ji)缺陷,向程(cheng)序輸入緩沖(chong)區(qu)寫入使之(zhi)溢出的(de)內(nei)容(通(tong)常(chang)是超過緩沖(chong)區(qu)能保存的(de)最大數據量的(de)數據),從(cong)而破壞程(cheng)序運行、趁著中斷之(zhi)際并獲取程(cheng)序乃至系統(tong)的(de)控制權。
計算機(ji)程(cheng)(cheng)序(xu)(xu)(xu)一般都會使用到一些(xie)內(nei)(nei)存(cun)(cun)(cun),這些(xie)內(nei)(nei)存(cun)(cun)(cun)或(huo)是(shi)程(cheng)(cheng)序(xu)(xu)(xu)內(nei)(nei)部(bu)使用,或(huo)是(shi)存(cun)(cun)(cun)放用戶的(de)輸(shu)入(ru)(ru)數(shu)(shu)(shu)據(ju)(ju)(ju),這樣(yang)的(de)內(nei)(nei)存(cun)(cun)(cun)一般稱(cheng)作緩(huan)沖(chong)區。溢(yi)出是(shi)指盛放的(de)東西(xi)超(chao)出容(rong)(rong)器容(rong)(rong)量而(er)溢(yi)出來(lai)了(le)(le),在計算機(ji)程(cheng)(cheng)序(xu)(xu)(xu)中,就(jiu)(jiu)是(shi)數(shu)(shu)(shu)據(ju)(ju)(ju)使用到了(le)(le)被分(fen)配內(nei)(nei)存(cun)(cun)(cun)空(kong)間之(zhi)外(wai)的(de)內(nei)(nei)存(cun)(cun)(cun)空(kong)間。而(er)緩(huan)沖(chong)區溢(yi)出,簡單(dan)的(de)說(shuo)就(jiu)(jiu)是(shi)計算機(ji)對接收的(de)輸(shu)入(ru)(ru)數(shu)(shu)(shu)據(ju)(ju)(ju)沒有進(jin)行有效的(de)檢(jian)測(理想的(de)情況是(shi)程(cheng)(cheng)序(xu)(xu)(xu)檢(jian)查數(shu)(shu)(shu)據(ju)(ju)(ju)長(chang)度(du)并不允許輸(shu)入(ru)(ru)超(chao)過(guo)緩(huan)沖(chong)區長(chang)度(du)的(de)字符(fu)),向緩(huan)沖(chong)區內(nei)(nei)填(tian)充數(shu)(shu)(shu)據(ju)(ju)(ju)時超(chao)過(guo)了(le)(le)緩(huan)沖(chong)區本身(shen)的(de)容(rong)(rong)量,而(er)導致數(shu)(shu)(shu)據(ju)(ju)(ju)溢(yi)出到被分(fen)配空(kong)間之(zhi)外(wai)的(de)內(nei)(nei)存(cun)(cun)(cun)空(kong)間,使得溢(yi)出的(de)數(shu)(shu)(shu)據(ju)(ju)(ju)覆(fu)蓋(gai)了(le)(le)其他內(nei)(nei)存(cun)(cun)(cun)空(kong)間的(de)數(shu)(shu)(shu)據(ju)(ju)(ju)。
在(zai)計算機安(an)全領域(yu),緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)就好比給自己的(de)(de)程(cheng)(cheng)序(xu)(xu)開了個(ge)后(hou)門,這種安(an)全隱(yin)患是致命(ming)的(de)(de)。緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)在(zai)各(ge)種操作系統、應(ying)用(yong)軟件中廣(guang)泛存(cun)在(zai)。而利用(yong)緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)漏洞(dong)實施(shi)的(de)(de)攻擊就是緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)攻擊。緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)攻擊,可以導致程(cheng)(cheng)序(xu)(xu)運行(xing)(xing)失敗(bai)、系統關機、重新啟動,或者(zhe)執行(xing)(xing)攻擊者(zhe)的(de)(de)指令,比如非(fei)法(fa)提(ti)升權限。通過(guo)往(wang)程(cheng)(cheng)序(xu)(xu)的(de)(de)緩(huan)(huan)(huan)沖區(qu)寫超出(chu)其長度的(de)(de)內容,造成緩(huan)(huan)(huan)沖區(qu)的(de)(de)溢(yi)出(chu),從而破壞程(cheng)(cheng)序(xu)(xu)的(de)(de)堆棧,造成程(cheng)(cheng)序(xu)(xu)崩潰或使程(cheng)(cheng)序(xu)(xu)轉而執行(xing)(xing)其它(ta)指令,以達到攻擊的(de)(de)目(mu)的(de)(de)。造成緩(huan)(huan)(huan)沖區(qu)溢(yi)出(chu)的(de)(de)原因是程(cheng)(cheng)序(xu)(xu)中沒有(you)仔細檢查用(yong)戶輸入的(de)(de)參數。
下面通過一個(ge)示例來詳細看(kan)(kan)看(kan)(kan)什么是緩(huan)沖(chong)區(qu)溢(yi)出(chu)。程序(xu)(xu)的(de)(de)(de)(de)緩(huan)沖(chong)區(qu)就(jiu)像(xiang)一個(ge)個(ge)格子(zi)(zi)(zi)(zi)(zi)(zi),每(mei)個(ge)格子(zi)(zi)(zi)(zi)(zi)(zi)中存放不(bu)同的(de)(de)(de)(de)東西,有的(de)(de)(de)(de)是命(ming)令,有的(de)(de)(de)(de)是數據(ju)(ju),當程序(xu)(xu)需要接收用(yong)戶(hu)(hu)數據(ju)(ju),程序(xu)(xu)預先(xian)為之分(fen)配(pei)(pei)了(le)4個(ge)格子(zi)(zi)(zi)(zi)(zi)(zi)(下圖中黃色(se)的(de)(de)(de)(de)1~4號(hao)格子(zi)(zi)(zi)(zi)(zi)(zi))。按照程序(xu)(xu)設(she)計,就(jiu)是要求用(yong)戶(hu)(hu)輸(shu)入(ru)的(de)(de)(de)(de)數據(ju)(ju)不(bu)超過4個(ge)。而用(yong)戶(hu)(hu)在輸(shu)入(ru)數據(ju)(ju)時(shi),假(jia)設(she)輸(shu)入(ru)了(le)17數據(ju)(ju),而且程序(xu)(xu)也沒有對用(yong)戶(hu)(hu)輸(shu)入(ru)數據(ju)(ju)的(de)(de)(de)(de)多少進行檢查,就(jiu)往預先(xian)分(fen)配(pei)(pei)的(de)(de)(de)(de)格子(zi)(zi)(zi)(zi)(zi)(zi)中存放,這樣(yang)不(bu)僅4個(ge)分(fen)配(pei)(pei)的(de)(de)(de)(de)格子(zi)(zi)(zi)(zi)(zi)(zi)被使用(yong)了(le),其后(hou)相鄰的(de)(de)(de)(de)13個(ge)格子(zi)(zi)(zi)(zi)(zi)(zi)中的(de)(de)(de)(de)內(nei)容都被新數據(ju)(ju)覆(fu)蓋了(le)。這樣(yang)原來13個(ge)格子(zi)(zi)(zi)(zi)(zi)(zi)中的(de)(de)(de)(de)內(nei)容就(jiu)丟失了(le)。這時(shi)就(jiu)出(chu)現了(le)緩(huan)沖(chong)區(qu)(1~4號(hao)格子(zi)(zi)(zi)(zi)(zi)(zi))溢(yi)出(chu)了(le)。
	
如下代碼的(de)問題就(jiu)出在strcpy(buf, s)這條語句(ju)上,它(ta)將s拷貝到(dao)buf中,而沒有對s的(de)長度(du)進行限制(zhi),這就(jiu)給(gei)緩(huan)沖區(qu)溢(yi)出攻擊(ji)提供了可乘之計。
#include
#include
void vulFunc(char* s)
{
char buf[10];
strcpy(buf, s);
printf("String=%s\n", buf);
}
main(int argc, char* argv[])
{
if(argc == 2)
{
 vulFunc(argv[1]);
}
else
{
printf("Usage: %s \n", argv[0]);
}
}
緩沖(chong)區(qu)溢(yi)出一般是由于一下原(yuan)因(yin)導致:
1.字(zi)符串處理函數沒有(you)指定長度,單單憑借結(jie)尾(wei)字(zi)符是(shi)不(bu)是(shi)'\0'來(lai)判斷結(jie)束。
2.被處理的字(zi)符超過緩沖區可接受的大小。例如(ru),從屏幕(mu)輸入(ru)字(zi)符串(chuan):gets(buff),但是(shi)buff的內存(cun)少于屏幕(mu)一行字(zi)符個數,就會導致溢出,應該使(shi)用fgets。
3.所有格式化字符(fu)串的函(han)數(shu):fprintf("%n",&num_write)。
避免的辦法:
1.不要把用戶的輸入(ru)作為參數傳(chuan)到格式化字符串處理函數中(zhong),例如,printf("%s", argv[1])。
2.字(zi)符串(chuan)處(chu)理避免使用(yong)(yong)strcpy,strcat,sprintf,gets。應該使用(yong)(yong)strncpy,strncat,snprintf。strlcpy和strlcat都是NULL結尾。盡(jin)量(liang)使用(yong)(yong)std::string,MFC::CString
3.使用C++ I/O函數(shu)
4.使(shi)用(yong)安全的C Runtime Time函數(shu)
5.檢查(cha)文件路徑的長度,不要超(chao)過系統允(yun)許(xu)的最大值。

