緩沖區(qū)溢出原理淺析以及防護(hù)

字號:

【摘要】本文從程序語言本身的缺陷,不夠健壯的角度出發(fā),詳細(xì)分析了緩沖溢出攻擊的基本原理,描述了黑客利用緩沖區(qū)漏洞進(jìn)行系統(tǒng)攻擊的一般過程,最后又簡單討論了幾種防范溢出攻擊的策略.
    【關(guān)鍵字】緩沖溢出; 程序跳轉(zhuǎn); 長跳轉(zhuǎn)緩沖區(qū);
    近些年來,黑客攻擊事件頻繁發(fā)生,尤其是緩沖區(qū)溢出漏洞攻擊占據(jù)了網(wǎng)絡(luò)遠(yuǎn)程攻擊的絕大多數(shù). 因?yàn)檫@類攻擊可以使任何人獲得系統(tǒng)主機(jī)的完全控制權(quán),所以它代表了一類十分嚴(yán)重的攻擊.
    緩沖區(qū)溢出攻擊之所以常見,是因?yàn)樗R娏?且易于實(shí)現(xiàn), 這完全是軟件發(fā)展不可避免的問題. 緩沖區(qū)漏洞是程序員在編寫程序時未檢查內(nèi)存空間,導(dǎo)致內(nèi)存泄漏而引起,以下我們先來簡單了解一下它:
    一、認(rèn)識緩沖區(qū)溢出
    緩沖溢出是一種系統(tǒng)攻擊的手段,借著在程序緩沖區(qū)編寫超出其長度的代碼,造成溢出,從而破壞其堆棧,使程序執(zhí)行攻擊者在程序地址空間中早已安排好的代碼,以達(dá)到其目的. 一般黑客攻擊root程序,然后執(zhí)行類似exec(sh)的代碼獲得root的shell. 它造成了兩種嚴(yán)重的后果:
    1. 覆蓋堆棧的相鄰單元. 使程序執(zhí)行失敗, 嚴(yán)重可導(dǎo)致系統(tǒng)崩潰.
    2. 可執(zhí)行認(rèn)識指令代碼,最后獲得系統(tǒng)root特級權(quán)限.
    現(xiàn)在很多人使用C或C++編寫程序,但同時太多的人忽略了對其的數(shù)組邊界檢查和類型安全檢查,所以現(xiàn)今的大多數(shù)溢出都和C語言有關(guān), C語言中中有可能產(chǎn)生溢出的函數(shù)有:char s[n],strlen(s),strcpy(dst, src),p=malloc(n),strcat(s,suffix)等等,所以我們要盡可能地避免使用這些危險函數(shù),即使使用,也一定要做嚴(yán)格的檢查.為容易理解,我們來看一個簡單的程序:
    /*
    * example.c
    * written by Devil_Angel
    * gcc –o example example.c
    */
    void func(char * str)
    {
    char buf[8];
    strcpy(buf, str);
    printf(“%sn”,buf);
    }
    int main(int argc, char * argv[])
    {
    If(argc >1)
    Func(argv[1]);
    }//end of main
    該程序在輸入時,并沒有對str的大小進(jìn)行檢查便直接送入數(shù)組buf,一旦輸入超出buf長度,就產(chǎn)生了最簡單的溢出,當(dāng)然象這樣的溢出一般只會出現(xiàn)Segmentation fault錯誤,而不能達(dá)到攻擊的目的. 這里并沒有進(jìn)一步深入分析,只是讓大家對溢出有一個大概的概念,在以后將會對其做進(jìn)一步的分析.