C語言密碼破解!遠沒有你想的那麼簡單

各位,大家看到標題先彆著急,我先大夥聊聊密碼破解的事,後面會有C語言的破解案例。

現代密碼學發展到今天,應該來講破解密碼的可能性已經很低了,而且破解的方法比較單一,因為現在普遍採取不可逆的哈希加密方式(如md5、SHA-1、HMAC-MD5等等),無法通過反向計算破解密碼,因此目前有效的密碼破解方式仍然是哈希碰撞來暴力破解。

C語言密碼破解!遠沒有你想的那麼簡單

暴力破解的本質就是遍歷所有可能,而且我們可優化的地方只能是策略層面的,也就是提高遍歷所有情況的效率。不過今天我們要講的不是暴力破解,我們接下來要說的是跟C語言學習有關的一個密碼破解的案例,一定程度上也提供了一種密碼破解策略,大家請先看代碼:

◎ 1、密碼破解C語言案例

C語言密碼破解!遠沒有你想的那麼簡單

◎ 2、破解案例分析

上面的代碼其實很簡單,提示用戶輸入密碼,讀入字符數組,通過比較函數驗證密碼,正確的話輸出破解成功,錯誤提示密碼錯誤,密碼為abc。當然這個案例有很多地方比較理想化,省略了很多東西,但我們想講的是這種破解思想。

if(flag)

printf("\\nPassword cracked!\\n"); //進入語句,密碼破解就成功

從代碼中可以看出通過if語句即為破解成功,也就是打印出密碼破解成功即可。講到這裡,其實我們大家有一個思維誤區,就是認為密碼破解就是要找出原始密碼才算成功,其實不是這樣的。

if(0==strcmp("abc",password)) { flag=1; //關鍵在於讓flag變為非零值,密碼abc只是為flag重新賦值提供條件 }

我們換個角度來思考,在這個例子中,要想通過if語句,也就是說驗證密碼得成功,需要把flag重新賦值進而通過if語句的判斷條件,問題就在這裡,我們的最終目的是通過if判斷語句,也就是說判斷條件得為真,而上面輸入密碼等一些列過程最終就是讓if判斷語句為真,也就說我們可以拋棄密碼這個概念,只要讓if判斷條件為真,即可破解成功,能否想到這一步很重要!!!

接下來我們的工作就是想方設法讓if判斷條件為真了,也就是給flag重新賦一個非零值,但可操作的只能是用戶輸入,這似乎有點難度。其實這裡就用到了平時我們要極力避免的bug——棧溢出。

大家這樣想,我們沒辦法直接修改flag的值,但可以肯定的是, flag和輸入的密碼都位於同一個內存區域,而存儲密碼的數組總是有限的,是否可以通過輸入足夠長的密碼來使數組數據溢出到存儲變量flag的內存位置來改變flag的值?答案是可以的。大家看圖:

C語言密碼破解!遠沒有你想的那麼簡單

◎ 3、總結反思

破解上述密碼的關鍵在於利用數據溢出這一漏洞。如果用戶輸入一個足夠造成緩存溢出並且重寫“flag”變量默認值所存在位置的內存的長“密碼”,即使這個密碼無法通過驗證,flag驗證位也變成了非零,雖然上面的密碼並不等於正確密碼abc,但我們仍然可以通過緩存溢出繞開密碼安全保護。

當然上面的例子有很多理想化的地方,但是到現在每年因為數據溢出漏洞造成損失還很大。以上只是密碼破解領域的一種策略,開頭就說了真正的密碼破解遠沒有這麼簡單,但我們主要想講的是這種問題轉化的思維,它在計算機領域的應用是很多的,希望這種思想能給大家的學習生活幫上一點忙。

最後,如果你想學C/C++可以私信小編“01”獲取素材資料以及開發工具和聽課權限!

C語言密碼破解!遠沒有你想的那麼簡單


分享到:


相關文章: