imageПривет, Хаброжители!

Встроенные системы трудно атаковать. Различных конструкций плат, процессоров и операционных систем слишком много, и это затрудняет их реверс-инжиниринг. Но теперь все станет проще — вас обучат два ведущих мировых эксперта по взлому аппаратного обеспечения. Пройдите ускоренный курс по архитектуре и безопасности встроенных устройств, узнайте об электрических сигналах, анализе образов прошивок и многом другом. Авторы объединяют теорию с практическими инструкциями, которые вы можете применить на реальном железе. Книга завершается описанием атак на такие устройства, как Sony PlayStation 3, Xbox 360 и лампы Philips Hue. В приложении приведен список всего оборудования, которое понадобится вам для домашней лаборатории, независимо от того, планируете ли вы модифицировать печатную плату или собирать и анализировать графики потребляемой мощности.

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

Мы не ждем, что у вас дома найдется лазерное оборудование, ускорители частиц или другие вещи, которые любителю не по карману. А если такое оборудование у вас есть, например в лаборатории вашего университета, то книга станет еще полезнее. Что касается целевых встроенных устройств, то мы предполагаем, что у вас есть физический доступ к ним и что вам интересно с ними поэкспериментировать. И самое главное: мы предполагаем, что вам нравится изучать новые методы, вы мыслите в рамках обратного проектирования и готовы к глубокому погружению в тему!

Типы атак


Аппаратные атаки, очевидно, нацелены на аппаратное обеспечение, например на доступ к порту отладки Joint Test Action Group (JTAG). Но они также могут быть нацелены на ПО, например чтобы обойти проверку пароля. В этой книге мы не будем рассматривать программные атаки на ПО, но уделим внимание использованию ПО для атаки на аппаратное обеспечение.

Как упоминалось ранее, поверхность атаки — отправная точка для атакующего, состоящая из доступных компонентов оборудования и программного обеспечения. Рассматривая поверхность атаки, мы обычно предполагаем полный физический доступ к устройству. Но иногда достаточно находиться в радиусе действия Wi-Fi (ближний радиус действия) или иметь подключение к любой сети (удаленное подключение).

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

Программные атаки на аппаратные средства


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

Внедрение ошибок

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

Забивание DRAM — хорошо известный метод внедрения ошибок. В нем микросхема памяти DRAM бомбардируется неестественным шаблоном доступа в трех соседних строках. При многократной активации двух внешних строк в центральной строке-жертве происходит переключение битов. Эта атака вызывает инвертирование битов DRAM, превращая строки-жертвы в таблицы страниц. Таблицы страниц — это поддерживаемые операционной системой структуры, которые ограничивают доступ приложений к памяти. Изменяя биты управления доступом или адреса физической памяти в этих таблицах, приложение может получить доступ к памяти, к которой в обычных обстоятельствах доступа нет, а это уже позволяет расширить привилегии приложения. Хитрость заключается в том, чтобы изменить структуру памяти таким образом, чтобы строка-жертва с таблицами страниц находилась между строками, контролируемыми злоумышленником, а эти строки активируются из программного обеспечения высокого уровня. Было доказано, что этот метод работает на процессорах x86 и ARM, причем реализуется как низкоуровневым программным обеспечением, так и JavaScript. Больше информации можно найти в статье Drammer: Deterministic Rowhammer Attacks on Mobile Platforms Виктора ван дер Вина и др.

Разгон ЦП — еще один метод внедрения ошибок. Разгон вызывает временные ошибки, называемые ошибками синхронизации. Результатом такой ошибки могут быть неверные значения битов в регистре ЦП. CLKSCREW — пример атаки на разгон ЦП. Поскольку программное обеспечение на мобильных телефонах может управлять частотой ЦП и напряжением ядра, злоумышленник может заставить ЦП сбоить, снижая напряжение и кратковременно повышая частоту процессора. Правильно рассчитав время, злоумышленник может сгенерировать ошибку проверки подписи RSA и загрузить неправильно подписанный произвольный код. Подробнее об этом — в статье CLKSCREW: Exposed the Perils of Security-Boblivious Energy Management Эдриана Танга и др.

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

Атаки по побочным каналам

