Практический реверс-инжиниринг. Часть 1 – Поиск отладочных портов

Практический реверс-инжиниринг. Часть 1 – Поиск отладочных портов

В этой серии статей будет описан процесс реверс-инжиниринга роутера Huawei HG533.

Автор: Juan Carlos Jiménez

В этой серии статей будет описан процесс реверс-инжиниринга роутера Huawei HG533.


Рисунок 1: Внешний вид роутера Huawei HG533

Вначале мы попробуем найти последовательные порты, оставленные инженерами, которые проектировали устройство, для отладки и других целей, связанных с технической поддержкой.

Несмотря на то, что процесс поиска будет описываться на примере роутера, те же самые методы можно применить и для других, повсеместно используемых, устройств, начиная от принтеров и заканчивая IP-камерами. Если аппарат обладает более менее приличным функционалом, то, скорее всего, работает на базе Linux и имеет скрытые отладочные порты, наподобие тех, которые мы будем искать.

Поиск последовательного порта

Большинство UART-портов, найденных мной в коммерческих продуктах, имеют от 4 до 6 пинов, которые обычно идеально выровнены и иногда помечены на плате. Данные порты не предназначены для использования конечными пользователями и не имеют подсоединенных выводов или коннекторов.

После осмотра платы мое внимание привлекло два набора площадок, которые не использовались до того момента, пока я не припаял к ним пины (см. рисунок ниже):


Рисунок 2: Плата роутера

По-видимому, в роутере имеются 2 последовательных порта, используемых для взаимодействия с двумя различными интегральными микросхемами. Отследив дорожки, можно понять, какой из портов соединен с главной микросхемой. Скорее всего, именно здесь мы найдем наиболее интересную информацию.

В любом случае мы просто пытаемся подключиться к обоим портам для того, чтобы выяснить, что «предлагает» нам каждый.

Идентификация ненужных пинов

На данный момент мы нашли два ряда пинов, которые, на первый взгляд, могут быть UART портами. Вначале нужно определить, присутствуют ли ненужные пины. Существует один простой трюк, позволяющий решить данную задачу. Мы просто подсвечиваем заднюю сторону плату и смотрим, какие слои контактируют с бугорками из припоя.


Рисунок 3: Подсвеченная плата

По результатам осмотра подсвеченной платы сделаем следующие выводы относительно соединения площадок из припоя:

  • Первый пин подсоединен к чему-то (можно увидеть путь от разрыва на уровне 2 часов).
  • Второй пин не подсоединен.
  • Третий пин подсоединен к одному или нескольким слоям. Обычно это свидетельствует о том, что разъем не используется. На чертеже пин может быть заземлен или соединен платой Vcc, но не обязательно.
  • Четвертый пин соединен по всем сторонам. Скорее всего, заземлен. Маловероятно, что разъем с данными на отладочном порту соединен с 4 различными дорожками.
  • Пятый пин подсоединен к чему-то.

Пайка пинов для более легкого доступа

На рисунке выше видны оба последовательных порта.

Площадки в этих портах сквозные и заполнены припоем с высокой температурой плавления, с которым очень тяжело работать

В случае со вторым последовательным портом я решил просверлить дырки (в качестве сверла использовался кусок иголки). Далее просовываем пины и припаиваем с обратной стороны платы.


Рисунок 4: Припаянные пины

Поиск выходного пина

На данный момент у нас есть два коннектора, на каждом из которых по 3 «полезных» пина. Мы пока что не определили работоспособные порты или последовательный протокол, используемый устройством, но количество и расположение пинов говорит о том, что, скорее всего, мы имеем дело с UART-портами.

Коротко рассмотрим протокол UART. В спецификации описаны 6 типа пинов:

  • Tx [Передающий пин. Соединяется с нашим пином с типом Rx]
  • Rx [Принимающий пин. Соединяется с нашим пином с типом Tx]
  • GND [Земля. Соединяется с нашим пином с типом GND]
  • Vcc [Питание. Обычно 3.3В или 5В. НЕ ПОДСОЕДИНЕН]
  • CTS [Обычно не используется]
  • DTR [Обычно не используется]

Мы также знаем, что согласно стандарту по умолчанию на пинах Tx и Rx напряжение повышается (устанавливается в 1В). Передатчик линии (Tx) отвечает за повышение напряжения, и если передатчик не будет подсоединен, напряжение линии будет плавать.

Подведем промежуточные итоги:

  1.  У каждого порта есть три рабочих пина, которые к чему-то подсоединены. Эти пины должны быть следующими: Tx, Rx и GND (земля).
  2. Один пин очень похож на землю, поскольку подсоединен к плате по всем четырем сторонам.
  3. На пине Tx будет повышаться напряжение и передаваться информация.
  4. На пине Rx напряжение будет плавать до тех пор, пока мы не подсоединим другой конец к линии.

