1.初識溢出

一直沒系統的學下這個,以爲這玩意早特麼過時的東西,後來看到還是灰常有必要的,所以。。。

溢出是什麼玩意就不介紹了,看個簡單例子:

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多了,把下面給覆蓋掉了,這樣也就產生了溢出錯誤

發佈了94 篇原創文章 · 獲贊 218 · 訪問量 41萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章