2020年12月31日 星期四

109年金盾決賽 - Android reverse engineering (咖啡機IOT)

今年的金盾獎決賽有增加特殊的題型,例如IOT (Internet of Things)和教學題,其中IOT需要與設備互動來藉此解題。此篇的題型是要連線到咖啡機,然後透過逆向分析獲取藍芽密碼,並且泡上一杯咖啡,即可獲取Flag。在決賽時,並不是每隊都能解到IOT的題目,因此在這裡提供咖啡機IOT的題目給各位,不過並沒有提供實體設備,只要解出藍芽密碼即可。

 

題目下載連結

https://drive.google.com/file/d/1pfguXLZHEOuXkDhl9OjI_X8AuZNK9y8h/view?usp=sharing

一、題目介紹

在比賽時,會有時體的咖啡機放在現場,只要能解開藍芽密碼並且泡出咖啡就能獲取Flag。



題目裡的內容會有一個可以連線到咖啡機的apk (joe_v2.1.0.com.apk)檔案和咖啡機APP的相關儲存資訊的資料夾(ch.toptronic.joe)。



二、解答

將joe_v2.1.0.com.apk解壓縮,然後將classes.dex透過jadx反編譯。



從題目得知APP連線方法是使用藍芽(Bluetooth)連線,因此尋找相關資訊(包含class name、method name、field name等等) 。



從onScanResult方法發現CoffeeMachine相關的物件,並且分析CoffeeMachine 類別結構,找出與藍芽連線相關的資訊。



在CoffeeMachine 類別中找到與藍芽連線相關的資訊(String pin)。



搜尋pin成員找出相關調用方法,從中發現CoffeeMachineJsonSave類別的restore方法有調用setPin方法,並且進一步繼續分析。



我們知道setPin是設置pin成員的方法,因此可以搜尋setPin相關的調用。

除了restore方法裡有調用coffeeMachine.setPin,另外CoffeeMachineJsonSave類別中也發現有個setPin的方法。

我們持續分析此方法,可以找到pin的解密演算法(pin xor 3) – 1。



找到pin的加解密演算法後,我們繼續找出它的密文會存放到哪一個檔案。

透過搜尋CoffeeMachineJsonSave類別,可找關聯到一些方法。



分析m7506c方法會發現,setPin執行後的pin資訊將儲存至外部檔案。



分析coffeeMachine.buildMachineFileName,它會藉由調用getUniqueName和getMachineProductionDate來產出檔案名稱。

在getMachineProductionDate會獲取Data相關格式字串,而且最後會是json格式的檔案。



由題目提供的資料夾ch.toptronic.joe中找出內含JSON檔案的資料夾。

經分析可知檔案名稱為日期相關格式,於是探索2019082153280.json。



2019082153280.json檔案內含pin欄位,猜測即為藍芽密文。

透過運算下列解密演算法,最後方可解出真正的密碼,解密演算法為(pin xor 3) – 1。

(1 xor 3) - 1 = 1,(4 xor 3) - 1 = 6,(9 xor 3) - 1 = 9, (5 xor 3) - 1 = 5。