История с кодовым замком. Как я разработал задание на схемотехнику для стенда «Хакера» на ZeroNights

12 и 13 ноября в Санкт-Петербурге проходила ежегодная международная конференция по практической информационной безопасности ZeroNights 2019. Журнал «Хакер» участвовал в мероприятии в качестве информационного партнера, а на нашем стенде, помимо стикеров и скидочных купонов на подписку, можно было найти занятную вещь — электронный кодовый замок. Раскрыть его предлагалось при помощи мультиметра, познаний в электротехнике или просто смекалки.

В августе этого года я уже успел побывать на Chaos Constructions (он, кстати, тоже проводится в Питере) и обратил внимание на то, какой популярностью пользуется спортивный локпикинг — взлом замков с помощью отмычек и подручных средств.

Стенд «Хакера» на ZeroNights
Донские казаки взламывают кодовый замок

Меня это, как ни странно, оставило равнодушным, но идея была интересная, и я решил попробовать ее творчески переосмыслить. Хотя и тут я не был первопроходцем: если кто-то читал учебник Харриса и Харрис «Цифровая схемотехника», то там одна из задач была на реверс схемы цифрового замка. Требовалось восстановить по схеме работу конечного автомата и диаграмму его внутренних состояний и узнать код доступа.

Что получилось в итоге

Однако в таком виде схема не годилась для реализации «в железе»: во-первых, авторы исходили из того, что используются «идеальные» кнопки без дребезга контактов; во-вторых, тактирование для схемы было чисто внешним. Таким образом, нажатие на кнопку и тактовый сигнал были асинхронными по отношению друг к другу, и пользователю, если бы он попытался ввести код, потребовалось бы подгадывать свои действия под обновление состояния в системе.

Разумеется, подобное взаимодействие для реального устройства сложно назвать естественным и интуитивным, поэтому схема нуждалась в доработке. Но само направление мне показалось верным, и я решил двигаться дальше. Первые наивные попытки накидать схему на скорую руку выявили основную проблему: внешним источником тактирования мог быть только пользовательский ввод (нажатие на кнопку). Но оно же было и информационным сигналом в схеме! Таким образом, попытка захватить в какой-нибудь триггер состояние входного сигнала (по фронту или спаду) неизбежно порождала неопределенность.

INFO

Тут следует сделать небольшое отступление и заранее предупредить, что я не профессиональный разработчик цифровых схем. Основы цифровой схемотехники я знаю ровно настолько, чтобы понимать, из чего состоят и как работают простейшие компьютерные блоки: регистры, АЛУ, память и прочее. Ничего сверхсложного я никогда не реализовывал, и, как должен работать подобный цифровой замок, я тогда понимал для себя только приблизительно, в теории. Поэтому моя схема может быть неоптимальной и даже излишне запутанной.

Тогда я решил подробнее ознакомиться с вопросом и полез в интернет искать похожие примеры. Первые же ссылки в Яндексе помогли прояснить несколько вещей: во-первых, такие схемы есть; во-вторых, почти все они мне не понравились. Сейчас попробую объяснить почему. Я не буду здесь приводить ссылки на конкретные работы, чтобы не обижать авторов. При желании все можно легко найти самостоятельно.

Так вот, как выяснилось, часть схем не предполагала сброса при неверной комбинации — это облегчало подбор. Другая часть не позволяла использовать одну и ту же цифру больше одного раза в пароле — это сокращало пространство вариантов (при десяти цифрах и четырехзначном числе получается 5040 комбинаций вместо 10 000!). Наконец, авторы некоторых примеров мешали в одну кучу цифровую и аналоговую схемотехнику, что мне вообще не понравилось.

Поэтому я понял, что придется разрабатывать схему практически с нуля. Ну что же, тем интереснее! Хотя сроки поджимали. Как обычно, решение об интерактиве для стенда приняли в последний момент и итоговый результат нужен был пусть и не «еще вчера», но через две недели или около того. И это с учетом изготовления плат! В общем, пришлось поднажать.

Я решил остановиться на 561-й серии микросхем, просто потому, что небольшое их количество у меня оставалось с предыдущих проектов. Кроме того, у них широкий диапазон входных напряжений — можно использовать хоть батарейки АА, хоть «Крону». К тому же «Интеграл» выпускает их массово, их легко достать и большинство все еще доступно в DIP-корпусах. Это облегчает реверс схемы — все-таки проект делается преимущественно для развлечения.

