經典緩沖區溢出小例子
文章目錄
經典緩沖區溢出小例子
0.說明
1.基于緩沖區溢出的HelloWord
c語言必背18個經典程序?2.永不停止的HelloWord
0.說明
? 兩個小程序,C語言編寫,VC++6.0編譯
? 調試用的OD。
? 小程序來源:“滴水逆向”的視頻。
1.基于緩沖區溢出的HelloWord
c語言中%s和%c。#includevoid HelloWord()
{
printf("Hello World");
getchar();
}
void Fun()
c語言案例、{
int arr[5] = {1,2,3,4,5};
arr[6] = (int) HelloWord;
}
int main()
{
編程例子?Fun();
return 0;
}
程序展示:
為什么會輸出“Hello Word”??
調試過程:
c++和c語言有什么區別。int arr[5] = {1,2,3,4,5};
? 注意到匯編語言中,一個數組聲明時,arr[0]到arr[4]在堆棧中的位置分別是[EBP-0x14]到[EBP-0x4],也就是先聲明4*5(字節)的堆棧空間,在從低位向高位存儲。
? 注意下斷點那一行代碼,等價于C源碼中 arr[6] = (int) HelloWord
0041097B MOV DWORD PTR SS:[EBP+0x4],cccchhhh.0040>
? 將子函數HelloWord的函數地址MOV到[EBP+0x4],而這個地址用來存放上一個函數的返回地址,等執行到下面RETN語句是,本該是pop到eip里的函數返回地址變為了HelloWord的地址,函數繼續運行,輸出“Hello Word”。
2.永不停止的HelloWord
c語言a+=a-=a*a,#includevoid Fun()
{
int i;
int arr[5] = {0};
for( i=0 ; i<=5 ;i++)
{
c語言入門?arr[i]=0;
printf("Hello Word\n");
}
}
int main()
{
c語言函數調用例子。Fun();
return 0;
}
? 注意for循環i<=5,意思是要循環6次,但是只聲明arr[5],也就是arr[0]到arr[4]
? 當循環到第六次時,會有arr[5] = 0,這就會發生溢出。
程序展示:
c語言?:怎么用?調試過程:
注意在匯編中,arr[0]到arr[4]的堆棧地址依次是[EBP-0x18]到[EBP-0x8]。
注意[EBP-0x4]是子函數的第一個局部變量,也就是C源碼對應for循環中的變量i。
而第六次循環( 此時i=5 )時出現的語句:arr[5] = 0 , 數組arr發生緩沖區溢出,按照數組在堆棧中的存儲順序,arr[5]=0會存儲在[EBP-0x4],而這個地址正是變量i的堆棧地址。
相當于數組arr發生緩沖區溢出覆蓋了變量i,將變量i置為0,使for循環不停止,i又繼續從0自增到5,又被緩沖區溢出的數據置為0,反復循環,致使“Hello Word”永不停止。
版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。
工作时间:8:00-18:00
客服电话
电子邮件
admin@qq.com
扫码二维码
获取最新动态