May
14th,
2004
關於buffer overflow的範例程式,就如同上一篇文章裡面有提到,buffer
overflow
主要是利用C++對於陣列大小沒有限制的概念,當你輸入一個過大的數值,回傳值(return
value)會被蓋掉,即使你輸入錯誤的數值,你會也因為這樣而成功的登入電腦(或是使某個安全認證通過~~~)
一個好朋友(生魚片)寫了一個範例程式,但是我看了一下總是覺得哪裡怪怪的,因為我記得雖然記憶return
value會在記憶體位置之中,但是很難確切抓出function的回傳位置就在變數之後,並且他設定的函數為void,照理說也是無法回傳的才對~所以我大膽猜測他所寫的程式主要是將func的副程式加以執行過後的結果,與我們原先探討的Buffer
Overflow有所差異,所以我寫了一個範例程式如下:
#include
#include
char func(void)
{
char *p;
char r_c;
char buf[1];
p=buf;
*p=’N’;
*(p+1)=’N’;
*(p+2)=’N’;
*(p+3)=’N’;
*(p+4)=’N’;
if (buf[0]==’y’){
r_c=’N’;}
return r_c;
}
int main(int argc, char* argv[])
{
char Return_char;
if (func()==’N’){
printf(“system ~~~ passing~~~n”);
}
else{
printf("system is not passing~~~n");
}
}
在這個範例程式之中,副函示有數個變數宣告,buf[1],*p,
r_c 所以記憶體分配方式如下_(先宣告的記憶體位址比較後面,後宣告的記憶體位置比較前面)_:
|
+-----------------------+
| (other variable) |
+-----------------------+
| 指標 p |
+-----------------------+
| (other variable) |
+-----------------------+
| r_c (1 bytes) |
+-----------------------+
| (other variable) |
+-----------------------+
| buf (1 bytes) |
+-----------------------+
| (other data in stack) |
| . |
+-----------------------+
| return address of |
| this function |
| . |
| . |
當你在VC++編輯的時候,若是使用 [F11]來一個階段,一個階段的DEBUG,去一個個參照變數的位置(Address)的時候,你會發現以下的結果
[
](http://www.evanlin.com/blog/archives/0514/0514-1.jpg)
也就是透過指標*p,回傳變數r_c會被該更改到,使得回傳的值變的有誤。
所以這個程式明明不該輸出『System passing
』卻因為回傳值變成r_c所以產生~~~~錯誤造成程式的錯誤
繼續閱讀
May
12th,
2004
聽說最近很猖獗的病毒Sasser Worm,根據微軟網站所提供的消息,為微軟程式內部LSASS(Local security authority subsystem service)的缺點 也就是利用 Buffer overflow來獲得系統控制權 微軟MS04-011安全性公告 偵測與移除Sasser Worm 或許大家講到這裡會跟我一樣好奇,為何Buffer Overflow會產生系統危險呢? 所以我去找了一個相關文件,請看下面那位大大的解說 > > 作者: tmg (海邊漂來的..海嘯) 看板: SobVersion > 標題: 說文解字: 何謂 buffer overflow > 時間: Wed Nov 13 20:50:24 1996 > > > 唉....... buffer overflow 這個洞, 大概是最難防備的一個洞, > 因為這個洞發生的原因純粹是因為程式的 bug, > 而這種 bug 你我三不五時就會犯這種錯, 非常難以在 coding 時就加以防備。 > 要防止這種洞, 只有非常小心仔細檢查 code........ > > 這種洞, 顧名思義, 就是利用 buffer overflow 的原理達成目的的...... > 比如, 一個陣列只有 100 bytes, 但我餵給它 200 bytes 的資料, > 於是這個陣列裝不下這些資料, 造成了 overflow...... > > 為什麼 overflow 會有 security hole 呢? > 首先, overflow 發生時, 多出來的資料會蓋到其它變數上, > 相信這一點大家早就知道了。 > > 問題是, 為什麼資料蓋到其它變數上時, 頂多使程式執行錯誤, > 會嚴重到出現 security 的問題嗎? 這時, 好玩的事情就發生了....... > > 當我們呼叫一個 function 時, 以組合語言的觀點, > 會將 return address 堆入 stack 中。 > 如果這個 function 宣告了一些 local 變數, > 那進入這個 function 之後, 會在 stack 中再空出一塊區域給這些 local 變數, > 當要從這個 function return 回去時, 就把這些在 stack 中的 local 變數清掉。 > > 現在好了, buffer overflow security hole 就是在這裡發生了..........
繼續閱讀