作者:Yimi Hu & Light @ PwnMonkeyLabs
原文鏈接:https://mp.weixin.qq.com/s/3abqBSq53ATFKAZmvFKBPw

簡介

本篇是胖猴小玩鬧專題的第十一篇,我們將繼續分析海康螢石的智能網關,其思路是先從簡單的地方著手,把不需要逆向分析的,可以直接就能觀察到的輸出和文件都看一看,然后再深入的研究某個細節。

在本專題的上一篇文章中,我們已經獲取了電路板上Flash存儲的固件內容,同時對MCU的UART引腳進行測試,確認該引腳與軟排線接口連通。那么就下來,我們就想辦法連上軟排線的接口

網關分析

2.1 串口分析

為了接通軟排線,我們需要購買一段20pin的軟排線,淘寶可以買到,樓下手機店可能也有。軟排線的另一端連接轉接板,將0.5mm間距的軟排線轉接為常見的2.54mm間距的排針。如下圖所示:

圖片

圖2-1 軟排線連接轉接板

接下來,左側轉接板再通過usb轉ttl模塊連接電腦。usb轉ttl模塊的作用是調整電平邏輯,通過該模塊,使usb接口的RS232邏輯電平轉為MCU的ttl邏輯電平,反之亦然。可以在淘寶買到該模塊,截圖如下:

圖片

圖2-2 usb轉ttl模塊

上圖中,左側有5個引腳,我們需要重點關注其中三個,分別是RXD引腳、TXD引腳和GND引腳。RXD引腳是該模塊的輸入引腳,要連接MCU的 TXD引腳,就是將MCU的輸出作為usb轉ttl模塊的輸入。TXD引腳鏈接MCU的RXD引腳。最后通過接通MCU的GND引腳和該模塊的GND引腳實現共地。連接完成之后,如下圖:

圖片

圖2-3 連接MCU的UART接口

另外,最好給網關單獨準備一個帶開關的電源插座,以便于我們反復重啟網關,否則來回插拔網關容易導致各種問題。我們在實際操作中,軟排線和軟排線接口的觸點位置經常虛接,暫無法確定海康螢石的軟排線接口是否需要特殊的軟排線才能連接,但這樣也勉強能用。

將usb轉ttl模塊插入電腦之后,在電腦的“設備管理器”選項卡中就會出現一個COM口,并為其分配了一個COM編號,如下圖所示:

圖片

圖2-4 設備管理器選項卡

為了讀取此COM口的通信數據,我們還需要一個軟件,可以選擇Xshell、SecureCRT或者sscom串口調試工具等。我們這里用Xshell作為讀取串口的軟件,相關配置如下:

圖片

圖2-5 Xshell配置串口連接

按照圖中的方式完成配置,其中Port選擇剛剛識別到的COM口編號,其他參數選擇默認就好,如有變動,我們會額外指出的。

配置完畢后,連接該串口,給網關上電,如果一切操作都正確無誤,那么就可以看到如下的輸出內容:

圖片

圖2-6 串口輸出內容

上圖中的輸出內容顯然是網關上電之后的輸出日志,待系統啟動完成之后,我們可以試著輸入一些內容,這時就會出現登陸嵌入式Linux系統的提示字符,看來還能通過COM口登陸呢,但是登陸用戶和登陸密碼我們暫不知道。好吧,那就重新去翻一翻提取出來的網關固件。

2.2 重打包固件

在本專題的上一篇中,我們已經把完整的網關內容提取出來了,在其中的cpio文件系統中,可以找到/etc/shadow文件,文件內容如下:

圖片

圖2-7 文件系統中/etc/shadow文件

借助于彩虹表,就可以找到root用戶的登陸密碼為abc123。使用該用戶名,就可以順利登陸海康螢石的智能網關,并使用串口shell提供的各種功能了。但是上文也提到了,我們的軟排線觸點可能有點虛接,有時候吹口氣就斷了,還是想辦法弄個更穩定的連接吧。

在海康螢石的網關固件中翻一翻,可以發現在/sbin目錄中有telnetd程序,如果我們可以通過telnet連接智能網關,或許會穩定很多,如下圖所示:

圖片

圖2-8 智能網關中/sbin/telnetd程序

