Оригиналът е на Benjamen Lim Даниел Десподов 15:31 | 24.07.2024

...
Оригиналът е на Benjamen Lim Даниел Десподов 15:31 | 24.07.2024
Коментари Харесай

Ето как изглежда реверсивното инженерство на един по-специален смарт часовник

Оригиналът е на Benjamen Lim

Даниел Десподов 15:31 | 24.07.2024 1 Сподели

Най-четени

ТелефониСветослав Димитров - 13:46 | 23.07.2024

Експерти обясниха за какво е неразрешено да държите смарт телефона върху мека мебел, до момента в който се зарежда

АвтомобилиЕмил Василев - 11:39 | 23.07.2024

Основателят на Xiaomi призна, че компанията е била „ принудена “ да създава електрически автомобили поради опасността от американски наказания

АвтомобилиЕмил Василев - 18:13 | 23.07.2024

Eлектромобилите са беззащитни против „ нова “ офанзива благодарение на технология от 20-те години на предишния век

Даниел Десподовhttps://www.kaldata.com/Новинар. Увличам се от модерни технологии, осведомителна сигурност, спорт, просвета и изкуствен интелект.

Неотдавна получих партида смарт часовници с опция за геолокация, които след тестване бяха изпратени в архива. Бях претрупан със задачата да намеря приложение на тези устройства, с което стартира историята на реверсивното им инженерство, за която ще ви опиша в тази публикация.

Ще стартира с обзор на техните външни особености и схеми, след което ще ви опиша в детайли за това по какъв начин препрограмирах тези часовници, като даже им трансформирах фърмуера, с цел да могат да извършват и други задания.

Първи обзор

В общоприетия си тип часовникът няма никакви особености и е съпроводен единствено от една страница с указания по какъв начин да се зарежда и употребява. Всеки комплект се състоеше от часовник и зарядно устройство. Нямаше README, уеб страници или портали за разработчици. Имаше единствено един капацитивен датчик на повърхността на часовника, който включваше екран, на който потребителят можеше да види времето, да следи сърдечния темп и да получи някаква информация за конфигурация.

Екранът за премахване на неточности даде потребна информация за идентифициране на часовника. Забелязах, че IP адресът, показан на екрана, е еднакъв за всички часовници от един и същи модел. Първоначално помислих, че това е IP адресът на сървъра, с който часовникът комуникира.

Часовникът е със отбрана от клас IP67. Това значи, че е водоустойчив, а с моите лимитирани принадлежности нямаше по какъв начин да получа достъп до вътрешността му, без да го повредя. В духа на откривателството взех решение да опитам да отворя часовника с клещи. Не беше елементарно, само че след час старателно чоплене съумях да „ смъква “ горния похлупак на корпуса.

Отвореното устройство.

Вътрешността

Вътре имаше печатна платка с LiPo батерия. В корпуса бяха вградени и две антени, свързани към u.FL конекторите на платката.

Реверсивното инженерство на платката

Часовникът се ръководи от чипа nRF52832 с поддръжката на Bluetooth и съдържа още два съществени чипа: Wi-Fi модула ESP8285 и клетъчния чип на SIMCOM. Първоначално бях комплициран от наличието на Wi-Fi микроконтролера, защото нищо не подсказваше, че часовникът има Wi-Fi поддръжка. Но по-късно разбрах, че той се употребява за триангулация в градските региони.

Тъй като точността на GPS в градските региони е много слаба, приблизителното местонахождение на часовника може да се дефинира благодарение на Wi-Fi хотспотовете, като се употребяват данните от клетъчната мрежа плюс GPS данните. Съдейки по схемата, nRF52832 се свързва с чипа SIMCOM посредством UART и изпраща команди за връзка с мобилната мрежа. Знаейки това, се концентрирах върху намирането на UART или пиновете за програмиране на чипа nRF52832, защото той беше главният и това са връзките, които нормално се употребяват за връзка с микроконтролера.