Синхронизацией ПО называют число тактов, необходимое процессору для выполнения программной задачи. Как правило, более сложные задачи занимают больше времени. Например, сортировка списка из 1000 чисел занимает больше времени, чем сортировка списка из 100 чисел. Неудивительно, что атакующий может использовать для атаки именно время выполнения. В современных встроенных системах измерить время выполнения несложно, причем с точностью до такта! Это ведет к возникновению атак по времени, в ходе которых атакующий пытается связать время выполнения программного обеспечения с неким значением, которое пытается извлечь из системы.

Например, функция strcmp языка C сравнивает две строки. Она сравнивает символы строки один за другим, начиная с первого, и, как только встречается различие, останавливается. При использовании функции strcmp для сравнения введенного пароля с сохраненным ее время выполнения позволяет получить информацию о пароле, поскольку функция завершает работу при обнаружении первого несовпадающего символа между паролем злоумышленника и паролем, установленным в устройстве. Таким образом, время выполнения функции strcmp позволяет понять, сколько начальных символов в паролях совпало (мы подробнее опишем эту атаку в главе 8, а в главе 14 покажем, как реализовать это сравнение).

RAMBleed — еще одна атака по побочным каналам, которую можно запустить из программного обеспечения, как показали Квон и др. в работе RAMBleed: Reading Bits in Memory Without Accessing Them. В работе используется забивание DRAM для чтения битов из памяти. В атаке RAMBleed инверсия битов происходит в строке атакующего в зависимости от данных в строках жертвы. Таким образом, атакующий может узнать, что хранится в памяти другого процесса.

Микроархитектурные атаки

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

Но именно здесь оптимизации скорости и безопасности противоречат друг другу. Если оптимизация связана с каким-то секретным значением, то фактически прямо указывает на него. Например, если умножение N на K для неизвестного K иногда выполняется быстрее, то в этих «быстрых» случаях значение K равно 0 или 1. Или если область памяти кэширована, то получить доступ к ней можно быстрее, поэтому внезапный быстрый доступ к некой произвольной области означает, что к ней уже недавно обращались.

В печально известной атаке Spectre 2018 г. используется оптимизация спекулятивного выполнения. Вычисление ветви кода, по которой должен пойти алгоритм, требует времени. Вместо того чтобы ожидать вычисления условия, спекулятивное выполнение угадывает результат и выполняет ветвь кода, как если бы предположение было правильным. Если догадка верна, то выполнение просто продолжается, а если нет, выполняется откат. Важно здесь то, что спекулятивное выполнение влияет на состояние кэшей ЦП. Spectre заставляет ЦП выполнять спекулятивную операцию, влияя на кэш определенным образом в зависимости от некоего секретного значения, а затем использует атаку по времени кэша, чтобы восстановить это значение. Как показано в работе Spectre Attacks: Exploiting Speculative Execution Пола Кочера и др., мы можем использовать этот трюк в некоторых уже созданных или будущих программах, чтобы сбросить всю память процесса-жертвы. Проблема заключается в том, что процессоры оптимизировались по скорости на протяжении десятилетий, и существует еще множество оптимизаций, которые тоже можно использовать подобным образом.

Атаки на уровне печатной платы

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

Чтобы выполнить атаку на уровне печатной платы, на большинстве устройств достаточно отвертки. В некоторых устройствах реализована физическая защита от несанкционированного доступа и система реагирования на несанкционированный доступ, например в платежных терминалах, сертифицированных по стандарту FIPS (Federal Information Processing Standard, Федеральный стандарт обработки информации) 140 уровня 3 или 4. Обход защиты от несанкционированного доступа к электронным компонентам — интересное занятие, но в этой книге не рассматривается.

Один из примеров атаки на уровне печатной платы — переключение настроек SoC путем вытягивания определенных контактов с помощью перемычек. Последние на печатной плате обозначены как резисторы 0 Ом (резисторы с нулевым сопротивлением) (рис. 1.6). Эти настройки SoC могут позволить включить отладку, загрузку без проверки подписи или другие параметры, связанные с безопасностью.

image

Изменить конфигурацию с помощью добавления или удаления перемычек — тривиальная задача. Хотя современные многослойные печатные платы и устройства поверхностного монтажа становятся все сложнее, для перестановки перемычки вам потребуется лишь твердая рука, микроскоп, пинцет, тепловая пушка и, конечно же, терпение для выполнения задачи.

