信息收集與系統(tǒng)攻擊之緩沖區(qū)溢出攻擊原理
2)緩沖區(qū)溢出攻擊原理
緩沖區(qū)溢出是一種非常普遍也非常危險(xiǎn)的漏洞,廣泛存在于各種操作系統(tǒng)、應(yīng)用軟件中。漏洞的原因是由于程序員對(duì)數(shù)據(jù)沒(méi)有進(jìn)行嚴(yán)格的校驗(yàn),攻擊者可以通過(guò)向程序的緩沖區(qū)寫(xiě)入超過(guò)預(yù)定長(zhǎng)度的數(shù)據(jù)j從而破壞程序的堆棧,導(dǎo)致程序執(zhí)行流程的改變
#inclucle <stdio.h>
int main() (
char name[8];
printf(’’Please inpur your name:¨); gets(name);
printf(”you name is:%s!”, name); return 0:
)
這段程序的功能是顯示輸入的用戶名稱。在程序中,用于存放用戶輸入名稱的變量name長(zhǎng)度定義為8位,由于程序缺少必要的輸入長(zhǎng)度校驗(yàn),當(dāng)用戶的輸入值超過(guò)8位時(shí),
printf(”you name is:%s!",name)執(zhí)行時(shí)會(huì)導(dǎo)致一個(gè)緩存溢出。例如輸入用戶輸入姓名為
“aaaaaaaaaaaaaaaaaaaaaaaa”時(shí),由于輸入值超過(guò)name定義的長(zhǎng)度(程序申請(qǐng)緩沖區(qū)),當(dāng)
程序?qū)⒂脩糨斎胫当4娴絥ame的地址空間時(shí),會(huì)繼續(xù)向內(nèi)存后續(xù)地址空間寫(xiě)入其余輸入內(nèi)容,進(jìn)而覆蓋了程序棧中存儲(chǔ)的返回地址( EIP),如下圖所示。
內(nèi)存底部 內(nèi)存頂部
正常狀態(tài)下的堆棧
name XXX EIP XXX
[cispcisp] [ ] [ ] [ ]
name XXX既P XXX
[aaaaaaaa] [aaaa] [aaaa] [aaaa] ‘
溢出狀態(tài)下的堆棧
堆棧頂部 堆棧底部
圖3-21緩沖區(qū)溢出堆棧狀態(tài)
程序在需要調(diào)用返回地址時(shí),把EIP中存儲(chǔ)的“aaaa”的ASCⅡ碼Ox61616161作為下一條指令地址,CPU會(huì)試圖執(zhí)行Ox61616161處的指令,而由于該內(nèi)存并非運(yùn)行程序所能訪問(wèn),因此這個(gè)操作會(huì)被系統(tǒng)拒絕,因此產(chǎn)生錯(cuò)誤。如圖所示。
如果攻擊者輸入的內(nèi)容是經(jīng)過(guò)精確定義的,覆蓋了EIP原有的地址,使得程序跳轉(zhuǎn)攻擊者覆蓋進(jìn)去的地址,而該地址處執(zhí)行預(yù)先放置一段攻擊代碼,那么攻擊者就可以執(zhí)行這段攻擊代碼從而獲得系統(tǒng)控制權(quán)或者執(zhí)行其他攻擊操作。