23.12.2016

»сследование беспроводной электрической лампочки

image

ѕосле по€влени€ статьи Reverse Engineering a Smart Light Bulb со мной св€залс€ Ё€ль, член сообщества TAMI, с предложением об исследовании недавно приобретенного устройства Xiaomi Yeelight WiFi Bulb.

јвтор: Uri Shaked

ѕосле по€влени€ статьи Reverse Engineering a Smart Light Bulb со мной св€залс€ Ё€ль, член сообщества TAMI, с предложением об исследовании недавно приобретенного устройства Xiaomi Yeelight WiFi Bulb.

јббревиатура TAMI расшифровываетс€ как Tel Aviv Makers International (ѕрофсоюз ћастеров из “ель-јвива). “ехническа€ площадка сообщества TAMI оснащена различным электронным оборудованием и компонентами, мастерской по дереву и металлу, станком „ѕ”, ткацкими станками и всеми другими инструментами, необходимыми дл€ работы. ѕомимо физического пространства у сообщества TAMI есть очень активна€ группа в Facebook, в которой состо€т более 4 тыс€ч израильских мастеров. «десь часто обсуждаютс€ вопросы, св€занные с электроникой, радиотехникой, производством, лабораторным оборудованием, машиностроением, сантехникой и т. д.

Ё€ль и € встретились в “ель-јвиве в офисе TAMI, где разработали план по исследованию внутреннего устройства беспроводной электрической лампочки. ѕосле короткой дискуссии мы решили начать с аппаратной части: разобрать лампочку и попытатьс€ считать прошивку, котора€ управл€ет железом, напр€мую с чипа.

ћы предполагали обнаружить цепь дл€ преобразовани€ напр€жени€, несколько светоизлучающих диодов и цепь управлени€. »значально мы не знали, как работать с цепью управлени€ и наде€лись опознать модель чипа, извлечь прошивку или даже попробовать отладку пр€мо во врем€ работы лампы.

Ќам удалось без особых усилий сн€ть пластиковую крышку, под которой оказалась плата со светоизлучающими диодами:


–исунок 1: —ветоизлучающие диоды электрической лампочки

 ак видно на рисунке выше, внутри наход€тс€ 7 высокомощных диодов, излучающих теплый белый свет, и небольша€ цепь, чуть выдвинута€ посередине. ƒл€ удалени€ цепи требовалось сломать оболочку лампочки, что мы сделали при помощи инструмента от компании Dremel:


–исунок 2: –азрезание оболочки

ѕосле удалени€ оболочки Ё€ль и € получили полный доступ ко всем внутренност€м лампочки: цепи питани€, управл€ющим цеп€м и цепи, св€занной со светоизлучающими диодами.


–исунок 3: ¬нутреннее устройство электрической лампочки

ѕерва€ наша встреча закончилась ужином в традиционном индийском ресторане 24 Rupee (который € гор€чо рекомендую, если вы когда-либо окажетесь в “ель-јвиве), где мы наметили врем€ следующей встречи с целью извлечени€ прошивки.

¬тора€ встреча проходила в FabLab Hulon, широко известном месте, где работают производители, в основном св€занные с цифровыми технологи€ми. «десь можно увидеть множество 3D принтеров, лазерных резаков, фрезерных станков и радиоэлектронную аппаратуру. Ќа площадке FabLab Hulon делают специальные проекты, в частности мастерскую цифровой живописи дл€ слепых и слабовид€щих детей.

÷елью нашей второй встречи было извлечение прошивки из электронной лампочки. ѕри помощи лупы удалось найти номера компонентов. »спользу€ поисковую систему, мы вы€снили модели:

  • 88MW300 Ч A Marvell Wi-Fi Microcontroller system-on-chip (SoC).
  • 25Q16BVSIG Ч 16M-Bit Serial Flash Memory Chip.


–исунок 4: CPU и флеш-пам€ть

Ѕыстро вы€снилось, что процессор на базе архитектуры ARM. —уществует множество утилит дл€ работы с данными процессорами, включа€ стандартный метод отладки.

ћы отпа€ли плату логики (бела€) от платы питани€ (зелена€) и подсоединили два пина к источнику питани€.   сожалению, когда после включени€ питани€ по€вилс€ дымок. —корее всего, где-то оказалась закорочена цепь.

¬ывод: отладка процессора по месту не представл€етс€ возможным.


–исунок 5: ѕрисоединение платы логики к внешнему источнику питани€

«абавный факт: 3 из 8 пинов на белой плате не были припа€ны, а поскольку данные концы помечены “R”, “B”, “G”, возможно, это означает, что логическа€ плата используетс€ дл€ лампочки RGBW.

