一直沒系統的學下這個,以爲這玩意早特麼過時的東西,後來看到還是灰常有必要的,所以。。。
溢出是什麼玩意就不介紹了,看個簡單例子:
strcpy原型聲明:extern char *strcpy(char *dest,char *src);
功能:把從src地址開始且含有NULL結束符的字符串賦值到以dest開始的地址空間。它的拷貝時不檢查長度的,她會一直拷一直拷,直到src的結尾,這就是它的弱點。
當然這破B函數微軟早不提倡用了,自己也能寫個安全多了的,是吧小平同學?
#include <stdio.h>
#include "windows.h"
char szName[]="Evil0r";
int main()
{
char szOutput[8];
strcpy(szOutput,szName);
for (int i=0;i<8&&szOutput[i];i++)
{
printf("\\0x%X",szOutput[i]);
}
return 0;
}
編譯運行沒錯,輸出Evil0r對應的ascii碼。
當我們把字符串改下,改爲abcdefgh時,特麼的vs08提示溢出了,vc6還能正常輸出,也懶得去找爲啥了,拿vc6來看吧。
把字符串再改爲"abcdefghijklmnopq"再運行下,彈錯了,提示爲“0x706f6e6d指令引用的0x706f6e6d內存。該內存不能爲read”。6d6e6f70就是字符mnop。應該看出來了吧,這個覆蓋爲函數返回地址去執行了。
看下反彙編代碼
7: char szOutput[8];
8: strcpy(szOutput,szName);
0040D468 push offset szName (00424a30)
0040D46D lea eax,[ebp-8]
0040D470 push eax
0040D471 call strcpy (00403660)
0040D476 add esp,8
把szName字符串地址壓入棧,然後拿出8個字節的空間來進行strcpy,不過不好意思,src多了,把下面給覆蓋掉了,這樣也就產生了溢出錯誤