c語言必背18個經典程序,c語言緩沖區溢出例子,經典緩沖區溢出小例子

 2023-11-11 阅读 29 评论 0

摘要:經典緩沖區溢出小例子文章目錄經典緩沖區溢出小例子0.說明1.基于緩沖區溢出的HelloWordc語言必背18個經典程序?2.永不停止的HelloWord0.說明? 兩個小程序,C語言編寫,VC++6.0編譯? 調試用的OD。? 小程序來源:“滴水逆向”的視頻。1.基于緩沖區溢

經典緩沖區溢出小例子

文章目錄

經典緩沖區溢出小例子

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;

}

程序展示:

5e4baa46ec8a7406aa2db733ee89916b.png

為什么會輸出“Hello Word”??

調試過程:

7885d2bd747241036e38c7940f567ceb.png

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,這就會發生溢出。

程序展示:

da8ad75c2794f57daa1a69718e15d0a3.png

c語言?:怎么用?調試過程:

378a62e1ba8a89d03620d89086aa8f75.png

注意在匯編中,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”永不停止。

版权声明:本站所有资料均为网友推荐收集整理而来,仅供学习和研究交流使用。

原文链接:https://808629.com/172354.html

发表评论:

本站为非赢利网站,部分文章来源或改编自互联网及其他公众平台,主要目的在于分享信息,版权归原作者所有,内容仅供读者参考,如有侵权请联系我们删除!

Copyright © 2022 86后生记录生活 Inc. 保留所有权利。

底部版权信息