這篇文章將為大家詳細(xì)講解有關(guān)Vxworks加密漏洞的示例分析,小編覺(jué)得挺實(shí)用的,因此分享給大家做個(gè)參考,希望大家閱讀完這篇文章后可以有所收獲。
霍林郭勒ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)公司的ssl證書銷售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書合作)期待與您的合作!
對(duì)工控固件(一般為vxworks)的分析有固定的步驟,總結(jié)如下:
1.用binwalk查看固件基本信息并解壓固件;
2.確認(rèn)解壓固件的信息如CPU類型,編譯固件使用的大頭序;
3.確定固件的加載地址,一般為0x10000(原文中未對(duì)如何找加載地址進(jìn)行解讀);
4.用IDA pro反匯編程序,并修復(fù)固件中的函數(shù)名;
5.找到對(duì)應(yīng)的漏洞函數(shù)進(jìn)行分析。
由于原文中未對(duì)如何找出固件加載地址進(jìn)行說(shuō)明,也未對(duì)最后碰撞hash值的過(guò)程進(jìn)行說(shuō)明。在這樣的疑惑下,本人對(duì)這兩個(gè)問(wèn)題進(jìn)行了進(jìn)一步的解析:
一是找出了靠譜的計(jì)算固件加載地址的方法(這里要感謝"工匠安全實(shí)驗(yàn)室"的大哥給出的思路);
二是通過(guò)編寫程序,碰撞出多個(gè)同一hash值的多個(gè)key解。
固件加載地址的計(jì)算是通過(guò)vxworks固件中的函數(shù)符號(hào)表計(jì)算得出的。在固件中,與函數(shù)字符串相關(guān)的有兩個(gè)地址,一個(gè)是在固件中字符串的存儲(chǔ)地址;另一個(gè)是固件中保存的函數(shù)字符串的內(nèi)存地址。這兩個(gè)地址相減,就能得出固件的加載地址。因此,我們只需要定位到一個(gè)固定的字符串,找到它在固件中的位置以及在內(nèi)存中加載它的地址,就能算出固件的加載地址了。在winhex中搜索APP_STATION這個(gè)字符串(該字符串有它的特殊性,它是函數(shù)字符表中的最后一個(gè)字符串,見(jiàn)下圖,如果搜不到該字符串,按照這種方式找到字符表的最后一個(gè)字符串也是可以的),記下它在固件中的地址為0x26656c。
下一步還需要找到該字符串在內(nèi)存中的加載地址,根據(jù)函數(shù)符號(hào)表的特點(diǎn),它的內(nèi)存加載地址為符號(hào)表的起始位置。在binwalk中可以查看vxworks的字符表的大致起始位置,如下圖所示,binwalk計(jì)算的符號(hào)表的起始位置為0x301E74。
需要說(shuō)明的是,這個(gè)值不一定準(zhǔn)確,還需在winhex中進(jìn)一步確認(rèn)。在winhex中跳轉(zhuǎn)到0x301E74,如下圖所示。圖的右側(cè)出現(xiàn)了很規(guī)律的".....'e..."的列。這種規(guī)律復(fù)合函數(shù)符號(hào)表的排列方式,因此,根據(jù)排列規(guī)律,符號(hào)表的起始位置應(yīng)該為0x301E64。
在這個(gè)地址存儲(chǔ)的是字符串的內(nèi)存地址為0x27656C,而且可以看到,字符串的地址是倒序排列,所以這個(gè)地址就是前面的最后一個(gè)字符串的內(nèi)存地址。
那么,加載地址為字符串的內(nèi)存地址減去字符串地址有:0x27656C - 0x26656C =0x10000
算出了固件的加載地址,當(dāng)我們加載固件后,需要修復(fù)函數(shù)名該怎么辦呢?可以利用函數(shù)名修復(fù)腳本完成這一操作,使用的腳本如下圖所示:
在對(duì)具體的工控固件進(jìn)行函數(shù)名修復(fù)時(shí),腳本中有三個(gè)值需要注意下。loadaddres即是剛剛算出的加載地址,eaStart即是函數(shù)符號(hào)表的起始地址為0x301E64,eaEnd是函數(shù)符號(hào)表的結(jié)束地址,這個(gè)地址怎么找,還是只有根據(jù)符號(hào)表的規(guī)律來(lái)找。如下圖所示,符號(hào)表會(huì)規(guī)律的排列,這種規(guī)律排列在0x3293a4結(jié)束,因此,這個(gè)地址即為符號(hào)表的結(jié)束地址。
這樣,才可以順利地加載并運(yùn)行該腳本。
先通過(guò)固件逆向分析loginDefaultEncrypt函數(shù),在IDA Pro中可以看到loginDefaultEncrypt函數(shù)的反匯編情況,結(jié)合vxworks給出的源碼,可重寫該函數(shù)為:
在函數(shù)里可以看到,輸入的密碼key長(zhǎng)度有限制,長(zhǎng)度得大于8,小于40。而hash值cQwwddSRxS的長(zhǎng)度為10。經(jīng)分析發(fā)現(xiàn),長(zhǎng)度為9和10的key都可能會(huì)產(chǎn)生長(zhǎng)度為10的hash值。因此,本人先通過(guò)編寫程序隨機(jī)生成長(zhǎng)度為10的密碼本,代碼如下,為shell腳本。
在大for循環(huán)中,共生成了100萬(wàn)個(gè)長(zhǎng)度為10的密碼。在shell中運(yùn)行該程序:
./10pass.sh > 1.txt #將隨機(jī)密碼輸出到1.txt文件中。
再編寫程序循環(huán)讀入密碼本中隨機(jī)生成的密碼,采用已經(jīng)寫好的loginDefaultEncrypt函數(shù)算出密碼對(duì)應(yīng)的hash值;最后,與題目給出的hash值進(jìn)行比較,如算出的hash與題目hash的值相等,則視為碰撞出了key值。下面是給出程序的main函數(shù),在函數(shù)中可以清楚地看到每一步的操作。
用gcc編譯:gcc -o guesshash ./guesshash.c,運(yùn)行,碰撞出的結(jié)果如下圖所示。
可以看到,這確實(shí)是一個(gè)很弱的加密算法,100萬(wàn)個(gè)隨機(jī)密碼就碰撞出11個(gè)hash值相同的結(jié)果。
關(guān)于“Vxworks加密漏洞的示例分析”這篇文章就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,使各位可以學(xué)到更多知識(shí),如果覺(jué)得文章不錯(cuò),請(qǐng)把它分享出去讓更多的人看到。