Еще один полезный вид атаки на уровне печатной платы — считывание чипа флеш-памяти, в котором обычно содержится большая часть программного обеспечения устройства. А это невероятный кладезь информации. Некоторые флеш-устройства поддерживают только чтение, но большинство из них позволяют записывать на них важные изменения в обход функций безопасности. Чип флеш-памяти, скорее всего, проверяет разрешения на чтение с помощью определенного механизма управления доступом, который может быть уязвим к внедрению ошибок.

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

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

Логические атаки


Логические атаки работают на уровне логических интерфейсов (например, взаимодействуя через существующие порты ввода/вывода). В отличие от атак на уровне платы, логические атаки выполняются не на физическом уровне. Логическая атака нацелена на программное или микропрограммное обеспечение встроенного устройства и пытается пробиться через его защиту, не прибегая к физическому воздействию. Это как если бы вы взламывали чей-то дом (устройство), зная, что его хозяин (ПО) имеет привычку оставлять заднюю дверь (интерфейс) незапертой и, следовательно, взлом вовсе не требуется.

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

Отладка и трассировка

Существуют два очень мощных механизма управления, которые встраиваются в ЦП еще при проектировании и производстве, — функции аппаратной отладки и трассировки. Они часто реализуются поверх интерфейса Joint Test Action Group (JTAG) или Serial Wire Debug (SWD). На рис. 1.7 показан открытый порт JTAG.

image

Имейте в виду, что на защищенных устройствах отладка и трассировка могут отключаться с помощью FUSE-битов, перемычки или какого-нибудь особого секретного кода или механизма запроса/ответа. На менее защищенных устройствах просто удаляется только JTAG (подробнее о JTAG — в следующих главах).

Фаззинг

Фаззинг — метод, заимствованный из области программной безопасности и направленный на выявление проблем безопасности в коде. Обычно фаззинг применяется, для того чтобы найти сбои, с помощью которых можно внедрить код. Простой фаззинг сводится к отправке цели разных случайных данных и наблюдению за ее поведением. Надежные и безопасные цели никак не реагируют на такие атаки, а вот менее надежные или менее безопасные устройства могут начать вести себя ненормально или аварийно завершать работу. Анализ аварийных дампов или проверка отладчиком позволяют точно определить источник сбоя и возможность его использования себе на благо. Интеллектуальный фаззинг сосредоточен на работе с протоколами, структурами данных, типичными значениями, вызывающими сбои, или структурой кода. Этот метод более эффективен для моделирования граничных случаев (ситуаций, которые обычно не ожидаются), которые приведут к сбою цели. Фаззинг на основе генерации создает входные данные с нуля, а фаззинг на основе мутаций берет существующие входные данные и изменяет их. В фаззинге на основе покрытия используются дополнительные данные (например, информация о том, какие именно части программы выполняются с определенными входными данными), что позволяет найти более глубокие ошибки.

Фаззинг также можно применять к устройствам, но на гораздо более сложных условиях, чем в случае ПО. Выполняя фаззинг устройства, обычно намного сложнее получить информацию о покрытии работающего на нем программного обеспечения, поскольку у вас попросту меньше доступа к этому ПО. Фаззинг через внешний интерфейс без контроля над устройством не позволяет получить информацию о покрытии, а это иногда мешает понять, удалось ли вообще добиться сбоя.

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

Анализ образов флеш-памяти

В большинстве устройств есть микросхемы флеш-памяти, которые по отношению к основному процессору являются внешними устройствами. Если устройство поддерживает обновление программного обеспечения, то образы прошивки для него зачастую можно найти в интернете. Получив образ, вы можете использовать различные инструменты для его анализа, например binwalk. Эти инструменты позволяют идентифицировать различные части образа, например разделы кода, разделы данных, файловые системы и цифровые подписи.

Наконец, определить возможные уязвимости хорошо помогают дизассемблирование и декомпиляция образов программного обеспечения. Кроме того, была проведена некоторая интересная работа по статическому анализу (например, последовательному выполнению) встроенного ПО устройства. См. статью BootStomp: On the Security of Bootloaders in Mobile Devices Нило Редини и др.

Неинвазивные атаки


