C 不為人知的秘密 緩衝區溢位

2021-07-26 23:04:55 字數 1576 閱讀 7439

[收藏]

摘要:c#緩衝區溢位的秘密,大家一定還不是很了解。當你們看到網上傳播關於微軟windows、ie對黑客利用「緩衝區溢位」、0day漏洞攻擊的新聞,是否有過自己也想試試身手,可惜無從下手的感慨?

開場白

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

1.本文講述在c#中利用堆疊緩衝區溢位動態修改記憶體,達到改變應用程式執行流程的目的。

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

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

我們知道,當陣列下標越界時,.net會自動丟擲stackoverflowexception,這樣便讓我們可以安全的讀寫記憶體,那麼我們有沒有逾越這個自動檢測的屏障,達到我們非常操作的目的呢?答案是有的,而且我們可以修改一些關鍵變數如if、switch的判斷值,for迴圈變數i值,甚至方法返回值,當然理論上還可以注入**、轉移**執行區塊,前提是必須在unsafe**裡。

方法在被呼叫時,系統會進行以下幾項操作:將該方法入棧、引數入棧、返回位址入棧、控制**區入棧(eip入棧)。我們想要訪問方法的棧內位址,常規的託管**是不行的,只能使用unsafe**,但也並不是說你非要精通c/c++語言和指標操作,本文的例子都非常簡單,完全可以將指標就認為是簡版c#陣列。

先給出一段**,然後再詳細解釋原理。

staticunsafevoidmain(string args)

\n", i);

p[i] =0;

}console.readline();}

這是乙個既簡單,但是對於從沒有嘗試這樣寫過**的開發者來說,又頗耐人尋味,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("\n", i)就是讓大家能更直觀的看到程式的執行過程,當然這裡也可以改為p[i]=1,p[i]=2等數字

還是先給出**

staticunsafevoidmain(string args)

staticunsafeintchange_result()

};returnresult;}

變數result作為方法的返回值預設為123,並且沒有任何顯式修改其值的**,關鍵在這裡

while(true)

}

這段**找到值為123的記憶體位址(也就可能是變數result的位址),然後將其值修改為10000,當然,函式返回值就肯定不會再是原先的123咯

這就是經典的stackoverflow的兩個例子,希望通俗易懂能讓大家所接受,另外緩衝區溢位並不只是改變記憶體的值,在高手的手裡,他還可以執行任意**,因為方法執行的時候總會有乙個指標指向方法即將執行的下一條指令,如果控制了這個指標,就控制了程序。

特別篇 不為人知的U盤秘密

其實市面上的u盤大多都是擴容了的u盤,往往都沒有實際說的那麼大,比方說小編的u盤,說好的32g只有31.2g,似乎也沒什麼。但是如果遇上了討厭的商家,那就麻煩了。最近小編買了乙個假的u盤,很令小編生氣,放上一些小檔案,竟然全部損壞,你可能會說是這個u盤質量不好,或者快遞小哥弄壞之類的原因,其實不是這...

各種排序不為人知的真相

常用的排序演算法有 交換排序 氣泡排序 快速排序 選擇排序 直接選擇排序 堆排序 插入排序 直接插入排序 二分插入排序 希爾排序 歸併排序 基數排序 直接選擇排序和氣泡排序的比較 void bubblesort vector list void choosesort vector list swap...

不為人知的NodeJS 1

2.filename變數與 dirname變數 3.事件機制 用於進行標準輸出流的輸出,即在控制台中顯示一行字串用於進行標準錯誤輸出流的輸出,即向控制台輸出一條錯誤資訊用於檢視乙個物件中的內容並且將物件的資訊輸出到控制台中 console.time 標記開始時間 console.timeend 標記...