Điện thoại Trung quốc, liệu có thực sự rẻ ????
Mở đầu
Sau khi đọc bài của anh superkhung về phân tích lỗ hổng bảo mật của camera (xem bài viết tại đây), mình cảm thấy rất phấn khích và cũng muốn chia sẻ 1 chút kinh nghiệm cho các bạn đi sau về cách phân tích và tiếp cận với các thiết bị nhúng, hi vọng cộng đồng làm embedded security trong nước sẽ lớn mạnh dần lên trước cơn bão IoT đang vần vũ ngoài kia. Loạt bài này sẽ gồm 2 phần, phần 1 sẽ để cập đến cách tiếp cận 1 thiết bị nhúng lấy firmware, giải mã các phân vùng encoded/encrypted, map các segment trên IDA để phân tích, phần 2 sẽ nói về reverse và 1 số kết quả thu được sau khi reverse (có nhiều vấn đề mà trước đây rất nhiều người trong đó có cả mình đổ lỗi do nhà mạng nhưng thực tế lại thật bất ngờ).
Bài phân tích này mình thực hiện cũng lâu rồi, tại thời điểm đó xảy ra nhiều việc để mình rất thấm cái câu “đời chẳng cho không ai cái gì” lại thêm thằng bạn “thân” cho mượn con Iphone 6 “Tung của”, trí tò mò khiến mình quyết định phẫu thuật thử xem anh bạn “hàng xóm phương bắc” liệu có “cho không” anh bạn phía Nam được cái gì không mà sao lại bán rẻ đến vậy.
P/S: các cách tiếp cận mà mình đưa ra không phải là duy nhất, vì vậy rất welcome các bạn cùng vào bàn luận về các kỹ thuật advance khác. >:D<
Phần cứng
Quan sát từ bên ngoài có vẻ không khác hàng thật mấy từ cái camera lồi, switch gạt im lặng, dải anten, khe sim … . Còn phần cứng bên bao gồm CPU: Mediatek SOC MT6250A, Flash 16Mb 25LQ128YIG, Radio: HS8269U …. Khi bật nguồn, màn hình có vẻ chất lượng không được tốt, các giao diện bên trong cũng y nguyên như iphone chính hãng (Message, Maps, ibooks, AppStore …), tất nhiên các app này đều fake và chẳng liên quan gì đến Apple cả. Vào thử 1 số app thấy khá giống app trên các điện thoại feature phone hồi xưa. Sau 1 hồi trải nghiệm, kết luận đầu tiên ngoài cái màn hình to có cảm ứng, còn lại cũng chỉ ngang con Nokia chèn bánh xe của mình, đúng là tiền nào của nấy, haizzz.
Đọc firmware
Sau khi phân tích phần cứng có 2 cách để đọc firmware:
- Board sử dụng IC flash ngoài ta có thể bóc flash ra và gắn vào mạch đọc bên ngoài.
- Tìm cổng debug (JTAG/SWD, ICSP, UART, USB, SPI …) để đọc ngược firmware ra.
Ở đây mình sử dụng cách 2 trước để không phải can thiệp phần cứng đến mạch, trong trường hợp giải pháp này không thành công sẽ suy nghĩ đến cách 1.
Dò một lượt trong mạch không thấy chân JTAG, UART chỉ thấy cổng USB. Check trong datasheet của chip MT6250A thấy chip có hộ trợ BSL (Bootstrap Loader) qua cổng USB (mình hay tìm datasheet trên baidu, google.ru). Google thêm 1 chút thì thấy ít nhất có 2 tool có thể đọc được firmware ra: Flashtool, GPGDragon. Các bạn có thể sử dụng bất kì tool nào trong 2 tool đều được.
Phân tích firmware
Sau khi đọc lên ta sẽ có 1 file binary 16M (bằng size với flash), sử dụng binwalk để xem trong binary này có những gì.
Do các các phân vùng bao gồm cả các file raw nên sau khi filter lại ta sẽ có các phân vùng như sau (sau segment VIVA là vùng FAT32, vùng này sẽ được mount lên sau khi thiết bị chạy):
Dựa vào các thông tin trên mình cắt nhỏ firmware và load thử lên IDA:
Nhìn như trên hình thì IDA nhận diện được rất ít hàm.Khả năng cao là firmware đã bị mã hóa hoặc encode rồi.
Theo cách tiếp cận thông thường, muốn đi ngược được thì bạn ít nhất phải nắm rất rõ làm thế nào để đi xuôi, đặc biệt là khi làm với các thiết bị nhúng nền tảng cực kì đa dạng và rất đặc thù. Do đó, hãy tìm cách đi xuôi trước, tìm hiểu rõ các bước làm sao để build được helloworld, làm sao để đẩy helloworld xuống (tất nhiên mình khuyến cáo các bạn không nên đẩy xuống ngày khi vẫn còn chưa hiểu rõ về con chip, rất có thể bạn sẽ làm brick nó và hết đồ chơi luôn). Ngoài ra file helloworld bạn build được sẽ rất có ích cho việc reverse sau này.
Cái đầu tiên mình nghĩ đến là tìm xem có tải được sourcecode và tutorial ở đâu đó hướng dẫn dev trên con này không, vẫn như thường lệ cái gì không ở đâu có thì hãy tìm trên baidu, không phải chém nhưng cộng đồng tàu khựa rất mạnh và thường cũng hay leak những cái rất hay ho. Dựa vào 1 vài pattern trong file binary vừa đọc được, mình tìm được 1 bộ source trên baidu, tải về và giải nén ra được 1 thư mục khoảng 7GB.
Tiến hành thiết lập môi trường và build thử, do logbuild khá dài nên mình log tạm ra 1 file để tiện đọc lại. thời gian build khá lâu mất khoảng hơn 1 tiếng. Trong quá trình chờ build lên google tìm hiểu thêm 1 chút về quá trình boot của con MTK này. Quá trình boot chia thành 4 tầng:
- ROM code kiểm tra signature và load Bootloader
- Bootloader kiểm tra signature và load External Bootloader
- External Bootloader kiểm tra signature và load ROM_GHF (Primary_MAUI) -> phần này có thể coi như kernel, bao gồm các driver và cả scheduler
- ROM_GHF sử dụng hardware giải nén VIVA và load VIVA -> phần này tương đương user space, bao gồm toàn bộ các ứng dụng chạy bên trên (UI, aplication, …), đây là phần chứa nhiều customize code nhất. Do phần này bị nén nên đây là lý do vì sao khi load lên IDA lại không nhận diện được các hàm.
Sau khi buid xong, trace Trong logbuild cũng xác định được phần VIVA được nén bởi script aliceProcess.pm
Script gọi đến ứng dụng ALICE.exe
Việc tiếp theo chúng ta cần phải giải nén phân vùng code này, có 2 cách để thực hiện tiếp:
- Dịch ngược file Alice.exe kia xem nó sử dụng giải thuật nén gì và làm ngược lại.
- Modify lại ROM_GHF code để sau khi nó giải nén xong ta sẽ dump toàn bộ và lưu vào thẻ nhớ.
Dịch ngược window file không phải là thế mạnh của mình nên mình lại chọn cách 2 (thực ra mình cũng thử sơ qua cả cách 1 bằng cách google 1 vài chuẩn nén thông dụng rồi dùng 7zip uncompress nhưng không thành công). Tuy nhiên vấn đề ở chỗ các tầng boot đều kiểm tra signature. Check lại trong logbuild phát hiện đoạn signature được ký bởi script gfh_process.pl.
Với key file.
Okie, với 1 sự may mắn không hề nhỏ là con iphone này lại sử dụng luôn chữ ký mặc định giống trong source leak, mọi chuyện lại trở nên đơn giản.
Sử dụng keypatch (http://www.keystone-engine.org/keypatch/) tiến hành sửa bỏ phần check signature của External Bootloader để không check signature của ROM_GHF code nữa. Sau đó sign lại External Bootloader, từ đây yên tâm thoải mái sửa ROM_GHF mà không sợ bị reject nữa.
Sau khi sửa bootloader, chúng ta sẽ tiếp tục sửa lại code phần ROM_GHF, do phần FAT32 trên flash chỉ còn lại dung lượng rất nhỏ (~13kb) không đủ chứa VIVA code sau khi giải nén, do đó mình lựa chọn đẩy thẳng ra thẻ nhớ, để đảm bảo thẻ nhớ khởi tạo xong, mình chọn 1 action sẽ được gọi đến sau khi hệ thống đã khởi động (hàm LCD_Physical_Interface_Lock), hàm này được gọi khi bạn bấm nút tắt màn hình.
Sử dụng chính tool đọc firmware load 2 binary vừa sửa xuống (với flash_tool thì sửa lại file scatter, comment các phân vùng còn lại, còn với GPGDragon thì sử dụng 010 editer replace 2 phân vùng vừa sửa vào file 16M sau đó ghi cả 16M xuống). sau đó khởi động lại điện thoại, bấm tắt màn hình và đợi một lúc (do chúng ta đã can thiệp vào driver nên sẽ phải chờ 1 lúc điện thoại mới tắt được màn hình), sau khi màn hình tắt, giữ nút nguồn để tắt hẳn điện thoại, tháo thẻ nhớ và tận hưởng thành quả:
IDA đã load được hầu hết các hàm ở vùng VIVA (trước khi giải nén có magic header là “ALICE”, sau khi giải nén xong sẽ có header là CAKE).
Okie như vậy toàn bộ firmware đã được giải nén, hẹn gặp lại các bạn ở part 2
P/S: Bonus cái ảnh file raw (tạm gọi là helloworld đi) sau khi mình build lại, các bạn có thể sử dụng file helloworld này để nắm được cấu trúc các segment cơ bản của chip, từ đó map lại vào IDA hoặc load các segment chạy giả lập.