前言
攝像頭是我們常見的IoT設備,它的安全關系著用戶的隱私,而廠商為了防止逆向分析,在程式的實作上會使用各種方法來阻止逆向工程,本文通過某款知名的攝像頭的逆向分析,簡單介紹了我是如何通過串口一步步的對攝像頭中的關鍵程式進行逆向的方法,
串口分析
直接拆開目標,處理器和FLASH在底座下面,通過分析可知道,該型號的攝像頭使用了海思Hi3516A(ARM架構),FLASH為128MB,該FLASH引腳相對拆焊比較費時間,于是 試試能不能直接從串口中獲取到韌體,

發現PCB版上暴露了UART串口,其中通過萬用表測量可知,最左邊的焊盤為GND,最右邊焊盤對地為3.3v,應該是Vcc,中間兩個為Rx和Tx,

將UART接到TTL轉USB,這時注意Rx和Tx如果接反串口無資訊,這時調換以下就可以看到輸出的列印資訊,

打開對應的串口,設定波特率115200:

韌體提取
按住Ctrl+B進入U-boot,這時我們可以在U-boot中提取出韌體了 ,

先看flash記憶體布局,開始的1M存放的是boot,后面是kernel,接著是program,我們關注點主要在kernel和program上,先把這些資料讀取出來,

先把資料讀到記憶體,然后md出來,再轉成bin即可,這里演示是dump kernel的資料,其他FLASH資料也可通過該方法dump出來,

解密程式
使用binwalk可以直接解開提取到的韌體資料,然而在分析程序中,
發現一些程式是加密的,如下圖所示,該檔案原來應該是ELF程式,應該有ELF magic number,但是010 editor分析后發現這個程式是加密了,

有加密的地方就會有解密的地方,一般linux下對程式解密都是放在內核完成的,下一步我們需要分析該韌體的內核,如下所示,高亮的地方我們可以獲取到該內核的真正加載地址:0xC0008000,

當設定正確的加載地址后,IDA已經可以識別出一大部分函式資訊:

我們通過字串參考資訊快速定位了解密該程式的地方,該函式先判斷了是否是ELF檔案,是的話就不執行解密邏輯,如果確定程式加密后,先讀取前32位元組解密出AES密鑰,

我們不需要太關心解密密鑰演算法,由于該演算法很簡單,直接復制到vs中進行呼叫,并且編譯運行得到AES密鑰:QdCpBsjP_** _TY

后面是直接呼叫了AES-CBC進行解密,key和iv為我們解密得到的字串:

解密腳本如下所示:
from Crypto.Cipher import AES
import binascii
import hexdump
with open('./fs/usr/bin/****','rb') as fd:
data=fd.read()
key=b"QdCpBsjP_***_TY"
iv=key
cipher = AES.new(iv, AES.MODE_CBC,key)
dec=cipher.decrypt(data[0x80:])
hexdump.hexdump(dec)
with open('****.bin','wb+') as fd:
fd.write(dec)
解密結果如下:

總結
本文簡單介紹了串口提取韌體的方法以及快速解密廠商自定義的程式加密的方法,通過以上作業,基本上為后續的分析掃除了障礙,當然,后面的漏洞挖掘作業還是一個不小的挑戰,今后大家遇到加密得ELF程式或者bash,不妨分析下Linux內核,沒準解密演算法就在其中,

轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/299039.html
標籤:其他
