一、定義
緩沖區溢出(buffer overflow),是針對程序設計缺陷,向程序輸入緩沖區寫入使之溢出的內容(通常是超過緩沖區能保存的最大數據量的數據),從而破壞程序運行、趁著中斷之際並獲取程序乃至系統的控制權。
二、原理
程序的緩沖區就像一個個格子。當程序需要接收用戶數據,程序預先為之分配了若干個格子。用戶在輸入數據時,假設輸入了更多數據,而且程序也沒有對用戶輸入數據的多少進行檢查,就往預先分配的格子中存放,這樣不僅分配的格子被使用了,其后相鄰的格子中的內容都被新數據覆蓋了。這樣原來后續格子中的內容就丟失了。
三、實踐
C語言編程中,一些不作邊界檢查的字符串拷貝函數(如strcpy)容易造成緩沖區溢出。
后續編程以strcpy()函數為核心,代碼如下:
#include <stdio.h>
#include <string.h>
int main(int argc, char* argv[])
{
int apple;
char buf[9];
strcpy(buf,"11111111111111111111111111111111111111111");
if (apple == 0x64636261)
{
printf("hello world!");
}
getchar();
return 0;
}
使用Microsoft Visual C++編譯運行后出現報錯
原因是buf數組輸入了過長數據。
查看緩沖區發現緩沖區溢出,沖去原有EIP、EBP,導致后續運行失敗,未能打印結果。
四、防范措施
在進行程序設計時,為了防范緩沖區溢出攻擊,可以采用哪些方法?
1、通過操作系統使得緩沖區不可執行,從而阻止攻擊者植入攻擊代碼;
2、強制寫正確的代碼的方法;
3、利用編譯器的邊界檢查來實現緩沖區的保護,使得緩沖區溢出不可能出現,從而完全消除了緩沖區溢出的威脅。