На платката има много щифтове, които принадлежат на UART и са предопределени за програмиране. Една от забавните пътечки минаваше от двата позлатени щифта от дясната страна на платката към SWDIO и SWCLK на чипа nRF52832, както и към линия, която чаках да се употребява за зареждане на часовника. SWDIO и SWCLK са изводите JTAG за програмиране на чипа. От долната страна на предния похлупак на часовника също има пружинни щифтове, които се свързват накъсо с подложките SWDIO и SWCLK, когато часовникът е затворен.

А тези контакти бяха свързани и с медните щифтове на лицевата страна на часовника, осигурявайки външен достъп до опцията за програмиране. Външният достъп до програмирането е малко чудноват, защото нормално фърмуерът на устройството се слага на платката от завода и след това се актуализира посредством Wi-Fi или Bluetooth. Обикновено не би имало потребност от достъп до изхода за програмиране. Въпреки това тази функционалност се оказа извънредно потребна по-късно, защото подсигурява, че не е належащо да разтварям останалата част от часовника, с цел да получа достъп до фърмуера. Необходимостта от отваряне на всяко устройство щеше да обезсмисли задачата ми да трансформира функционалността му, защото щеше да е доста мъчно да сглобя часовника по-късно.

По-интересното беше, че пружинните контакти, свързани към SWCLK и SWDIO на зарядното устройство, бяха свързани към D+ и D- изводите на microUSB врата, които нормално се употребяват за транспорт на данни. Това означаваше, че няма да ми се постанова да сътворявам специфична платформа за препрограмиране на часовника – просто би трябвало да разкача microUSB кабела, с цел да свържа линията за програмиране към всеки часовник. Хубав колорит.

Контактите
А ето какво има в кабела

След като свързах часовника с моя JLink дебъгер посредством врата за зареждане, първото нещо, което забелязах, беше, че той основава опция за дебъгване благодарение на приложението JLink RTT Viewer. Чудесно!!! И въпреки че опцията да следя изхода за премахване на неточности беше доста потребна, заради неналичието на вход, конфигуриран за RTT модула, нямаше метод да се изпращат команди към часовника. Въпреки това данните от изхода потвърдиха догатките ми за вътрешното окабеляване на часовника.

UART-взаимодействието на чипа nRF52832 с модула SIMCOM

След няколко пробни опита за изпращане на команди посредством JLink взех решение да прегледам фърмуера. След като Jlink беше обвързван, съумях да направя дъмп благодарение на командата nrfjprog, съпроводена от флаговете –readcode и –readram:

Дъмпът на истинския фърмуер

Оказа се, че фърмуерът не е предпазен от четене или писане, тъй че съумях да получа копие на цялото нещо. В този миг имах две благоприятни условия за преконфигуриране на функционалността на часовника:

Препрограмиране на устройството с напълно нов фърмуер. Да трансформира IP адреса и врата, тъй че часовникът да изпраща данни към сървър, който аз управлявам.

Тъй като препрограмирането на часовника е обвързвано с доста дълъг развой, взех решение да избера пътя на пача.

Преминаваме към Ghidra

За да дефинира подобаващите функционалности и променливи в Ghidra, трябваше да направя дамп на RAM и флаш паметта. Тъй като това е гол код от устройство Cortex M0+, трябваше да декомпилирам фърмуера в ARM формат с непосредствено нареждане на байтовете, след което Ghidra съумя да генерира получетим псевдокод.

На този стадий трябваше да открия IP адреса, който съгласно мен беше заложен някъде в кода. Часовникът изпраща данни по клетъчната връзка към сървър, чийто адрес е показан на екрана за премахване на неточности. Ако можех да осъвременявам IP адреса, можех също по този начин да пренасоча данните, изпращани от часовника, към моя си надзорен сървър.

Първите ми опити да намеря низа на IP адреса, който виждах на екрана на часовника, обаче бяха несполучливи.

Следващият ми опит беше да намеря най-близкия низ от изхода за премахване на неточности, който виждах в RTT Viewer. Оказа се, че това е AT+CIPOPEN=0, представляваща серийна команда, изпратена от nRF52832 към модула SIMCOM, която го инструктира да отвори връзка към IP адреса, посочен като мотив. След като открих този ред, употребявайки IP адреса на сървъра, с който комуникира часовникът, можах да намеря мястото в паметта, където е записан този адрес.