Ну и на самом деле — мне вообще нравятся старые корпуса для микросхем. В них чувствуется какая-то монументальность, классицизм, что ли. Широкие DIP-40 для микропроцессоров и микроконтроллеров, PLCC-44 для параллельной памяти и PLCC-84 для микросхем CPLD. Я решил, что стилистика ретро проекту не повредит, тем более что DIP в цанговых панельках (а я собирался использовать именно такие в конечном варианте) выглядят просто потрясно, тут вряд ли у кого будут возражения.

Первым делом нужно было решить проблему с дребезгом. На страничке «Википедии» приведена схема подавления дребезга кнопки с перекидным контактом на двух вентилях 2И-НЕ. Этому соответствует микросхема К561ЛА7, и первоначально я использовал ее. У нее четыре логических вентиля, и это означало, что на каждый корпус я смогу завести сигнал с двух кнопок. Не сказать, конечно, что это много…


Мне нужно было десять кнопок для десяти цифр плюс кнопка сброса. Одиннадцать в аккуратную матрицу не раскладывались (сюрприз!), поэтому я решил увеличить их количество до двенадцати. А это уже целых шесть микросхем. Как-то расточительно. Тогда я пролистал список микросхем «Интеграла» еще раз и обнаружил подходящую деталь — К561ТР2. Это четыре RS-триггера в одном корпусе, а они как раз собираются из пары вентилей И-НЕ. Ура, беру их!

Следующий шаг — собрать счетчик. Схему нужно принудительно сбрасывать, если пользователь не ввел правильный код за разрешенное число попыток, а это значит, что придется считать нажатия. Для этого требуется логический элемент 10ИЛИ, но в готовой микросхеме их не существует. Тогда я использовал обе половинки ИС К561ЛЕ6 (4ИЛИ-НЕ), дополнительно вентиль от ИС К561ЛЕ5 (2ИЛИ-НЕ) и объединил их с помощью ИС К561ЛА9 (3И-НЕ).


Если вспомнить правила де Моргана, то инвертор с выхода элемента ЛА9 можно переместить на его входы, при этом И поменяется на ИЛИ, а сами инверторы взаимно аннигилируют с НЕ на выходах ИЛИ-НЕ. Получается 10ИЛИ — как раз то, что нужно. Кроме того, я дополнительно инвертировал выходной сигнал, чтобы получить сброс по отжатию кнопки — когда пользователь завершил ввод.

Сам по себе счетчик стандартный и состоит из трех D-триггеров на микросхемах К561ТМ2. Биты его состояния будут служить для индикации прогресса и для принудительного сброса (нижняя часть второго листа схемы). Здесь же впервые появляется сигнал от общего сброса, в котором участвует и сигнал от кнопки сброса.

Наконец, центральная часть устройства, которая, собственно, и служит для хранения правильной последовательности. Я специально не стал здесь вводить дополнительное шифрование состояний конечного автомата. Да, это позволило бы сократить количество используемых D-триггеров, но отрицательно сказалось бы на легкости восприятия схемы. Напомню, основное назначение — это не чтобы «никто не решил», а чтобы большинство посетителей смогло поучаствовать и получить свою порцию удовольствия. Все же основные специализации у посетителей ZN — это веб, мобильные приложения и прочие далекие от железа вещи.

Итак, для кода используется пять значащих цифр и пять D-триггеров. Изначально я планировал всего четыре цифры и десять тысяч комбинаций, но от схемы счетчика остался один «лишний» бит, поэтому я решил добавить его сюда, в последовательность пароля. По сути, это «плюс 90 тысяч комбинаций за те же деньги!». Хороший маркетинговый ход, наверное. 🙂

Здесь ключевую роль играет трехвходовый элемент И-НЕ, который разрешает подачу тактового сигнала на соответствующий триггер тогда и только тогда, когда предыдущий бит уже защелкнулся, а текущий еще в состоянии нуля (логическая единица на инверсном выходе). Таким образом, набранные в правильном порядке пять цифр пароля приводят к высокому уровню на выходном сигнале ENABLE.


Этот выход, в свою очередь, соединен с микросхемой-таймером КР1006ВИ1 (аналог популярной ИС NE555). Она настроена с помощью RC-цепочки на частоту в 10 Гц и отвечает за простенькую анимацию на светодиодах типа «бегущий огонек» (вторично используются светодиоды на шкале прогресса). Я не буду подробно останавливаться на схеме анимации, смысловой нагрузки для основных задач проекта она не несет, разве что дополнительно привлекает внимание, пока работает.

