15 марта 2014

RUCTF 2014 QUALS - HARDWARE 200

Название задания: hw_reverse.
Описание задания: Какой самый короткий код надо ввести?
(у нас всего 70 попыток)
Ход решения:

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


Просматриваем для начала видеозапись, становится понятно, что пока кодовый замок не открыт горит красный светодиод, как только замок открывается загорается зеленый светодиод. На самом деле задание достаточно легкое и не требует особых усилий, только элементарные знания в электронике. Первым делом смотрим на фотографию платы сверху и переписываем оттуда названия 4-х микросхем.
Две отечественные микросхемы К561ТМ2 это D-триггеры, а две, импортные CD74HC32 и HD74HC32, это CMOS логика, счетверенные OR элементы. Всё это мы моментально узнаем из Google. Следующим шагом является получение Datasheet'ов на все микросхемы - буквально один запрос в Google (ссылки под названиями). Прочитав Datasheet'ы мы понимаем, что схемки попарно одинаковые. Для тех, кто не знаком с принципом работы вышеописанных элементов в составе микросхем, не составит никакого труда выяснить это из скачанных документов (благо каждый из них по 2 странички).
Вкратце опишу работу этих элементов для совсем ленивых: OR элемент имеет два входа nA и  nB, и один выход nY (где n - номер элемента в схеме). При подаче на любой из входов уровня напряжения, соответствующего логической "1" (далее просто "1"), на выходе сигнал, соответствующий логическому "0" (далее просто "0"), сменяется сигналом "1". В предложенных микросхемах есть по 4 элемента OR в каждой с соответствующей нумерацией выводов.
Триггер это просто единичная ячейка памяти, которая управляется сигналами на входе и может хранить 1 бит информации.

  • RS-триггер имеет два входа nR и nS, а также два выхода nQ и nQ-1 (где n - номер соответствующего триггера). . Вход nS предназначен для установки выхода nQ в состояние "1", а инвертирующего выхода nQ-1 в сотояние "0". вход nR проделывает обратную операцию, меняя выходы на "0" и "1" соответственно. 
  • D-триггер имеет те же выходы, но другие входы nC и nD. Вход nC является управляющим, а вход nD предназначен для данных. При подаче на вход nC сигнала "1" то состояние, которое находится на входе nD записывается внутрь триггера (при этом состояние выхода остается таким же как и до операции). Если теперь убрать сигнал "1" с вывода nC, подав туда "0", то на выходе получим "записанное" значение, которое было на выводе nD до начала операции. При этом уже никакой роли не играет комбинация сигналов на входе. 
Особенность данных микросхем в том, что в них находятся комбинированные D- и RS- триггеры. то есть принцип работы D-триггера сохраняется, но существует альтернативный подход для "грубой" установки сигналов на выходе. Для этого просто используются входы nR и nS.
Если предыдущие 2 абзаца были непонятны, можно обратиться за информацией к гуглу и получить её в исчерпывающем объёме. Например тут и тут.
Прочитав и запомнив как работают схемы мы можем начать разбирать схемотехническое устройство платы, изучая фотографию нижней части платы. Помните, что нижняя часть платы зеркальна по отношению к верхней, следовательно и выводы микросхем, которые мы видим в документации придется зеркально отобразить.
Существует много способов решения задачи анализа схемотехнического решения платы, но я расскажу только об одном, наиболее подходящем в данной ситуации. 
Так как основная смысловая нагрузка лежит на 4-х микросхемах, то предлагаю перерисовать их на отдельный лист покрупнее. Потом просто к каждой ножке присоединяется функциональный элемент, с которым она работает.

В результате получилась функциональная схема устройства (то есть понятно что как работает).
Следующим этапом необходимо понять зависимость состояний микросхем от нажатия кнопок. Самым разумным будет начать анализ с выхода, то есть со светодиодов. Сразу видим, что питание происходит через транзисторы, работающие в ключевом режиме (сигнал есть/сигнала нет) и управляемые через ножки 1Q и 1Q-1 первой схемы К561ТМ2, а конкретно зеленый светодиод зависит от прямого выхода, а красный от обратного. Самый быстрый способ установить этот вывод в положение "0" это подать "0" на вывод 1S. Но просмотрев схему, убеждаемся, что все выводы R соединены вместе и на землю, а все выводы S объединены вместе и замкнуты на вывод элемента OR. Это говорит о том, что при любом неудачном нажатии кнопки все наши старания сбрасываются к начальному этапу. Остается один выход - использовать данные микросхемы в качестве D-триггеров. Дальнейший анализ схемы выявляет, что четыре кнопки подключены как раз к C выводам триггеров, а остальные к логическим элементам OR. То есть уже можно перебором подобрать нужную комбинацию, но продолжим. Пойдем изучать схему с конца. Сигнал "0" подается на транзистор зеленого светодиода если на выводе 2Q будет установлен "0", чтобы подать "0" на этот вывод надо нажать и отпустить кнопку 3, при этом имея "0" на выводе 2D. В свою очередь этот вывод подключен к выводу 1Q, и зависит от сигнале на нем. Таким образом выстраивается следующая цепочка:

"0">>(21D,21C)>>21Q>>(22D,22C)>>22Q>>(11D,11C)>>11Q>>(21D,21C)>>21Q>>LED


Таким образом просто подставим вместо каждой ножки nC соответствующий ей номер кнопки и запишем полученные числа по порядку.
flag: 9831
//solved by gek0n