- PVSM.RU - https://www.pvsm.ru -
Реверсинг и взлом внешних самошифрующихся накопителей – мое давнее хобби. В прошлом мне доводилось упражняться с такими моделями, как Zalman VE-400, Zalman ZM-SHE500, Zalman ZM-VE500. Совсем недавно коллега занес мне еще один экспонат: Patriot (Aigo) SK8671, который построен по типичному дизайну – ЖК-индикатор и клавиатура для ввода ПИН-кода. Вот что из этого получилось...
1. Введение [1]
2. Аппаратная архитектура [2]
– 2.1. Основная плата [3]
– 2.2. Плата ЖК-индикатора [4]
– 2.3. Клавиатурная плата [5]
– 2.4. Смотрим на провода [6]
3. Последовательность шагов атаки [7]
– 3.1. Снимаем дамп данных SPI-флешки [8]
– 3.2. Обнюхиваем коммуникации [9]


Корпус

Упаковка
Доступ к сохранённым на диске данным, которые якобы зашифрованы, осуществляется после ввода пинкода. Несколько вводных замечаний по этому девайсу:
Сначала препарируем девайс на части, чтобы понять, из каких компонентов он состоит. Самое нудное занятие — вскрытие корпуса: много микроскопических винтиков и пластика. Вскрыв корпус, видим следующее (обратите внимание на припаянный мной, пятиконтактный разъём):

Основная плата довольно-таки проста:

Наиболее примечательные её части (см. сверху вниз):
SPI-флешка хранит прошивку для JMS539 и некоторые настройки.
На плате ЖК нет ничего примечательного.


Всего лишь:
При осмотре клавиатурной платы, дела обретают более интересный поворот.

Вот здесь, на задней стороне, мы видим ленточный соединитель, а также Cypress CY8C21434 – микроконтроллер PSoC 1 (далее по тексту будем звать его просто PSoC)

CY8C21434 использует набор инструкций M8C (см. документацию [12]). На [странице продукта]( (http://www.cypress.com/part/cy8c21434-24ltxi [13]) указано, что он поддерживает технологию CapSense [14] (решение от Cypress, для емкостных клавиатур). Здесь виден припаянный мной пятиконтактный разъём – это стандартный подход для подключения внешнего программатора через ISSP-интерфейс.
Разберёмся что с чем здесь связано. Для этого достаточно прозвонить провода мультиметром:

Пояснения к этой на коленке нарисованной схеме:
Теперь когда мы знаем, из каких компонентов состоит этот накопитель, нам необходимо: 1) убедиться, что базовая функциональность шифрования действительно присутствует; 2) узнать, как генерируются/сохраняются ключи шифрования; 3) найти, где именно проверятся пинкод.
Для этого я проделал следующие шаги:
Эта процедура очень проста:
Обратите внимание, что такой подход в случае с JMS539-контроллером работает в особенности хорошо, поскольку этот контроллер на этапе инициализации загружает с флешки всю прошивку.
$ decode_spi.rb boot_spi1.csv dump
0.039776 : WRITE DISABLE
0.039777 : JEDEC READ ID
0.039784 : ID 0x7f 0x9d 0x21
---------------------
0.039788 : READ @ 0x0
0x12,0x42,0x00,0xd3,0x22,0x00,
[...]
$ ls --size --block-size=1 dump
49152 dump
$ sha1sum dump
3d9db0dde7b4aadd2b7705a46b5d04e1a1f3b125 dump
Сняв дамп с SPI-флешки, я пришёл к выводу, что её единственная задача – хранить прошивку для устройства управления JMicron, которая встраивается в 8051-микроконтроллер. К сожалению снятие дампа SPI-флешки оказалось бесполезным:
Это один из способов найти, какой чип отвечает за проверку коммуникаций, для интересующих времени/контента. Как мы уже знаем, контроллер USB-SATA подключен к ЖК Cypress PSoC, через разъём CN1 и две ленты. Поэтому подключаем зонды к трём соответствующим ножкам:

Затем запускаем логический анализатор Saleae, и вводим на клавиатуре: “123456~”. В результате видим следующую диаграмму.

На ней можем видеть три канала обмена данными:
Увеличивая первый всплеск на канале P4 (синий прямоугольник предыдущего рисунка), видим следующее:

Здесь видно, что на P4 почти 70мс однообразного сигнала, который как мне сначала показалось, играет роль синхросигнала. Однако, потратив некоторое время на то, чтобы проверить свою догадку, я обнаружил, что это не синхросигнал, а аудио-поток, который выводится на пищалку при нажатии клавиш. Поэтому сам по себе этот участок сигнала не содержит для нас полезной информации. Однако его можно использовать в качестве индикатора, — чтобы знать момент, когда PSoC регистрирует нажатие клавиши.
Однако последний аудио-поток канала P4 немного отличается от других: это звук для «неверного пинкода»!
Возвращаясь к диаграмме нажатия клавиш, при увеличении диаграммы последнего аудио-потока (см. снова синий прямоугольник), получаем:

Здесь мы видим однообразные сигналы на P11. Так что похоже, это и есть синхросигнал. А P13 – данные. Обратите внимание, как шаблон изменяется после окончания звукового сигнала. Было бы интересно посмотреть, что здесь происходит.
Протоколы, работающие с двумя проводами, это обычно SPI или I2C, и в технической спецификации на Cypress говорится, что эти контакты соответствуют I2C, что как видим справедливо и для нашего случая:

Чипсет USB-SATA постоянно опрашивает PSoC – чтобы считывать состояние клавиши, которое по умолчанию равно «0». Затем, при нажатии клавиши «1», оно меняется на «1». Окончательная передача, сразу после нажатия “~” отличается, если введён неверный пинкод. Однако на данный момент я не проверял, что там фактически передаётся. Но подозреваю, что вряд ли это ключ шифрования. Так или иначе, смотри следующий раздел, чтобы понять как я снял дам внутренней прошивки PSoC.
Автор: KarevAnton
Источник [17]
Сайт-источник PVSM.RU: https://www.pvsm.ru
Путь до страницы источника: https://www.pvsm.ru/vzlom/321102
Ссылки в тексте:
[1] 1. Введение: #a1
[2] 2. Аппаратная архитектура: #a2
[3] – 2.1. Основная плата: #a21
[4] – 2.2. Плата ЖК-индикатора: #a22
[5] – 2.3. Клавиатурная плата: #a23
[6] – 2.4. Смотрим на провода: #a24
[7] 3. Последовательность шагов атаки: #a3
[8] – 3.1. Снимаем дамп данных SPI-флешки: #a31
[9] – 3.2. Обнюхиваем коммуникации: #a32
[10] спецификация: http://www.issiusa.com/pdf/Pm25LD512_010_020.pdf
[11] спецификация: http://www.doc88.com/p-994237049795.html
[12] документацию: http://www.cypress.com/file/72341/download
[13] http://www.cypress.com/part/cy8c21434-24ltxi: http://www.cypress.com/part/cy8c21434-24ltxi
[14] CapSense: http://www.cypress.com/products/capsense-controllers
[15] Saleae Logic Pro 16: https://www.saleae.com/
[16] decode_spi.rb: https://github.com/trou/saleae-spi
[17] Источник: https://habr.com/ru/post/455515/?utm_campaign=455515&utm_source=habrahabr&utm_medium=rss
Нажмите здесь для печати.