用過C#的朋友可能認為它是一種十分安全的語言,其實C#也可以做到經典的緩沖區溢出。
本文章將用一個實例來描述C#究竟是如何發生緩沖區溢出的!
首先建立一個C# Console工程,并開啟工程的“允許不安全代碼”選項
鍵入代碼:
- using?System;??
- using?System.Collections.Generic;??
- using?System.Linq;??
- using?System.Text;??
- ??
- namespace?ConsoleTest??
- {??
- ????class?Program??
- ????{??
- ????????static?void?Main(string[]?args)??
- ????????{??
- ????????????char?ori?=?'A';??
- ????????????StackOverflow();??
- ??????????????
- ????????????Console.WriteLine(ori);??
- ????????????Console.ReadLine();??
- ????????}??
- ??
- ????????static?unsafe?void?StackOverflow()??
- ????????{??
- ????????????int*?p?=?stackalloc?int[1];???
- ????????????int?i?=?sizeof(int);???
- ??
- ????????????while?(*p?!=?(int)'A')???
- ????????????{??
- ????????????????p?+=?i;??
- ????????????????Console.ForegroundColor?=?ConsoleColor.Yellow;??
- ????????????????Console.WriteLine("Address:?{0}",?(int)p);???
- ????????????????Console.ForegroundColor?=?ConsoleColor.Gray;??
- ????????????????try??
- ????????????????{??
- ????????????????????Console.WriteLine("Value:?{0}",?*p);??
- ????????????????}??
- ????????????????catch??
- ????????????????{??
- ????????????????????Console.WriteLine("We?can't?reach?the?system?area");???
- ????????????????????break;??
- ????????????????}??
- ????????????????Console.WriteLine();??
- ????????????};??
- ????????}??
- ????}??
- }??
大家可以先運行一下:

程序在找到‘A’的ASCII碼后跳出循環。
其實程序的原理是:
p指針指向int數組的第一個元素,指針每次增加一個int的內存空間,由于數組的大小為1,所以兩次循環后就溢出并指向在其前面的內存變量。最終找到ori所在的內存地址。
下面我們嘗試修改ori的值,將其從‘A’修改為‘!’,there we?Go:
這樣修改代碼:

經過這樣的修改,再次運行:

可以看到ori被徹底修改為‘!’了。如果用這種方式將函數的地址進行修改就可以達到執行遠程代碼的目的了。