ћикросхему флеш-пам€ти (котора€ содержит прошивку и, следовательно, код, управл€ющий питанием лампочки) демонтировать оказалось достаточно просто.

ћикросхема пам€ти представл€ет собой обычную серийную флеш.   тому же, у нас под рукой оказалась плата Raspberry Pi, не раз мен€ выручавша€, когда дело доходило соединени€ с нестандартным оборудованием. ¬ нашей ситуации мы смогли найти утилиту Ђflashromї, котора€ могла читать и писать на серийную флешку, подсоединенную к GPIO-пинам (General Purpose Input/Output; входные/выходные пины общего назначени€) платы Raspberry Pi.


–исунок 6: ‘леш-пам€ть, подсоединенна€ к плате Raspberry Pi

ѕосле установки утилиты Flashrom и подсоединени€ флеш-пам€ти к плате Raspberry Pi мы запустили следующую команду:
flashrom -p linux_spi:dev=/dev/spidev0.0 -read yeerom.bin

ѕосле минуты напр€женного ожидани€ прошивка была извлечена:


–исунок 7: ”спешное извлечение прошивки из флеш-пам€ти

Ќаконец-то мы получили нечто, с чем можно работать: файл с прошивкой размером 2 ћЅ. — этого момента начинаетс€ программна€ часть нашей истории.

ѕервое, что нужно сделать после извлечени€ прошивки, - обработать полученный файл при помощи утилиты strings, используемой дл€ извлечени€ всех строк. Ќапример, на рисунке ниже показаны все строки, содержащие последовательность символов http:


–исунок 8: ѕеречень строк из прошивки, содержащих фразу http

 ак видно на рисунке выше, в коде прошивки активно используетс€ протокол HTTP, и один из узлов дл€ общени€ - https://cloud.yeelight.com/open/wifi_device_stats. Ќам показалось, что найдено нечто интересное.

ƒругие полезные вещи, которые мы нашли при изучении строк, Ц SSL-сертификат, несколько структур JSON и перечень строк, напоминающий имена команд, отправл€емых с сервера (см. рисунок ниже).


–исунок 9: ѕеречень возможных команд, отправл€емых с сервера

Ќиже показан декодированный сертификат:


–исунок 10: SSL сертификат

 ажетс€, что разработчики всерьез позаботились о безопасности при взаимодействии с сервером cloud.yeelight.com при помощи сертификата, встроенного в прошивку. „тобы точно удостоверитьс€, что именно данна€ лампочка на другом конце провода, а не злоумышленник (эта атака называетс€ SSL public key pinning).

»сследу€ только лишь информацию, полученную при помощи утилиты strings, мы уже вы€снили некоторые интересные особенности протокола, используемого электрической лампочкой. —ледующий шаг Ц изучение кода, который отвечает за подачу энергии на лампочку.

ћы выгрузили содержимое файла при помощи утилиты hd (hex dump) и обнаружили несколько секций, включа€ ту, котора€ представл€ет собой файловую систему, индексирующую остальные секции из образа прошивки.


–исунок 11: –азличные секции прошивки

»з рисунка выше видно, что в образе прошивки содержитс€ две копии секций app и wifi и некоторые другие секции, одна из которых использует пользовательские данные, включающие, как вы€снилось позже, им€ пользовател€ и пароль дл€ WiFi в открытом виде, сконфигурированные нами перед началом исследовани€.

” нас не было необходимости декодировать структуру таблицы, поскольку там было большое количество нулевых байтов, раздел€ющих секции. ћы вы€снили, что прошивка (одна из двух копий) находитс€ по смещению 0xa000, и извлекли нужные данные при помощи команды dd:

dd if=yeerom.bin bs=$((0xa000)) skip=1 count=7 of=firmware.bin

«атем € наивно попыталс€ загрузить полученный .bin файл в IDA, попул€рную утилиту, используемую в реверс-инжиниринге. я наде€лс€ получить дополнительную информацию о формате прошивки. ¬озможно, данный формат имел отношение к модели Marvell (если взгл€нуть внутрь файла, то вначале можно увидеть 4 байта - MRVL).

«атем € решил вы€снить, как правильно загрузить прошивку. Ќачало файла выгл€дело как соответствующее некоторому формату. ¬озможно таблица секций и смещений.


–исунок 12: Ќачало прошивки

