A minute of Black Magic

    Prev


    В этой статье расскажем, как научиться отлаживать и полюбить маленькую черную плату Black Magic Probe V2.1. Но для начала немного о том, что это такое и зачем она нужна.

    Плата Black Magic Probe Mini V2.1 (BMPM2) разработана 1BitSquared в сотрудничестве с Black Sphere Technologies, является адаптером JTAG и SWD, предназначена для программирования и отладки микроконтроллеров ARM Cortex-M и ARM Cortex-A. Можно добавить поддержку других процессоров. Описание процесса добавления можно найти по ссылке. Стоит также отметить, что любой процессор с поддержкой ADIv5 (ARM Debug Interface v5) будет определяться платой.


    На рисунках приведены процессоры семейств ARM Cortex-M и ARM Cortex-A, поддерживаемые платой Black Magic Probe Mini V2.1.


    Процессоры семейства Cortex-M, поддерживаемые платой Black Magic Probe Mini V2.1
    Процессоры семейства Cortex-A, поддерживаемые платой Black Magic Probe Mini V2.1


    В процессе тестирования Black Magic Probe было выявлено, что поддерживаемые процессоры не ограничиваются списком, предоставленным производителем. Официально не поддерживаемые процессоры с ARM Debug Interface v5 определяются, например, как "Cortex-M0" или “Cortex-A7”. При этом, не гарантируется полная функциональность, но все же произвести минимальные действия по отладке получится.


    Что можно делать с использованием платы Black Magic Probe:


    • прерывать процесс исполнения программы;
    • наблюдать за изменениями регистров и переменных;
    • устанавливать точки останова (можно установить точку останова в коде, которая заставит программу остановиться, как только эта точка будет достигнута);
    • просматривать стек вызовов (список функций и их параметров, которые привели нас к текущей точке и состоянию программы);
    • дизассемблирование (возможность просмотреть машинный код и узнать, что именно делает программа);
    • дамп памяти (сохранение ОЗУ и/или флэш-контента в файл).

    Функции Black Magic Probe, которые могут быть полезны при исследовании информационной безопасности устройств:


    • разработка встроенного программного обеспечения и устройств для проведения атак;
    • реверс-инжиниринг IoT;
    • поиск уязвимостей;
    • динамический анализ с помощью IDA и других инструментов, совместимых с серверами gdb.

    BMPM2 обладает двумя основными особенностями. Первая заключается в том, что на самом устройстве запускается gdbсервер, открывающий виртуальный порт, к которому можно напрямую подключиться через клиент gdb на своем хост-компьютере (рекомендуется набор инструментов gcc-arm-embedded), поэтому не нужно настраивать конфигурации OpenOCD или STLink. Сравнение схем подключения отладочного интерфейса при помощи OpenOCD/STLink и BMPM2 можно увидеть ниже. Как видно, вариант с подключением через BMPM2 проще.


    Сравнение алгоритмов работы при отладке без платы Black Magic Probe Mini V2.1 и с ней


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


    Для изучения возможностей работы были взяты четыре платы: TM32F103C8, STM32vldiscovery, STM32F429I-disc1 и предлагаемая разработчиками 1Bitsy V1.0.


    Более подробно будет рассмотрена работа с 1Bitsy и STM32F429I-disc1. Первая была выбрана по рекомендации самих разработчиков, а у второй есть сенсорный экран, что делает процесс исследования более наглядным.


    Познаем мир отладки с Black Magic Probe


    Изучение работы Black Magic Probe V2.1 удобно начать с отладки 1Bitsy. Эта плата была создана специально для работы с BMPM2, поэтому не должно возникнуть никаких затруднений.
    Соединим Black Magic Probe и 1Bitsy между собой кабелем JTAG и подключим их к компьютеру.
    Ниже будет описана работа в среде GNU/Linux, руководство по работе в ОС Windows и MacOS легко найти по ссылке.


    После подключения BMPM2 к ПК и к разъему JTAG, на 1Bitsy выполним три команды в gdb для начала отладки. Важно, чтобы пользователь был добавлен в группу dialout командой "sudo adduser $USER dialout", иначе ничего не заработает. Первой командой “target extended-remote /dev/ttyACMx” подключаемся к BMPM2, где x — номер серийного порта, далее сканируем все подключенные к Black Magic Probe устройства с помощью команды “monitor jtag_scan”. Если все хорошо, то будет выведен список найденных устройств и командой “attach 1” мы подключимся к 1Bitsy.


    (gdb) target extended-remote /dev/ttyACM0
    Remote debugging using /dev/ttyACM0
    (gdb) monitor jtag_scan
    Target voltage: 3.3V
    Available Targets:
    No. Att Driver
     1      STM32F4xx
    (gdb) attach 1
    Attaching to Remote target
    warning: No executable has been specified and target does not support
    determining executable automatically.  Try using the "file" command.
    0x0800026c in ?? ()
    (gdb)

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


    В наличии была плата на основе микроконтроллера STM32 — STM32F429I-disc1, ей и воспользуемся, заодно зальем на нее какую-нибудь интересную прошивку. Главным отличием в работе с этой платой от работы с 1Bitsy является соединение по интерфейсу SWD, а не JTAG.


    Перед началом работы соединяем платы через JTAG/SWD адаптер по следующей схеме:
    на интерфейсе SWD (если считать с крайнего сверху выхода):


    1. SWCLK
    2. GND
    3. SWDIO
    4. 3V — tVref.

    STM32F429I-disc1 и Black Magic Probe


    Для демонстрации работоспособности процесса отладки была использована прошивка, содержащая несколько программных модулей. Один из них — игра Reversi, её будет отлаживать интереснее всего.


    Заливаем прошивку на плату и в gdb вводим почти те же команды, что и для 1Bitsy, с той лишь разницей, что плата подключена по SWD, поэтому потребуется использовать команду swdp_scan.


    (gdb) target extended-remote /dev/ttyACM0
    Remote debugging using /dev/ttyACM0
    (gdb) monitor swdp_scan
    Target voltage: 3.3V
    Available Targets:
    No. Att Driver
     1      STM32F4xx
    (gdb) attach 1
    Attaching to Remote target
    warning: No executable has been specified and target does not support
    determining executable automatically.  Try using the "file" command.
    0x0800026c in ?? ()
    (gdb)

    К огромной печали, нам ни разу не удалось выиграть, поэтому захотелось что-нибудь в ней поломать. Для начала, мы посмотрели исходники. В них была найдена переменная Board, предположительно, обозначающая адрес первой ячейки доски. Рядом есть строки "Reversi — Player 1" и "Reversi — Player 2".


    static void _SetPlayer(int Player) {
      int Score, ValidMoves, PossibleMoves;
      char ac[256];
    
      _Board.ActPlayer = Player;
      if (Player == 1) {
        FRAMEWIN_SetText(_hFrame, "Reversi - Player 1");
      } else {
        FRAMEWIN_SetText(_hFrame, "Reversi - Player 2");
      }
      FRAMEWIN_SetBarColor(_hFrame, 1, (Player == 1) ? GUI_RED : GUI_BLUE);
      PossibleMoves = _CalcValidMoves(&_Board);
      GUI_Exec();
    
    if (!PossibleMoves) {
        GUI_Exec();
        _Board.ActPlayer = 3 - Player;

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


      v1 = a1;
      v2002CB74 = a1;
      if ( a1 == 1 )
      {
        sub_D8B3C(v2002CB80, "Reversi - Player 1");
        v2 = 255;
      }
      else
      {
        sub_D8B3C(v2002CB80, "Reversi - Player 2");
        v2 = 16711680;
      }
      sub_E06A8(v2002CB80, 1, v2);
      v3 = sub_DEDF8(0x2002CAF4);
      result = ((int (*)(void))sub_C91B4)();
      if ( v3 )
        return result;
      sub_C91B4(result);
      v2002CB74 = 3 - v1;
      v5 = sub_DEDF8(0x2002CAF4);
    

    Далее, решили воспользоваться gdb для того, чтобы посмотреть, что находится по этому адресу.


    Вывод GDB
    Начало игры


    Все верно. Если внимательно изучить данную таблицу и расположение фишек в начале игры, то можно заметить, что 001 означает красную фишку, а 002 — синюю. Можно попробовать изменить значение одной из ячеек. Для этого мы воспользовались командой:


    set *(char *) 0x2002CAF4 = 1


    Результат:


    Вывод GDB
    Состояние ячеек после ввода команды


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


    Результат выполнения скрипта:


    Результат выполнения скрипта
    Состояние ячеек после выполнения скрипта


    Скрипт успешно отработал, нам удалось победить в игре, а это значит, что с помощью платы Black Magic Probe Mini V2.1 через gdb можно успешно отлаживать и "ломать" прошивки.
    А теперь немного скучных примеров с моргающими лампочками.


    STM32F103C8


    Плату STM32F103C8 подсоединим к Black Magic Probe V2.1 через интерфейс JTAG.


    Интерфейс JTAG


    Исходники для прошивки платы можно взять тут.


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


    STM32vldiscovery


    Плату STM32vldiscovery подсоединим к Black Magic Probe V2.1 через интерфейс SWD, а именно:


    1. 3V3 — tVref
    2. PA13 — SWDIO
    3. PA14 — SWCLK
    4. GND — GND

    Исходники для прошивки платы можно взять тут.


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


    Выводы


    Плата Black Magic Probe Mini V2.1 — простая в использовании и имеет набор инструментов и библиотек с открытым исходным кодом, это является ее основными плюсами.
    Минусом платы является отсутствие поддержки архитектуры процессоров arm64 и процессоров Texas Instruments.


    http://1bitsy.org/overview/introduction/
    https://1bitsquared.com/products/black-magic-probe
    https://github.com/esden/1bitsy-bmpm-exercises/blob/master/embedded_programming_with_black_magic_and_lights_on-workshop_guide.pdf
    https://github.com/blacksphere/blackmagic/wiki


    Авторы


    • +17
    • 6.6k
    • 1
    Digital Security
    212.37
    Безопасность как искусство
    Share post

    Comments 1

      0
      Недавно на Гиктаймс была еще одна статья о BlackMagicProbe, после которой я собрал свой экземпляр. Да, устройство работает, но его интеграция с IDE может представлять проблему. Например, я использую для разработки под МК QtCreator с плагином BareMetal, и, к сожалению, не могу использовать BMP, так как он использует extended-gdb протокол. В Eclipse, с другой стороны, вроде бы такой проблемы нет.

      Only users with full accounts can post comments. Log in, please.