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

字號(hào):

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