я решил поискать в интернете информацию о модели 88MW300 и о формате ЂMRVLї. ¬ итоге по этой теме нашлось очень мало, но мне удалось найти SDK с открытым исходным кодом от компании Marvell, цель которого Ц помочь разработчикам в создании IoT-устройств на базе их чипа и облака Amazon. ¬ SDL было несколько примеров, при помощи которых создавались прошивки. ƒл€ сборки использовалась утилита axf2firmware, также €вл€юща€с€ частью SDK. “аблица содержит записи размером 20 байт, кажда€ из которых имеет следующую структуру (DWORD Ц целое размером 4 байта в формате с пр€мым пор€дком байтов):

DWORD magic;†††† // Always 0x2
DWORD offset;††† // Offset into the file
DWORD size;††††† // Size of the section
DWORD address;†† // Memory address where this section will be loaded
DWORD unknown;†† // Probably some kind of checksum?

Ѕлагодар€ этой информации мне удалось считать таблицу секций, которые мне удалось разделить на несколько файлов при помощи следующей команды:

dd if=firmware.bin bs=200 skip=1 | dd bs=11920 count=1 of=s1.bin
dd if=firmware.bin bs=12120 skip=1 | dd bs=1 count=272180 of=s2.bin
dd if=firmware.bin bs=284300 skip=1 | dd bs=4104 count=1 of=s3.bin

¬ итоге у мен€ получилось три файла: s1.bin, s2.bin и s3.bin. Ќа базе информации из таблицы выше теперь € знаю, по каким адресам наход€тс€ данные файлы при загрузке прошивки. я решил объединить все файлы в такой формат, который потом можно загрузить в IDA. я выбрал ELF (или формат исполн€емых файлов в ќ— Linux), поскольку данный формат хорошо задокументирован.

¬начале € установил бинарные утилиты дл€ работы с ELF-файлами:

sudo apt-get install binutils-arm-none-eabi

«атем запустил следующую команду дл€ сборки всех секций в единый ELF-файл:

arm-none-eabi-objcopy -I binary -O elf32-littlearm -set-start 0x134 -adjust-vma 0x100000 -binary-architecture arm -rename-section .data=.text,contents,alloc,load,readonly,code -add-section .text2=s2.bin -set-section-flags .text2=contents,alloc,load,readonly,code -change-section-address .text2=0x1f002f58 -add-section .text3=section3.bin -set-section-flags .text3=contents,alloc,load,readonly,code -change-section-address .text3=0x20000000 s1.bin firmware.elf

Ёта команда довольно длинна€ и требует несколько часов на преобразование всех битов к правильному формату. Ќужно указать 3 файла, содержащие секции, адрес, куда требуетс€ загрузить эти секции, флаги дл€ пометки секций как секции кода с атрибутом Ђтолько чтениеї (так, чтобы была возможность дизассемблировани€ / декомпил€ции) и инструкцию дл€ установки базового адреса 0x100000 и начала выполнени€ кода по смещению 0x134.

»тоговый файл с именем firmware.elf € смог загрузить IDA, но, к сожалению, в увиденном коде было не очень много смысла.

IDA, как и предполагалось, интерпретировал файл как машинный ARM-код, однако вы€снилось, что ARM-процессоры имеют специальный рабочий режим под названием ЂThumbї. ¬ режиме Thumb инструкции закодированы в 2 байта (16 бит) вместо 4 байт (32 бит).

—ие недоразумение можно легко исправить, переместившись в самое начало файла, найд€ строку CODE32, нажав Alt+G и изменив значение на 0x1 (все эти секреты € вы€снил через Google).


–исунок 13: »зменение значени€ в строке CODE32

¬ыполнив вышеуказанную операцию € получил огромное количество ассемблерного ARM-кода. ќднако даже несмотр€ на то, что IDA может автоматически опознавать функции, сложно вы€снить назначение этих функций. «десь есть интересный трюк Ц во многих случа€х в коде прошивки встречаютс€ отладочные метки, используемые при разработке, и эти метки очень полезны при вы€снении логики работы кода. ѕосле некоторых исследований мне удалось найти функцию printf, при помощи которой € нашел отладочные комментарии, использу€ клавишу “X”, отображающую все участки кода, где используетс€ функци€ printf:


–исунок 14: ¬се участки кода со ссылкой на функцию printf()

Ќа этом мое участие в данном проекте закончилось. Ќадеюсь, что информаци€, представленна€ в этой статье, окажетс€ полезной тем, кто часто имеет дело с оборудованием и занимаетс€ исследованием прошивок.

или введите им€

CAPTCHA
шлитл
04-01-2017 22:56:24
сиччрр
0 |
visa Kiev
04-01-2017 23:01:33
ƒоброго всем времени суток занимаюсь € наполнением проэктов таких как http://visa-ua.kiev.ua визовый , и по этому хотел бы повзаимствовать вашу статью , ссыл€сь на вас.
0 |