Скажу лишь, что здесь используется еще один счетчик — микросхема К561ИЕ8 (десятичный счетчик-делитель) — биты CLK0 — CLK2 и элементы исключающего ИЛИ (К561ЛП2) для управления светодиодами D6 — D15. Все вместе они образуют своего рода дешифратор, который позволяет использовать единственную шкалу как для индикации прогресса, так и для анимации (два режима работы).

С микросхемой-таймером ВИ1 связана одна любопытная деталь. Формально она не относится к 561-й серии, и ее рабочий диапазон напряжений начинается от 5 В (против трех у всех остальных микросхем на плате). Экспериментальным путем было выяснено, что таймер запускается и от 3,5 В, хотя за точность и характеристики выходного сигнала в таком режиме я не ручаюсь (не измерял).

На самом деле в качестве генератора тактового сигнала для анимации можно было вместе с RC-цепочкой использовать и триггер Шмидта из 561-й серии — К561ТЛ1. Но я узнал об этом уже слишком поздно, когда плата была почти готова. Если кому интересно, рекомендую почитать книгу «Проекты и эксперименты с КМОП микросхемами». В ней на примере микросхемы К561ТЛ1 демонстрируются самые разные способы применения. Итоговое устройство могло бы быть собрано на микросхемах одной серии и иметь больший рабочий диапазон. Обязательно учту на будущее.


Чтобы убедиться в работоспособности схемы, я предварительно собрал все на беспаечной макетке. Параллельно разводкой платы занялся мой хороший знакомый — Александр Бурага. И тут нужно сказать, что, несмотря на мою корявую принципиальную схему и невнятное (на словах) ТЗ и описание, он справился с задачей в рекордные сроки — буквально за пару дней. Более того, плата у него оказалась даже гораздо меньше, чем я изначально предполагал.

Казалось бы, это не очень большой плюс, но мне предстояло размещать на производстве сверхсрочный заказ, стоимость которого зависит в том числе от размеров. Китай отпадал сразу же, связываться даже с курьерской службой не хотелось. Зеленоградский «Резонит» тоже не подходил, там минимальный срок составлял около недели. К счастью, в том же Зеленограде нашлась фирма «ТеПро», она бралась изготовить несколько экземпляров этой двуслойки с шелкографией и металлизацией всего за 36 часов!


Кстати, со сроками в «ТеПро» погорячились, и все равно потребовалось 48 часов от подтверждения оплаты до момента, когда я получил в их офисе заветные куски текстолита. Но я был рад и такому результату! Хотя от итоговой цены до сих пор немного в дрожь бросает, хорошо хоть не из своего кармана. 🙂

Дальше — поиск и покупка комплектующих (в основном брал в «Чипе и Дипе», но часть пришлось искать и на Митинском радиорынке). Не обошлось без огорчений: изначально я предполагал использовать суровые «советские» светодиоды АЛ102 с металлическим цоколем (для антуражу, и вообще, это же ретро!). Знакомый меня отговаривал, мотивируя тем, что они слабо светят. Действительно, характеристики на страничке товара не впечатляли: всего 0,15 мКд против стандартных 30–40 мКд у других светодиодов того же цвета и размера.

Но я все-таки решился попробовать и заказал несколько штук. Увы, меня ждало разочарование: не знаю, где в «Чипе и Дипе» хранили эти компоненты, но у 80% из купленных мной светодиодов не только необратимо помутнела линза, но и образовался какой-то желтый налет. В общем, если им и предстояло когда-то светить, то явно уже не в этой жизни.

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


Напоследок пару слов о том, какие подсказки были доступны участникам. Во-первых, выход с каждого D-триггера для пароля дополнительно уходил на светодиоды группы D1 — D5. В теории это сводило задачку к простому перебору, и некоторые при отсутствии других идей или желания возиться прибегали к нему. Это не баг, это фича! Во-вторых, кнопка с первой цифрой пароля дополнительно маркировалась на шелкографии небольшим логотипом журнала. Его, вопреки моим ожиданиям, заметили только единицы.


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

INFO

Подробнее о принципах работы цифрового замка читай в статье «Основы цифровой схемотехники. Как логические элементы образуют биты памяти в твоем компьютере».

faberge: Цифровыхъ дѣлъ мастеръ