注意,該程序是指向busybox的軟鏈接,如果把解壓縮出的固件內容拿到windows環境后,可能會導致/sbin目錄中是空的。可以使用串口shell登陸設備,然后運行telnetd程序,但這就意味著每次設備重啟之后,我們都要使用shell啟動telnetd程序,這樣操作也很麻煩。

繼續翻找,我們在squashfs文件系統中找到initrun.sh腳本,通過名字和內容可以判斷該腳本是在網關上電啟動后進行初始化操作的。如果我們在該腳本中啟動telnetd,然后將固件重新打包燒錄回去,應該就不需要軟排線了,為此我們給initrun.sh增加telnetd命令,如下圖:

圖片

圖2-9 在initrun.sh中啟動telnetd程序

接下來,就要考慮如何將固件重新打包,然后刷回至Flash中了。固件解包時,只要binwalk跑一下就完事了,但是重打包就相對麻煩一些。我們剛剛修改了initrun.sh文件,該文件在squashfs文件系統中,所以就需要重新打包squashfs文件系統,但mksquashfs在打包時,有很多細節的參數和配置,這些參數和配置將直接影響我們重打包的系統是否可以正常運行,此外,還有設備只能識別特定版本的mksquashfs打包出來的固件。

為解決squashfs文件系統打包的問題,我們最好參考一下MT7688AN的官方SDK。假設海康螢石的開發者基于該SDK的進行開發的,那么我們也根據SDK中的固件打包方法進行操作,得到的固件應該就是可運行的。首先在官網上下載MT7688 SDK,鏈接如下:http://labs.mediatek.com/zh-cn/platform/linkit-smart-7688,如下圖:

圖片

圖2-10 下載MT7688 SDK文件

在下載到的SDK文件中,我們可以在include文件夾中找到image.mk文件,在該文件中可以找到打包squashfs文件系統時的命令和參數,如下圖所示:

圖片

圖2-11 打包squashfs文件系統的命令和參數

同時,在‘staging_dir\host\bin’目錄中可以找到圖2-11 中的mksquashfs4程序,如下圖所示:

圖片

圖2-12 打包squashfs文件系統需要的程序

我們試著用圖2-12中的程序和圖2-11中的參數打包一下開啟telnetd程序的squashfs文件系統,如下圖所示:

圖片

圖2-13 完成squashfs文件系統打包

上圖中,-comp xz是選擇xz壓縮格式,通過binwalk可以直接查看到原固件中的壓縮格式,所以我們也選擇該壓縮格式。

最后,將打包后的文件系統重新放回固件文件中。我們用了一個頗為簡單粗暴的方法,即用UltraEdit直接16進制編輯。上一篇的binwalk分析結果顯示從地址0x700000開始的位置是squashfs文件系統的位置,如下圖:

圖片

圖2-14 十六進制編輯固件

我們只需要將重新打包的squashfs文件覆蓋到此處即可,需要注意的是固件文件從地址0x900000起始就是另一個squashfs文件系統了,所以,覆蓋完成后需要調整兩個文件系統之間的填充字節數量以保證另一個squashfs文件系統的起始偏移仍然是0x900000。至此,我們完成了重打包工作。

2.3 固件燒錄

固件的燒錄和固件的提取是類似的,依舊是把Flash芯片用熱風槍吹下來,然后通過編程器以及配套的軟件將2.2章中我們獲得的固件文件燒錄至Flash中,操作過程可以參考本專題第九篇中的提取固件過程,這里就不再贅述了。

燒錄完成之后,我們給智能網關上電,可以觀測到網關是正常啟動了,那么這說明我們重打包的固件是可以運行的。由此,我們獲得了固件編輯能力,如果有必要的話,可以隨時編輯和調整固件中的各種程序。

小結

在本篇中,我們主要討論了2件事情,其一是使用usb轉ttl模塊連接上了海康螢石網關設備的軟排線接口,通過UART接口觀察到了系統啟動時的輸出,并登陸了嵌入式Linux系統;其二是我們開啟了海康螢石的網關的telnetd程序,并對該固件進行重打包,最后將重打包的固件刷入Flash中,我們的固件是可以順利執行的。在本專題的后續文章中,我們在此基礎上繼續分析和研究海康螢石的智能網關,希望各位讀者能有所收獲。


Paper 本文由 Seebug Paper 發布,如需轉載請注明來源。本文地址:http://www.bjnorthway.com/1537/