信息收集與系統攻擊之緩沖區溢出攻擊原理
2)緩沖區溢出攻擊原理
緩沖區溢出是一種非常普遍也非常危險的漏洞,廣泛存在于各種操作系統、應用軟件中。漏洞的原因是由于程序員對數據沒有進行嚴格的校驗,攻擊者可以通過向程序的緩沖區寫入超過預定長度的數據j從而破壞程序的堆棧,導致程序執行流程的改變
#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)執行時會導致一個緩存溢出。例如輸入用戶輸入姓名為
“aaaaaaaaaaaaaaaaaaaaaaaa”時,由于輸入值超過name定義的長度(程序申請緩沖區),當
程序將用戶輸入值保存到name的地址空間時,會繼續向內存后續地址空間寫入其余輸入內容,進而覆蓋了程序棧中存儲的返回地址( EIP),如下圖所示。
內存底部 內存頂部
正常狀態下的堆棧
name XXX EIP XXX
[cispcisp] [ ] [ ] [ ]
name XXX既P XXX
[aaaaaaaa] [aaaa] [aaaa] [aaaa] ‘
溢出狀態下的堆棧
堆棧頂部 堆棧底部
圖3-21緩沖區溢出堆棧狀態
程序在需要調用返回地址時,把EIP中存儲的“aaaa”的ASCⅡ碼Ox61616161作為下一條指令地址,CPU會試圖執行Ox61616161處的指令,而由于該內存并非運行程序所能訪問,因此這個操作會被系統拒絕,因此產生錯誤。如圖所示。
如果攻擊者輸入的內容是經過精確定義的,覆蓋了EIP原有的地址,使得程序跳轉攻擊者覆蓋進去的地址,而該地址處執行預先放置一段攻擊代碼,那么攻擊者就可以執行這段攻擊代碼從而獲得系統控制權或者執行其他攻擊操作。