信息收集與系統(tǒng)攻擊之緩沖區(qū)溢出攻擊原理
2)緩沖區(qū)溢出攻擊原理
緩沖區(qū)溢出是一種非常普遍也非常危險的漏洞,廣泛存在于各種操作系統(tǒng)、應用軟件中。漏洞的原因是由于程序員對數(shù)據(jù)沒有進行嚴格的校驗,攻擊者可以通過向程序的緩沖區(qū)寫入超過預定長度的數(shù)據(jù)j從而破壞程序的堆棧,導致程序執(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長度定義為8位,由于程序缺少必要的輸入長度校驗,當用戶的輸入值超過8位時,
printf(”you name is:%s!",name)執(zhí)行時會導致一個緩存溢出。例如輸入用戶輸入姓名為
“aaaaaaaaaaaaaaaaaaaaaaaa”時,由于輸入值超過name定義的長度(程序申請緩沖區(qū)),當
程序?qū)⒂脩糨斎胫当4娴絥ame的地址空間時,會繼續(xù)向內(nèi)存后續(xù)地址空間寫入其余輸入內(nèi)容,進而覆蓋了程序棧中存儲的返回地址( 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)用返回地址時,把EIP中存儲的“aaaa”的ASCⅡ碼Ox61616161作為下一條指令地址,CPU會試圖執(zhí)行Ox61616161處的指令,而由于該內(nèi)存并非運行程序所能訪問,因此這個操作會被系統(tǒng)拒絕,因此產(chǎn)生錯誤。如圖所示。
如果攻擊者輸入的內(nèi)容是經(jīng)過精確定義的,覆蓋了EIP原有的地址,使得程序跳轉(zhuǎn)攻擊者覆蓋進去的地址,而該地址處執(zhí)行預先放置一段攻擊代碼,那么攻擊者就可以執(zhí)行這段攻擊代碼從而獲得系統(tǒng)控制權(quán)或者執(zhí)行其他攻擊操作。