Unix系統(tǒng)編程第一章:緩沖區(qū)溢出的后果
緩沖區(qū)溢出是一種非常普遍、非常危險(xiǎn)的漏洞,在各種操作系統(tǒng)、應(yīng)用軟件中廣泛存在。利用緩沖區(qū)溢出攻擊,可以導(dǎo)致程序運(yùn)行失敗、系統(tǒng)當(dāng)機(jī)、重新啟動(dòng)等后果。更為嚴(yán)重的是,可以利用它執(zhí)行非授權(quán)指令,甚至可以取得系統(tǒng)特權(quán),進(jìn)而進(jìn)行各種非法操作。緩沖區(qū)溢出攻擊有多種英文名稱:buffer overflow,buffer overrun,smash the stack,trash the stack,scribble the stack, mangle the
stack, memory leak,overrun screw;它們指的都是同一種攻擊手段。第一個(gè)緩沖區(qū)溢出攻擊--Morris蠕蟲,發(fā)生在二十年前,它曾造成了全世界6000多臺網(wǎng)絡(luò)服務(wù)器癱瘓。
1.概念
緩沖區(qū)溢出是指當(dāng)計(jì)算機(jī)向緩沖區(qū)內(nèi)填充數(shù)據(jù)位數(shù)時(shí)超過了緩沖區(qū)本身的容量溢出的數(shù)據(jù)覆蓋在合法數(shù)據(jù)上,理想的情況是程序檢查數(shù)據(jù)長度并不允許輸入超過緩沖區(qū)長度的字符,但是絕大多數(shù)程序都會(huì)假設(shè)數(shù)據(jù)長度總是與所分配的儲存空間想匹配,這就為緩沖區(qū)溢出埋下隱患.操作系統(tǒng)所使用的緩沖區(qū) 又被稱為"堆棧". 在各個(gè)操作進(jìn)程之間,指令會(huì)被臨時(shí)儲存在"堆棧"當(dāng)中,"堆棧"也會(huì)出現(xiàn)緩沖區(qū)溢出。
2.危害
在當(dāng)前網(wǎng)絡(luò)與分布式系統(tǒng)安全中,被廣泛利用的50%以上都是緩沖區(qū)溢出,其中最著名的例子是1988年利用fingerd漏洞的蠕蟲。而緩沖區(qū)溢出中,最為危險(xiǎn)的是堆棧溢出,因?yàn)槿肭终呖梢岳枚褩R绯?,在函?shù)返回時(shí)改變返回程序的地址,讓其跳轉(zhuǎn)到任意地址,帶來的危害一種是程序崩潰導(dǎo)致拒絕服務(wù),另外一種就是跳轉(zhuǎn)并且執(zhí)行一段惡意代碼,比如得到shell,然后為所欲為。
??????? 3.c語言例子
#include#includeint?main(){ ??int?d?=?checkpass(); ??printf("%dn",?d); ??return?0; } int?checkpass(void){ ??char?a[9]; ??int?x; ??x?=?0; ??fprintf(stderr,?"a?at?%p?andnx?at?%pn",?(void*)a,?(void*)&x); ??printf("Enter?a?short?word:?"); ??scanf("%s",?a); ??if?(strcmp(a,?"mypass")?==?0) ?????x?=?1; ??return?x; }
1. 盡管程序只為數(shù)組 a 指定了9個(gè)字節(jié),但編譯器卻為其分配了 12 個(gè)字節(jié),這樣,系統(tǒng)就可以維護(hù)一個(gè)與字邊界對齊的棧指針了。
2. 在上面的程序中,如果字符數(shù)組 a 存儲在棧上比整數(shù) x 低的內(nèi)存中,a 的緩沖區(qū)溢出可能會(huì)改變 x 的值。如果用戶輸入13個(gè)字符,那么,不管輸入的是什么字符,x 都變成一個(gè)非零值,函數(shù)返回這個(gè)非零值。
3. 如果用戶輸入一個(gè)長口令,返回地址就會(huì)被重寫,而且程序很可能就會(huì)試圖返回到一個(gè)程序地址空間范圍之外的單元上去,這樣就會(huì)產(chǎn)生斷保護(hù)錯(cuò)誤(segmentation fault)和信息轉(zhuǎn)儲。
我互相掉換 x 和 數(shù)組 a 的聲明位置,發(fā)現(xiàn) x 總是在 a 的下面, 看來 unix 對于緩沖溢出機(jī)制還是不錯(cuò)的