【摘要】本文從程序語言本身的缺陷,不夠健壯的角度出發(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)一步的分析.
【關(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)一步的分析.