Обратното инженерство и хакването на външни самошифроващи се дискове е дългогодишно хоби за мен. В миналото съм работил с модели като Zalman VE-400, Zalman ZM-SHE500, и Zalman ZM-VE500. Съвсем наскоро колега ми донесе още един екземпляр: Patriot (Aigo) SK8671, който е с типичен дизайн – LCD индикатор и клавиатура за въвеждане на PIN код. Ето какво се получи…

1. Въведение

Корпус

Опаковка
Достъпът до данните, съхранявани на диска и предполагаемо шифровани, става след въвеждане на PIN кода. Няколко бележки относно това устройство:
- За промяна на PIN кода е необходимо да натиснете F1 преди отключването;
- PIN кодът трябва да съдържа от 6 до 9 цифри;
- След 15 неправилни опита дисковете се изчистват.
2. Хардуерна архитектура
Първо разглобяваме устройството, за да разберем от какви компоненти се състои. Най-скучната част е отварянето на корпуса: много микроскопични винтчета и пластмаса. След отварянето на корпуса, виждаме следното (обърнете внимание на припояния от мен, петконтактен конектор):

2.1. Основна платка
Основната платка е доста проста:

Най-забележителните части (отгоре надолу):
- конектор за LCD индикатора (CN1);
- зумер (SP1);
- Pm25LD010 () SPI флаш памет (U2);
- контролер Jmicron JMS539 () за USB-SATA (U1);
- конектор USB 3 (J1).
SPI флаш паметта съхранява фърмуера за JMS539 и някои настройки.
2.2. Платка с LCD индикатор
На платката с LCD няма нищо забележително.


Просто:
- LCD индикатор с неизвестен произход (вероятно с китайски набор от шрифтове); с последователно управление;
- ленточен конектор за платката на клавиатурата.
2.3. Платка на клавиатурата
При преглед на платката на клавиатурата, нещата стават по-интригуващи.

Тук, на задната страна, виждаме ленточен конектор, а също и Cypress CY8C21434 – микроконтролер PSoC 1 (оттук нататък ще го наричаме просто PSoC)

CY8C21434 използва набор от инструкции M8C (вж. ). На [страницата на продукта]( () е указано, че поддържа технологията (решение от 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;
- «подушете» комуникацията със снiffer, като използвате логически анализатор (аз използвах );
- декодирайте SPI протокола и експортирайте резултатите в CSV;
- използвайте , за да парсирате резултатите и получите дъмп.
Обърнете внимание, че този подход в случая с контролера 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 флаш паметта се оказа безполезно:
- при смяна на ПИН кода, дъмпът на флаш паметта остава същият;
- след етапа на инициализация, устройството не се обръща към 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.
Източник: habr.com