Търсенето на низа за формата беше по-успешно. Намереното съвпадане съдържаше модел на низ, сходен на модела за IP адрес. Той се извиква във функционалност, съмнително сходна на sprintf.

Функцията sprintf се базира на масив, съхраняван в DAT_20000887, който, в случай че се съди по картата на паметта на чипа nRF52832 по-долу, подхожда на региона за данни в RAM.

Отивайки в региона за разполагане на RAM, открих, че в нея са записани две функционалности. Интересна беше единствено първата част на тази област, тъй като там се намираше IP адресът. Втората част дава опция да се правят следващи актуализации на този адрес по въздуха – по безжичен път.

Преминавайки към първата функционалност, открих тези твърдо кодирани шестнадесетични променливи, записани в масив в границите на основната функционалност. Тези променливи отговаряха навръх IP адреса, който видях на екрана за премахване на неточности на часовника.

Тези области от паметта представляваха шест байта данни за фърмуера, които трябваше да трансформира, с цел да сменя IP адреса и врата.

Трябва да бъдат преглашнати общо 6 байта, 4 за IP и 2 за врата.

Тук имаше дребна засечка: номерът на врата беше цената 38899, записана като два байта – 0x0c и 0x68. Компилираната стратегия използваше инструкцията movn, която прилагаше логическата интервенция NOT към твърдо кодираните стойности, преди те да бъдат сложени в оперативната памет. Чисто механически е допустимо тази директива да бъде изменена, като се отстрани интервенцията NOT. Но аз се пробвах да минимизирам броя на байтовете, които би трябвало да бъдат изменени, по тази причина прибавих спомагателна интервенция при преобразуването на номера на врата в подобаващите шестнадесетични стойности.

Препрограмирането на смарт часовника

Въз основа на това знание съумях да напиша елементарен скрипт за смяна на фърмуера за всеки IP адрес и порт. Този скрипт също по този начин актуализира контролната сума на всеки изменен ред, тъй че фърмуерът да дава отговор на упования формат. След като завърших с нанасянето на пачовете, трансферирах фърмуера в часовника благодарение на програмата Programmer на Nordic Semiconductor.

Скриптът за поправяне на фърмуера
Зареждането на фърмуера

И се веселя да оповестя, че всичко мина съвършено! Като актуализирах фърмуера, с цел да комуникира с моя сървър, съумях да получа данните от часовника и да ги обработя.

Префлашнатият фърмуер

С това завършва етапа на реверсивното инженерство. Научих доста по време на процеса, защото имах малко опит в реверсивното препрограмиране на ARM-базирани устройства. Въпреки това имах добра визия за това по какъв начин бих проектирал това устройство и какви благоприятни условия има то, което оказа помощ доста да се стесни обсегът на търсенето.

Интересна детайлност беше методът, по който интерфейсът за програмиране беше обвързван към USB врата – нещо, което не съм виждал в други сходни часовници. Липсата на каквато и да е отбрана за четене/запис на фърмуера също е нетипична, защото другите IoT устройства нормално имат такава отбрана, когато се пускат в произвеждане, с цел да се предотврати вероятно клониране.

Както и да е, процесът беше доста забавен, а опцията да се намерят нови приложения за електроника, която другояче би била оставена да събира прахуляк в склада или изхвърлена, придаде на плана спомагателен смисъл.

В мненията към публикацията обръщат внимание, че това наподобява е някакъв специфичен смарт часовник за пандизчии. Разбира се, в оповестената нагоре информация някои неща са изпуснати, а някои други са умишлено изменени. Но въпреки всичко информацията е задоволителна някой да се замисли по какъв начин би могъл да накара този часовник да изпраща подправени координати. Но това са единствено догатки.

Източник: kaldata.com


СПОДЕЛИ СТАТИЯТА


КОМЕНТАРИ
НАПИШИ КОМЕНТАР