字符串數據類型是經常在代碼里用於存儲硬編碼(直接做為固定內容寫入了程序,類似於常量)的密鑰。這些可以通用的文字密鑰用於連接字符串或特定業務密鑰(如優惠券代碼,許可證密鑰等)。事實上,絕大多數存在於開發應用內的字符串數據類型的敏感數據,讓黑客頗感興趣。 在這篇文章中,我們將介紹一些黑客們過去時常存儲在字符串里敏感信息技術。
在我們進一步深入探討之前,很多東西我想絕對應該搞清楚。在這篇文章中,我將演示黑客是怎樣使用工具像justdecompile,ILDASM以及Windbg這樣的工具的。需要記住的是,這些工具不是用來滿足黑客利益的,而是應該基於合法的用途和合理的理由。同樣的工具用在壞人手中,則有可能僅僅為了自己的私利而傷害到別人。因此學習這些黑客使用的技術,以便我們能夠更好地減輕這些技術帶來的特定威脅,是相當重要的。
最后,本文並非特意提到我所演示的防御機制面臨的威脅。盡管如此,我還是要簡單地提到一些常見的方法,可以用來防止這些威脅,然而,這里不會做一個防御機制與方案的綜合討論。
在CLR的執行模式下,你可以用你喜歡的.NET語言編寫代碼,比如C #,托管的C++,VB.NET等。代碼會被編譯成被稱為微軟中間語言或IL代碼的字節碼。所以你的應用程序或.net組件實際上包含了中間語言的形式的代碼。當你在運行時執行你的應用程序,此代碼將被編譯成本地CPU指令。IL代碼編譯成原生指令的過程稱為及時編譯(又名JITting)。
圖1:CLR執行模型
這種包含在.net組件里的中間語言代碼非常復雜,它保留了所有的數據結構的信息,如類,方法,屬性,參數,甚至方法編碼中。這種冗長的IL代碼使得逆向一個.NET組件變得相當繁瑣,從而使攻擊者沒辦法從中獲取有價值的信息。
讓我們開啟趣味之旅
為了在一個程序集里找出硬編碼的密鑰,你可以在.NET代碼瀏覽器(比如telerik的justdecompile或ilspy等)打開程序集。這些代碼瀏覽器能讓你以C #,VB.NET或者中間語言的形式打開程序集查看代碼。讓我們簡短看一下我們這個簡單的程序。代碼本身是非常簡單和直觀,但是很好論證了這個概念。此示例應用程序中有一個稱為常數的類,包含用於存儲敏感商業信息的一些字符串(如下所示)。
public class Constants { public static string ConnectionString = "Data Source=HOMEPC;Initial Catalog=MyDb;User Id=SpiderMan;Password=secret;"; public static string CouponCode50Pct = "AlphaBetaGamma50"; public static string CouponCode75Pct = "AlphaBetaGamma75"; public static string UserName = "SuperUser"; public static string Password = "SuperSecretPassword"; public Constants() { } }
現在讓我們在telerik的justdecompile里打開編譯后的可執行程序集。圖2顯示了這個程序集的視圖,您可以很容易地查看這些不會輕易地透露給任何人的字符串。
圖2:在justdecompile下的.net程序集。
通常在一個現實生活中,通過用代碼瀏覽器(如telerik justdecompile)打開程序集來搜索字符串是一個單調乏味的工作。現在的黑客很聰明,他們會有很多工具用來找出有效的易受攻擊的代碼並計划下一步的攻擊。其中的一個工具是中間語言的反匯編器(又名ILDASM)。就像justdecompile,Ildasm,用來反匯編一個NET程序集來查看代碼,然而ILDASM就只能以中間語言的形式查看代碼。
Ildasm可在兩種模式下工作,一種是利用其圖形用戶界面;另一種就是使用控制台命令。用控制台模式是典型的黑客的偏愛,用來展開一次公開信息的攻擊。圖3顯示了如何使用ildasm以命令的方式來查找存在於.net程序代碼字符串類型。
圖3:用於搜索.net程序里的字符串數據類型Ildasm.exe。
我想指出的是,程序集混淆和加密字符串不是個完美的解決辦法。它能對一些業余的用戶起到一些保護作用,但是在一個經驗豐富的老手面前,即便有很多的防御機制,只要手頭時間足夠,照樣能破解。
在運行的時候泄漏秘密
到目前為止,我們鎖看到的都是靜態的對.net程序進行攻擊。在運行時候的字符串數據類型,也是很容易泄漏秘密的。這就意味着,在運行的時候,黑客可以將調試器附加檢查存儲在這些字符串數據類型的數據。讓我們來看看怎樣進行這種類型的攻擊。我會用Windg進行演示。windg是一個土生土長的調試器,還可以用來調試托管的附帶有可擴展dll幫助的應用程序Dll。Windg是windows下調試工具的一種。
當你點擊“ok”描繪,會出現一個對話框,顯示登錄失敗。這時候打開WinDbg並且附加到正在運行的進程。對此,你必須選擇“附加到進程”菜單選項,如下圖所示。
圖6:附加到進程的菜單選項
接下來在下面的對話框中選擇運行過程中要監視的程序
。
圖7:附加到進程對話框
這時候我們來看看.net托管堆,檢查字符串數據類型的實例。有很多不同的方法實現,我會簡單地用!string命令來達到目的。
圖8:運行!string命令
輸出!string命令可能會有點長,但是我們在文本框里輸入的用戶名和密碼將會在下面顯示的地方看到。
圖9:運行的時候能看到秘密!
微軟提供了SecureString類,可以幫助提供一些對這種類型的工具的防護。
在本文中,我們討論了為什么字符串數據類型是黑客特別感興趣的。我們展示了一些常見的黑客可在靜態和運行時,發現存儲在字符串數據類型里敏感信息的方式。希望以上這些對大家有用。
譯文出處:http://www.codeproject.com/Articles/401220/Why-hackers-love-String-data-type