Вышеприведенной информации вполне достаточно для того, чтобы наладить мост между портами UART и USB, но если подсоединять пины случайно вы не поймете механики процесса.

Продолжаем углубляться.

Мультиметра или логического анализатора вполне достаточно для того, чтобы определить типы пинов, но если вы хотите понять, что конкретно происходит на каждом разъеме, нет ничего лучше хорошего осциллографа:


Рисунок 5: Осциллограмма одного из пинов

После проверки пинов при помощи осциллографа приходим к следующим выводам:

  1. Заземленный пин (GND) найден. На выходе стабильные 0В.
  2. Пин Tx найден. Наблюдаем, как устройство передает информацию.
  3. На одном из пинов напряжение колеблется в районе 0В. Скорее всего, это Rx пин, на котором колеблется напряжение, поскольку мы еще не подсоединили другой конец.

Теперь мы знаем тип каждого пина, но для того, чтобы «пообщаться» с последовательным портом, необходимо выяснить скорость передачи данных в бодах (baudrate). Эту задачу можно решить при помощи логического анализатора. Если у вас нет данного устройства, можете пойти другим путем и подбирать скорость передачи из списка наиболее распространенных скоростей до тех пор, пока не начнете получать читаемый текст от последовательного порта.

На рисунке ниже показана информация, полученная от логического анализатора, на котором включена функция анализа протокола. Я игрался с различными скоростями до тех пор, пока не получил читаемый текст (\n\r\n\rU-Boot 1.1.3 (Aug...).


Рисунок 6: Анализ протокола при помощи логического анализатора

Как только найден выходной пин и подобрана скорость передачи, мы готовы к коммуникации с устройством:


Рисунок 7: Схема распиновки последовательных портов

Подсоединение к последовательным портам

Теперь когда мы получились всю необходимую информацию относительно аппаратной части, настало время «пообщаться» с устройством. Подсоединяем любой мост типа UART-USB и начинаем анализ. На рисунке ниже показана моя собственная аппаратная сборка, предназначенная для одновременного общения с обоими портами и мониторинга одного из портов при помощи осциллографа:


Рисунок 8: Вариант аппаратной сборки для подключения к последовательным портам

Когда мы откроем последовательный терминал на компьютере во время коммуникации с устройством, то увидим, как главный UART порт начинает выдавать полезную информацию. Ниже показаны команды, используемые мной для подсоединения к каждому порту, а также первые строки во время процесса загрузки:


Рисунок 9: Программная часть взаимодействия с последовательными портами

Please choose operation:
   3: Boot system code via Flash (default).
   4: Entr boot command line interface.
0

Словосочетание ‘Command line interface’ свидетельствует о том, что мы нашли способ попасть внутрь системы. После выбора пункта 4 мы попадаем в командную строку, предназначенную для взаимодействия с загрузчиком устройства.

Кроме того, если мы выберем пункт 3, подождем, когда закончится проверка контрольной суммы и нажмем enter, то получим сообщение Welcome to ATP Cli и строку для ввода логина. Если на устройстве изменен пароль, процедура авторизации может вызвать затруднения. Однако в большинстве случаев можно авторизироваться при помощи стандартной учетной записи. После нескольких попыток мне удалось попасть в систему при помощи комбинации admin:admin.

-------------------------------
-----Welcome to ATP Cli------
-------------------------------
 
Login: admin
Password:    #Password is ‘admin'
ATP>shell
 
BusyBox vv1.9.1 (2013-08-29 11:15:00 CST) built-in shell (ash)
Enter 'help' for a list of built-in commands.
 
# ls
var   usr   tmp   sbin  proc  mnt   lib   init  etc   dev   bin

Теперь мы можем выполнять команды с правами суперпользователя. На данном роутере установлен BusyBox с линуксовым интерфейсом, о котором я расскажу подробнее в следующей статье.

Что дальше?

После того как мы получили доступ к BusyBox CLI, можем начать исследование программного обеспечение. В зависимости от устройства это могут быть пароли в текстовом виде, TLS-сертификаты, полезные алгоритмы, небезопасные приватные API и так далее.

В следующей статье мы подробнее углубимся в программную часть. Я объясню различия между режимами загрузки, расскажу о выгрузке памяти и других интересных вещах, которые можно делать, если есть доступ к программному обеспечению устройства.

Спасибо за внимание. 

Ваша приватность умирает красиво, но мы можем спасти её.

Присоединяйтесь к нам!