Published on

熱點分享穩流機逆向分析

這兩天,某個名為「分享穩流機」的募資產品被 揭露 其運作原理,引發了一些討論

剛看到時,覺得這產品也太爛,號稱台灣製造、多國專利技術竟然是 ESP8266 + Ping www.baidu.com
且手機熱點的 SSID 及密碼要在購買時提供給廠商燒進去,甚至還號稱可以減少個資外洩風險,忍不住也吐槽了幾句 😂

原作者僅是發現 console 輸出了 Ping www.baidu.com,沒有實際錄封包驗證。這讓我有點好奇,這會不會又是個貼牌產品? 這或許只是原廠的 log,實際上有修改成其他 domain

身為一個資安研究員,只靠部分 log 來推斷產品行為有點過於草率,應該要實際分析程式碼才能下定論, 於是我透過台北游先生取得了韌體,決定逆向分析一下,並看看是否存在其他資安問題

Arduino on ESP8266 逆向工程

從 ROM 的字串能看出這個程式是使用 Arduino core for ESP8266 開發,且用了一個相對舊的版本 2.5.0 (Feb 6, 2019)

$ strings fw-backup-4M.bin
...
C:\Users\penny\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\2.5.0\cores\esp8266\core_esp8266_main.cpp
...

ROM 中包含兩個 ESP Image,位於 offset 0 的是 eboot:

$ esptool image-info fw-backup-4M.bin
esptool v5.0.0
Image size: 4194304 bytes
Detected image type: ESP8266

ESP8266 Image Header
====================
Image version: 1
Entry point: 0x4010f29c
Segments: 1
Flash size: 4MB
Flash freq: 40m
Flash mode: DIO

Segments Information
====================
Segment   Length   Load addr   File offs  Memory types
-------  -------  ----------  ----------  ------------
      0  0x00568  0x4010f000  0x00000008

ESP8266 Image Footer
====================
Checksum: 0x2d (valid)

從 eboot 可以得知實際執行的 APP 位於 offset 0x1000:

$ esptool image-info getnew.bin
esptool v5.0.0
Image size: 4190208 bytes
Detected image type: ESP8266
Warning: Suspicious segment 0x40201010, length 239700

ESP8266 Image Header
====================
Image version: 1
Entry point: 0x401000e0
Segments: 4
Flash size: 4MB
Flash freq: 40m
Flash mode: DIO

Segments Information
====================
Segment   Length   Load addr   File offs  Memory types
-------  -------  ----------  ----------  ------------
      0  0x3a854  0x40201010  0x00000008  IROM
      1  0x06908  0x40100000  0x0003a864  IRAM
      2  0x0051c  0x3ffe8000  0x00041174  DRAM
      3  0x00348  0x3ffe8520  0x00041698  DRAM

ESP8266 Image Footer
====================
Checksum: 0xde (valid)

嘗試逆向時,發現 Ghidra 沒有內建 ESP8266 的 Loader,實在懶得在半夜研究 Ghidra 怎麼建 section,於是改用 IDA Pro
畢竟花時間設定 Ghidra 還不如直接讀組語比較快

最新版本的 IDA Pro 已經內建 Xtensa 的 disassembler 跟 ESP8266 Loader:

透過字串可以快速定位到相關邏輯,由於是使用 Arduino 開發,沒有 Symbol 的情況下不是很好逆向:

一個分析的小技巧是先透過 Arduino IDE 寫一隻功能類似的 APP,使用 Export Compiled Binary 功能得到有 Symbol 的 ELF

Load 進 IDA Pro 之後產生 SIG file:

接著再將 SIG Load 進目標 APP 的 IDA Database,就能輕鬆的逆向了:

後續對照了一下,ping 的實做是使用了 https://github.com/dancol90/ESP8266Ping

而整個程式中最令人在意的 ping www.baidu.com 邏輯如下:

程式透過 ESP8266WiFi 連上手機熱點後,會持續執行 ping 以維持連線,而目標網域會根據 flag 變數在 www.google.comwww.baidu.com 之間切換

而這個 flag 變數在 ROM 中預設是 1,也就是應該會 ping www.google.com,但為什麼 log 中是 Ping www.baidu.com 呢?

仔細分析後發現,在每次執行完 ping 之後,會執行 flag ^= 1:
也就是其實會輪流 Ping www.google.comwww.baidu.com

這或許是開發者考慮到產品可能會被帶到中國或其他無法存取 Google 的國家使用
可以看出開發者其實是有考慮到產品通用性的!

整個程式除了會 ping www.baidu.com 以外,並沒有做其他奇怪的事情,可喜可賀🎉

一些想法

這個產品再次提醒了我們,不要根據片面資訊就斷定某些事實,身為資安研究員更應該追求實證
這也是我喜歡逆向工程的原因,眼見為憑。

雖然賣 NT$690 (原價 NT$990) 被大家戲稱為智商稅,但從創新來看能真的做成產品、有人願意買單,賣個幾十萬也是一種本事
問題大概就是包裝得不夠完整,熱點的帳號密碼竟然是寫死在 ROM 中,以及最莫名其妙的 Ping www.baidu.com
算上廠商的開模、包裝、運輸、平台抽成、人工燒韌體成本😂,我想賺到手的可能也不多,或許之後可以考慮做成充電頭

同樣身為新創公司共同創辦人,比起無止盡的嘲笑開發者及廠商,我更期待台灣未來能成為一個鼓勵創新的環境