Неинвазивные атаки не влияют на чип физически. В атаках по побочным каналам для раскрытия секретов устройства используется анализ некоего измеримого поведения системы (например, измерение энергопотребления устройства для извлечения ключа AES). В атаках по сбоям используется внедрение в аппаратное обеспечение сбоев, позволяющих обойти механизм безопасности. Например, сильный электромагнитный (ЭМ) импульс может отключить проверку пароля, и тогда система примет любой пароль. (Главы 4 и 5 посвящены этим темам.)

Чип-инвазивные атаки


Эти атаки нацелены на корпус чипа или кремний внутри него, работая в миниатюрном мирке проводков и триггеров. Для этого требуются гораздо более сложные, передовые и дорогие методы и оборудование, чем мы обсуждали до сих пор. Такие атаки в данной книге обсуждаться не будут, но ниже представлен обзор того, что могут сделать продвинутые злоумышленники.

Декапсуляция, распаковка и переподключение

Декапсуляция — процесс удаления части корпуса схемы с помощью химии, обычно с использованием нескольких капель дымящейся азотной или серной кислоты, помещенных на корпус чипа, чтобы он растворился. В результате получается дырка в корпусе, через которую можно осмотреть саму микросхему, и если сделать это правильно, то микросхема останется работоспособной.
ПРИМЕЧАНИЕ

Декапсуляцию можно выполнять даже дома, если есть подходящая вытяжка и другие средства безопасности. Если вы смелый, ловкий и умелый, то Евангелие от PoC||GTFO от No Starch Press подробно расскажет вам о том, как выполнять декапсуляцию в домашних условиях.
При распаковке вы макаете весь корпус в кислоту, после чего оголяется буквально весь чип. Вам нужно будет заново приклеить чип, чтобы восстановить его функциональность, а для этого придется подсоединить крошечные провода, которые обычно соединяют чип с выводами корпуса (рис. 1.8).

image

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

Микрообразы и реверс-инжиниринг

После вскрытия чипа первым делом нужно определить его крупные функциональные блоки и найти среди них интересующие вас. На рис. 1.2 показаны примеры структур. Самые большие блоки на кристалле — это память, например статическая оперативная память (static RAM, SRAM), в которой хранятся кэши процессора (или тесно связанная память), и ПЗУ для загрузочного кода. Любые длинные, преимущественно прямые пучки линий — это шины, соединяющие ЦП и периферию. Знание относительных размеров и того, как выглядят те или иные компоненты, уже позволяет вам заняться реверс-инжинирингом чипа.

Когда чип снят, как на рис. 1.8, вам виден только верхний металлический слой. Чтобы разобрать весь чип, нужно будет расслоить его, с помощью полировки снимать его слои, чтобы обнажить следующий слой.

На рис. 1.9 показано поперечное сечение чипа на комплементарном металл-оксид-полупроводнике (КМОП). На таких чипах построено большинство современных устройств. Как видно на рисунке, у чипа есть несколько слоев и переходных отверстий из меди, которые соединяют транзисторы (поликремний/подложка). Самый нижний слой металла используется для создания стандартных ячеек, на которых из ряда транзисторов формируются логические элементы (И, исключающее ИЛИ и т. д.). Верхние слои обычно используются для разводки питания и синхронизации.

image

На рис. 1.10 показаны фотографии слоев внутри типичного чипа.

image

Получив качественный образ чипа, можно восстановить список соединений из образов или двоичного дампа загрузочного ПЗУ. Список соединений — это, по сути, описание того, как взаимосвязаны логические вентили, на которых держится вся цифровая логика проекта. И список соединений, и дамп загрузочного ПЗУ позволяют атакующим находить слабые места в коде или конструкции микросхемы. В работах Bits from the Matrix: OpticalROM Extraction Криса Герлински и Integrated Circuit Offensive Security Оливье Томаса, представленных на конференции Hardwear.io 2019, дано хорошее введение в тему.

Сканирующий электронный микроскоп

Сканирующий электронный микроскоп (СЭМ) выполняет растровое сканирование объекта с помощью электронного луча и снимает измерения с электронного детектора, формируя затем изображения сканируемой цели с разрешением мельче 1 нм, что позволяет разглядеть даже отдельные транзисторы и соединения. Из полученных изображений можно создавать списки соединений.

Внедрение оптических ошибок и анализ оптического излучения

