緩衝區溢位基本C程式的控制台和Win32版本

2021-10-02 06:57:27 字數 1867 閱讀 2640

#include #include int main(void)

; char *p = "012345678912345";

strcpy(buff,p);

printf("%s\n",buff);

return 0;

}

這是緩衝區溢位原理演示的基本c程式;

p所指向的字串長度大於buff的長度,拷貝時發生緩衝區溢位;程式崩潰;

如果p指向字串的長度不超過,就不會溢位;

對於win32來說,使用windows提供的win32字串函式,字串拷貝使用lstrcpy;

#include #include int main(void)

; char *p = "0123456789";

lstrcpy(buff,p);

printf("%s\n",buff);

return 0;

}

一樣的,長度超過,執行程式,崩潰;

如果使用安全版的字串拷貝函式,strncpy(buff,p,sizeof(buff));

就不會溢位;

下面來作乙個win32視窗版本溢位程式;單擊滑鼠左鍵執行拷貝並輸出;

/* buffer over demo,by bobo,2020-01-19 */

#include lresult callback wndproc (hwnd, uint, wparam, lparam) ;

int winapi winmain (hinstance hinstance, hinstance hprevinstance,

pstr szcmdline, int icmdshow)

cw_usedefault,

cw_usedefault,

cw_usedefault,

cw_usedefault,

null,

null,

hinstance,

null) ;

showwindow (hwnd, icmdshow) ;

updatewindow (hwnd) ;

while (getmessage (&msg, null, 0, 0))

return msg.wparam ;

}lresult callback wndproc (hwnd hwnd, uint message, wparam wparam, lparam lparam)

; char *p = "012345678912345";

switch (message)

return defwindowproc (hwnd, message, wparam, lparam) ;

}

buff長度8,p指向內容長度15;

按理程式應該崩潰;但是win32視窗程式真的沒崩潰;還輸出了15個長度的字串;

啥情況?

以上是win10,vc++6;

此程式僅演示緩衝區溢位最基本原理;

如果真能幹這事的人,其目的並不是引起程式崩潰,而是通過覆蓋程式返回位址等手段,改變程式的執行流程;

C中的危險函式 緩衝區溢位

c語言,自創始以來,到現在經久不衰。雖然c你只好自己造輪子,由於c語言允許直接訪問實體地址,可以直接對硬體進行操作,因此它既具有高階語言的功能,又具有低階語言的特性。所以有可移植的彙編之稱。可是也在這些直接對記憶體的訪問,導致了危險的發生。有了自由也就多了混亂 某斯基 第一位公共敵人就是是 gets...

C 記憶體,堆區和棧區,函式呼叫棧,緩衝區溢位

堆和棧的區別 棧空間由系統分配,盡量避免在棧上定義大陣列 大物件,容易棧溢位導致程式崩潰 使用new動態分配記憶體,是在堆上建立的,堆的空間足夠大。存放程式動態分配的記憶體 new,malloc等函式分配的 函式呼叫時的返回位址,引數壓棧,區域性變數,返回資料等都存放在棧區 棧記憶體是由系統自己分配...

C 不為人知的秘密 緩衝區溢位

收藏 摘要 c 緩衝區溢位的秘密,大家一定還不是很了解。當你們看到網上傳播關於微軟windows ie對黑客利用 緩衝區溢位 0day漏洞攻擊的新聞,是否有過自己也想試試身手,可惜無從下手的感慨?開場白 各位朋友們,當你們看到網上傳播關於微軟windows ie對黑客利用 緩衝區溢位 0day漏洞攻...