現(xiàn)代密碼學(xué)發(fā)展到今天,應(yīng)該來講破解密碼的可能性已經(jīng)很低了,而且破解的方法比較單一,因?yàn)楝F(xiàn)在普遍采取不可逆的哈希加密方式(如md5、SHA-1、HMAC-MD5等等),無法通過反向計(jì)算破解密碼,因此目前有效的密碼破解方式仍然是哈希碰撞來暴力破解。
暴力破解的本質(zhì)就是遍歷所有可能,而且我們可優(yōu)化的地方只能是策略層面的,也就是提高遍歷所有情況的效率。不過今天我們要講的的不是暴力破解,我們接下來要說的是跟C語言學(xué)習(xí)有關(guān)的一個(gè)密碼破解的案例,一定程度上也提供了一種密碼破解策略,大家請先看代碼:
1
密碼破解C語言案例
2
破解案例分析
上面的代碼其實(shí)很簡單,提示用戶輸入密碼,讀入字符數(shù)組,通過比較函數(shù)驗(yàn)證密碼,正確的話輸出破解成功,錯(cuò)誤提示密碼錯(cuò)誤,密碼為abc。當(dāng)然這個(gè)案例有很多地方比較理想化,省略了很多東西,但我們想講的是這種破解思想。
從代碼中可以看出通過if語句即為破解成功,也就是打印出密碼破解成功即可。講到這里,其實(shí)我們大家有一個(gè)思維誤區(qū),就是認(rèn)為密碼破解就是要找出原始密碼才算成功,其實(shí)不是這樣的。
if(0==strcmp("abc",password))?{??????flag=1;//關(guān)鍵在于讓flag變?yōu)榉橇阒担艽aabc只是為flag重新賦值提供條件? }
我們換個(gè)角度來思考,在這個(gè)例子中,要想通過if語句,也就是說驗(yàn)證密碼得成功,需要把flag重新賦值進(jìn)而通過if語句的判斷條件,問題就在這里,我們的最終目的是通過if判斷語句,也就是說判斷條件得為真,而上面輸入密碼等一些列過程最終就是讓if判斷語句為真,也就說我們可以拋棄密碼這個(gè)概念,只要讓if判斷條件為真,即可破解成功,能否想到這一步很重要!!!
接下來我們的工作就是想方設(shè)法讓if判斷條件為真了,也就是給flag重新賦一個(gè)非零值,但可操作的只能是用戶輸入,這似乎有點(diǎn)難度。其實(shí)這里就用到了平時(shí)我們要極力避免的bug——棧溢出。大家這樣想,我們沒辦法直接修改flag的值,但可以肯定的是, flag和輸入的密碼都位于同一個(gè)內(nèi)存區(qū)域,而存儲密碼的數(shù)組總是有限的,是否可以通過輸入足夠長的密碼來使數(shù)組數(shù)據(jù)溢出到存儲變量flag的內(nèi)存位置來改變flag的值?答案是可以的。大家看圖:
3
總結(jié)反思
破解上述密碼的關(guān)鍵在于利用數(shù)據(jù)溢出這一漏洞。如果用戶輸入一個(gè)足夠造成緩存溢出并且重寫“flag”變量默認(rèn)值所存在位置的內(nèi)存的長“密碼”,即使這個(gè)密碼無法通過驗(yàn)證,flag驗(yàn)證位也變成了非零,雖然上面的密碼并不等于正確密碼abc,但我們?nèi)匀豢梢酝ㄟ^緩存溢出繞開密碼安全保護(hù)。
想要成為一個(gè)優(yōu)秀的、有能力程序員,做軟件開發(fā)的話,就來學(xué)習(xí)C/C++吧,而且學(xué)習(xí)編程的話有一個(gè)學(xué)習(xí)的氛圍跟交流圈子特別重要!這里我推薦一個(gè)C語言C++交流扣裙,--先八七零九;后63251,不管你是大牛還是小白,大家都一起成長進(jìn)步。
當(dāng)然上面的例子有很多理想化的地方,但是到現(xiàn)在每年因?yàn)閿?shù)據(jù)溢出漏洞造成損失還很大。以上只是密碼破解領(lǐng)域的一種策略,開頭就說了真正的密碼破解遠(yuǎn)沒有這么簡單,但我們主要想講的是這種問題轉(zhuǎn)化的思維,它在計(jì)算機(jī)領(lǐng)域的應(yīng)用是很多的,希望這種思想能給大家的學(xué)習(xí)生活幫上一點(diǎn)忙,就到這吧,謝謝各位!