Когда поверхность чипа открыта и видна, можно «побаловаться с фотонами». Из-за эффекта люминесценции горячих носителей переключающие транзисторы иногда светятся. С помощью ИК-чувствительного датчика на устройстве с зарядовой связью (ПЗС), подобного тем, которые используются в любительской астрономии, или лавинного фотодиода (ЛФД) вы можете определить активные области чипа по испускаемым из них фотонам, что тоже помогает в реверс-инжиниринге (а если точнее, в анализе побочных каналов). Например, с помощью измерений фотонов вы можете определять секретные ключи. См. работу Simple Photonic Emission Analysis of AES: Photonic Side Channel Analysis for the Rest of Us Александра Шлёссера и др.

Помимо использования фотонов для наблюдения за процессами, с их помощью также можно внедрять ошибки за счет изменения проводимости затворов. Это называется оптическим внедрением ошибок (подробнее о нем поговорим в главе 5 и в приложении А).

Редактирование сфокусированным ионным пучком и микрозондирование

Сфокусированный ионный пучок (focused ion beam, FIB) — это техника, в которой либо для удаления частей чипа, либо для нанесения материала на чип в нанометровом масштабе используется ионный пучок, что позволяет злоумышленникам обрезать соединения чипа, прокладывать новые соединения или подготавливать контактные площадки для микрозондирования. Редактирование FIB требует времени и навыков (и дорогого прибора FIB), но, как вы уже поняли, этот метод позволяет обойти сложные аппаратные механизмы безопасности, если злоумышленник сможет перед этим их обнаружить. Цифрами на рис. 1.11 обозначены отверстия, созданные FIB для доступа к нижним слоям металла. «Шляпки» вокруг отверстий созданы для обхода активной защиты.

image

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

Итак, мы рассмотрели ряд различных атак, связанных со встроенными системами. Помните, что любой атаки достаточно, чтобы скомпрометировать систему. Однако стоимость и навыки, необходимые для проведения разных атак, сильно различаются, поэтому важно понять, какую именно цель мы атакуем. Сопротивляться нападению хакера, имеющего бюджет в миллион долларов, и сопротивляться любителю, в распоряжении которого 25 долларов и экземпляр этой книги, — совершенно разные по сложности вещи.
Об авторах
Колин О’Флинн является руководителем стартапа NewAE Technology, Inc. — компании, которая разрабатывает инструменты и оборудование для обучения инженеров, занимающихся вопросами безопасности встроенных систем. При написании своей докторской диссертации Колин запустил проект ChipWhisperer с открытым исходным кодом. Кроме того, ранее он был доцентом в Университете Далхаузи, где преподавал курс о встраиваемых системах и безопасности. Живет в Канаде, в городе Галифакс. Вместе с NewAE участвовал в разработке множества продуктов.

Джаспер ван Вуденберг занимался безопасностью встроенных устройств в широком диапазоне тем: поиск и помощь в исправлении ошибок в коде, работающем на сотнях миллионов устройств, извлечение ключей из неисправных криптосистем с помощью символьного исполнения, использование алгоритмов распознавания речи при обработке побочных каналов. Джаспер — отец двоих детей и заботливый муж. Занимает должность технического директора в компании Riscure North America. Живет в Калифорнии, любит кататься на велосипеде по горам и на сноуборде. У Джаспера есть кот, который его терпит, но он слишком крут для Twitter.
О научном редакторе
Патрик Шомон — профессор вычислительной техники Вустерского политехнического института. Ранее был штатным исследователем в IMEC в Бельгии, а также преподавателем в Технологическом институте Вирджинии. Интересуется вопросами проектирования и методами проектирования безопасных эффективных встроенных вычислительных систем, работающих в режиме реального времени.

Более подробно с книгой можно ознакомиться на сайте издательства:
» Оглавление
» Отрывок

По факту оплаты бумажной версии книги на e-mail высылается электронная книга.
Для Хаброжителей скидка 25% по купону — Хакинг

Комментарии (3)


  1. programmerjava
    06.06.2023 09:58
    +1

    Таких книг бы по-больше.

    Даже не являясь специалистом в этой области я бы взял почитать эту книгу на досуге. Тема интересна


    1. Brak0del
      06.06.2023 09:58

      Таких книг бы по-больше.

      Так есть же. Например у Эндрю "bunnie" Хуанга: "The Hardware Hacker" и "Hacking the Xbox"



      1. programmerjava
        06.06.2023 09:58

        Спасибо, добавил в избранное