ProHoster > Блог > адміністрування > Реверсинг і злом зовнішнього HDD-накопичувача Aigo, що самошифрується. Частина 1: Препаруємо на частини
Реверсинг і злом зовнішнього HDD-накопичувача Aigo, що самошифрується. Частина 1: Препаруємо на частини
Реверсинг і злом зовнішніх накопичувачів, що самошифруються, - моє давнє хобі. У минулому мені доводилося вправлятися з такими моделями як Zalman VE-400, Zalman ZM-SHE500, Zalman ZM-VE500. Нещодавно колега заніс мені ще один експонат: Patriot (Aigo) SK8671, який побудований за типовим дизайном - РК-індикатор і клавіатура для введення ПІН-коду. Ось що з цього вийшло…
Доступ до збережених на диску даних, які нібито зашифровані, здійснюється після введення пінкод. Декілька вступних зауважень щодо цього девайсу:
Для зміни пінкод необхідно натиснути F1 перед розблокуванням;
У пінкоді має бути від 6 до 9 цифр;
Після 15 неправильних спроб диск очищується.
2. Апаратна архітектура
Спочатку препаруємо девайс на частини, щоб зрозуміти, з яких компонентів він складається. Найнуднішим заняттям є розтин корпусу: багато мікроскопічних гвинтиків і пластику. Розкривши корпус, бачимо наступне (зверніть увагу на припаяний мною, п'ятиконтактний роз'єм):
2.1. Основна плата
Основна плата досить проста:
Найбільш примітні її частини (див. зверху донизу):
контролер Jmicron JMS539 (специфікація) для USB-SATA (U1);
роз'єм USB 3 (J1).
SPI-флешка зберігає прошивку для JMS539 та деякі налаштування.
2.2. Плата ЖК-індикатора
На платі ЖК немає нічого примітного.
Всього лише:
РК-індикатор невідомого походження (ймовірно, з китайським набором шрифтів); з послідовним керуванням;
стрічковий з'єднувач для клавіатури.
2.3. Клавіатурна плата
При огляді клавіатурної плати, справи знаходять цікавіший поворот.
Ось тут, на задній стороні, ми бачимо стрічковий з'єднувач, а також Cypress CY8C21434 – мікроконтролер PSoC 1 (далі за текстом будемо називати його просто PSoC)
CY8C21434 використовує набір M8C інструкцій (див. документацію). На [сторінці продукту](http://www.cypress.com/part/cy8c21434-24ltxi) зазначено, що він підтримує технологію CapSense (Рішення від Cypress, для ємнісних клавіатур). Тут видно п'ятиконтактний роз'єм, що припаяний мною - це стандартний підхід для підключення зовнішнього програматора через ISSP-інтерфейс.
2.4. Дивимося на дроти
Розберемося, що з чим тут пов'язано. Для цього достатньо продзвонити дроти мультиметром:
Пояснення до цієї на коліна намальованої схеми:
PSoC описаний у технічній специфікації;
наступний роз'єм, який правіше - ISSP-інтерфейс, який волею доль відповідає тому, що про нього написано в Інтернеті;
найправіший роз'єм – це клема для стрічкового з'єднувача з клавіатурною платою;
чорний прямокутник - креслення роз'єму CN1, призначеного для з'єднання основної плати з РК-платою. P11, P13 та P4 – приєднані до ніжок PSoC 11, 13 та 4, на РК-платі.
3. Послідовність кроків атаки
Тепер, коли ми знаємо, з яких компонентів складається цей накопичувач, нам необхідно: 1) переконатися, що базова функціональність шифрування дійсно присутня; 2) дізнатися, як генеруються/зберігаються ключі шифрування; 3) знайти, де саме перевіряться Пінкод.
Для цього я зробив наступні кроки:
зняв дамп даних SPI-флешки;
спробував зняти дамп даних PSoC-флешки;
переконався, що обмін даними між Cypress PSoC та JMS539 фактично містить натиснені клавіші;
переконався, що при зміні пароля в SPI-флешці нічого не переписується;
був занадто лінивим, щоб реверсити 8051-прошивку від JMS539.
3.1. Знімаємо дамп даних SPI-флешки
Ця процедура дуже проста:
підключити зонди до ніжок флешки: CLK, MOSI, MISO та (опціонально) EN;
"обнюхати" комунікації сніфером, використовуючи логічний аналізатор (я скористався Saleae Logic Pro 16);
декодувати SPI-протокол та експортувати результати до CSV;
скористатися decode_spi.rb, щоб розпарсувати результати та отримати дамп.
Зверніть увагу, що такий підхід у випадку з JMS539-контролером працює особливо добре, оскільки цей контролер на етапі ініціалізації завантажує з флешки всю прошивку.
Знявши дамп з SPI-флешки, я дійшов висновку, що її єдине завдання - зберігати прошивку для пристрою управління JMicron, яка вбудовується в 8051-мікроконтролер. На жаль зняття дампа SPI-флешки виявилося марним:
при зміні пін-коду дамп флешки залишається тим самим;
після етапу ініціалізації девайс до SPI-флешки не звертається.
3.2. Обнюхуємо комунікації
Це один із способів знайти, який чіп відповідає за перевірку комунікацій, для часу/контенту, що цікавлять. Як ми вже знаємо, контролер USB-SATA підключений до РК Cypress PSoC через роз'єм CN1 і дві стрічки. Тому підключаємо зонди до трьох відповідних ніжок:
P4, загальне введення/виведення;
P11, I2C SCL;
P13, I2C SDA.
Потім запускаємо логічний аналізатор Saleae, і вводимо на клавіатурі: "123456". У результаті бачимо таку діаграму.
На ній можемо бачити три канали обміну даними:
на каналі P4 кілька коротких сплесків;
на P11 та P13 – майже безперервний обмін даними.
Збільшуючи перший сплеск на каналі P4 (синій прямокутник попереднього малюнка), бачимо наступне:
Тут видно, що на P4 майже 70мс одноманітного сигналу, який, як мені спочатку здалося, грає роль синхросигналу. Однак, витративши деякий час на те, щоб перевірити свій здогад, я виявив, що це не синхросигнал, а аудіо-потік, який виводиться на пилюку при натисканні клавіш. Тому сама по собі ця ділянка сигналу не містить для нас корисної інформації. Однак його можна використовувати як індикатор, щоб знати момент, коли PSoC реєструє натискання клавіші.
Однак останній аудіо-потік каналу P4 трохи відрізняється від інших: це звук для «невірного пінкоду»!
Повертаючись до діаграми натискання клавіш, при збільшенні діаграми останнього аудіо-потоку (див. знову синій прямокутник), отримуємо:
Тут бачимо однакові сигнали на P11. Отже, схоже, це і є синхросигнал. А P13 – дані. Зверніть увагу на те, як шаблон змінюється після закінчення звукового сигналу. Було б цікаво подивитись, що тут відбувається.
Протоколи, що працюють із двома проводами, це зазвичай SPI або I2C, і в технічній специфікації на Cypress говориться, що ці контакти відповідають I2C, що як бачимо справедливо і для нашого випадку:
Чіпсет USB-SATA постійно опитує PSoC - щоб зчитувати стан клавіші, яке за умовчанням дорівнює "0". Потім, при натисканні кнопки «1», воно змінюється на «1». Остаточна передача відразу після натискання “~” відрізняється, якщо введено неправильний пінкод. Однак зараз я не перевіряв, що там фактично передається. Але підозрюю, що навряд чи це є ключ шифрування. Так чи інакше, дивись наступний розділ, щоб зрозуміти, як я зняв дам внутрішньої прошивки PSoC.