成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

淺談C#緩沖區溢出的秘密

開發 后端
C#緩沖區溢出的秘密,大家一定還不是很了解。當你們看到網上傳播關于微軟windows、IE對黑客利用“緩沖區溢出”、0day漏洞攻擊的新聞,是否有過自己也想試試身手,可惜無從下手的感慨?

開場白

各位朋友們,當你們看到網上傳播關于微軟windows、IE對黑客利用“緩沖區溢出”、0day漏洞攻擊的新聞,是否有過自己也想試試身手,可惜無從下手的感慨?本文將完全使用C#語言,探索那些不為人知的秘密。

1.本文講述在C#中利用堆棧緩沖區溢出動態修改內存,達到改變應用程序執行流程的目的。

2.如果你是高手,請指出本文的不足。

3.為了讓本文通俗易懂,代碼將極盡精簡。

現在開始

我們知道,當數組下標越界時,.NET會自動拋出StackOverflowException,這樣便讓我們可以安全的讀寫內存,那么我們有沒有逾越這個自動檢測的屏障,達到我們非常操作的目的呢?答案是有的,而且我們可以修改一些關鍵變量如if、switch的判斷值,for循環變量i值,甚至方法返回值,當然理論上還可以注入代碼、轉移代碼執行區塊,前提是必須在unsafe代碼里。

方法在被調用時,系統會進行以下幾項操作:將該方法入棧、參數入棧、返回地址入棧、控制代碼區入棧(EIP入棧)。我們想要訪問方法的棧內地址,常規的托管代碼是不行的,只能使用unsafe代碼,但也并不是說你非要精通C/C++語言和指針操作,本文的例子都非常簡單,完全可以將指針就認為是簡版C#數組。

改變臨時變量的值

先給出一段代碼,然后再詳細解釋原理。

  1. static  unsafe void Main(string[] args)  
  2.         {  
  3.             //在棧上申請一個只能保存一個int32的內存段  
  4.             int* p = stackalloc int[1];  
  5.  
  6.             for (var i = 0; i < 30; i++)  
  7.             {  
  8.                 System.Threading.Thread.Sleep(200);  
  9.  
  10.                 Console.WriteLine("{0}\n", i);  
  11.                 p[i] = 0;  
  12.             }  
  13.               
  14.             Console.ReadLine();  
  15.         } 

這是一個既簡單,但是對于從沒有嘗試這樣寫過代碼的開發者來說,又頗耐人尋味,C#(包括C/C++)不會去檢查指針p的偏移量是否越界,那么這段代碼將會順利編譯并運行,那么for循環會順利執行30次嗎?還是......

呵呵..大家稍等...

結論是,這將是一個死循環,因為p不斷的遞增1偏移,并將附近的內存的值全改為0,而局部變量i是靠p最近的變量,所有當p[i]的偏移地址等于i的地址時,代碼p[i]=0就等價于i=0,實際上我在測試中i=6的時候i的值就被覆蓋為0了,我在代碼中添加了Thread.Sleep(200)和Console.WriteLine("{0}\n", i)就是讓大家能更直觀的看到程序的執行過程,當然這里也可以改為p[i]=1,p[i]=2等數字

搜索內存值并修改

還是先給出代碼

  1. static  unsafe void Main(string[] args)  
  2.         {  
  3.             Console.WriteLine(Change_Result());  
  4.             Console.ReadLine();  
  5.         }  
  6.  
  7.         static unsafe int Change_Result()  
  8.         {  
  9.               
  10.             int i = 0;  
  11.             //變量result,默認的返回值  
  12.             int result = 123;   
  13.             //申請一段棧內存,大小可隨意設置  
  14.             int* p = stackalloc int[1];  
  15. //從當前棧地址開始向下查找與函數返回值相匹配的地址,一旦匹配則修改為10000  
  16.             while (true)  
  17.             {  
  18.                 if (p[++i] == 123)  
  19.                 {  
  20.                     p[i] = 10000;  
  21.                     break;  
  22.                 }  
  23.             };  
  24.             return result;  
  25.         } 

變量result作為方法的返回值默認為123,并且沒有任何顯式修改其值的代碼,關鍵在這里

  1. while (true)  
  2.  
  3.             {  
  4.                 if (p[++i] == 123)  
  5.                 {  
  6.                     p[i] = 10000;  
  7.                     break;  
  8.                 }  
  9.             } 

這段代碼找到值為123的內存地址(也就可能是變量result的地址),然后將其值修改為10000,當然,函數返回值就肯定不會再是原先的123咯

這就是經典的StackOverFlow的兩個例子,希望通俗易懂能讓大家所接受,另外緩沖區溢出并不只是改變內存的值,在高手的手里,他還可以執行任意代碼,因為方法執行的時候總會有一個指針指向方法即將執行的下一條指令,如果控制了這個指針,就控制了進程。 

原文鏈接:http://www.cnblogs.com/bidaas2002/archive/2010/12/27/1917562.html

【編輯推薦】

  1. C#取整函數實例應用詳解
  2. C#單元測試的一個小故事
  3. C#單元測試概念及作用的淺析
  4. C#單元測試使用的必要性的淺析
  5. C#單元測試的運行淺析
責任編輯:彭凡 來源: 博客園
相關推薦

2019-02-27 13:58:29

漏洞緩沖區溢出系統安全

2017-01-09 17:03:34

2014-07-30 11:21:46

2018-01-26 14:52:43

2009-09-24 18:16:40

2022-08-09 08:31:40

C -gets函數漏洞

2015-03-06 17:09:10

2010-10-09 14:45:48

2010-09-08 15:43:18

2011-03-23 12:39:44

2010-09-29 15:10:58

2011-03-23 11:35:00

2015-09-02 09:01:03

2022-05-07 08:27:42

緩沖區溢出堆棧

2020-08-10 08:37:32

漏洞安全數據

2018-11-01 08:31:05

2011-11-15 16:00:42

2011-07-20 10:54:14

C++

2012-09-27 09:25:50

2020-10-27 09:51:18

漏洞
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 欧美日韩不卡 | 国产精品亚洲精品 | 国产精品自拍视频网站 | 中文字幕免费在线观看 | 亚洲精品乱码久久久久久久久久 | 男女又爽又黄视频 | 免费的黄色片子 | 亚洲欧美日本在线 | 龙珠z在线观看 | www在线| 亚洲福利 | 日韩欧美一区二区三区免费看 | 免费a级毛片在线播放 | 一级看片免费视频囗交动图 | 亚洲综合精品 | 日韩久久久一区二区 | 欧美日韩三级在线观看 | 日韩欧美亚洲一区 | 日本三级网址 | 欧美13videosex性极品 | 欧美成年人视频在线观看 | 玖玖免费 | 成人三区 | 日日摸夜夜爽人人添av | 亚洲一区二区三区免费观看 | 国产精品国产三级国产aⅴ无密码 | www.日韩在线 | 久色视频在线 | 亚洲精品视频一区二区三区 | 国产精品毛片久久久久久 | 国产日韩精品一区二区 | 亚州精品成人 | 国产一级电影在线 | 亚洲视频免费一区 | 国产一区精品 | 亚洲一区二区在线播放 | 国产欧美一区二区精品忘忧草 | 亚洲精品视频三区 | 91社影院在线观看 | 日韩久久综合 | 五月婷婷在线视频 |