昨天舉了一些常見的攻擊手法,今天我們就來聊聊比較簡單且古早的攻擊手法 ─ 緩衝區溢位。而要了解緩衝區溢位之前,我們得先稍微聊一下什麼是緩衝區。
緩衝區(Buffer) ,是電腦暫時存放輸入或輸出資料的記憶區區塊,資料在輸出到其他裝置都會暫時留在緩衝區。當接收資料和處理資料之間速率存在差異時,通常就會使用緩衝區如網路影音串流。
緩衝區溢位就是讓資料寫入超過緩衝區容量造成溢出,這會導致相鄰的記憶體被覆寫。C與C++語言特別容易遭到緩衝區溢位的攻擊,原因在於它沒有內建防範覆寫記憶體的一些措施。相較於這兩個語言,像是Java, Java Script, C#等就有內建以防範溢位攻擊。
接著我們來看一下緩衝區溢位是怎麼做的
如下圖緩衝區的容量只有8 bytes,我們超過原本的範圍:
這邊是一個C語言的例子。情境是一個登入系統,你輸入正確的密碼passwordqwer的話會得到Correct Password及Privileges to user 的文字,反之則是Wrong Password。
#include <stdio.h>
#include <string.h>
int main(void)
{
char buff[15];
int pass = 0;
printf("\n Enter the password : \n");
gets(buff);
if(strcmp(buff, "passwordqwer"))
{
printf ("\n Wrong Password \n");
}
else
{
printf ("\n Correct Password \n");
pass = 1;
}
if(pass)
{
printf ("\n Privileges to user \n");
}
return 0;
}
正常的情況下輸入密碼會得到這樣的結果:
$ ./bfrovrflw
Enter the password :
thegeekstuff
Correct Password
Privileges to user
再來是另一種情況:
$ ./bfrovrflw
Enter the password :
qwertyuiopasdfghjklz
Wrong Password
Privileges to user
透過超出我們緩衝區能容納的上限來讓輸入的資料覆寫過記憶體裡"pass"設置的值不再相同。因為pass的值不再是0,也讓攻擊者得到了權限而不是原本會顯示的Wrong Password。
參考資料
緩衝區
什麼是緩衝區溢位?
Buffer Overflow Attack
Buffer Overflow Attack Explained with a C Program Example