Введение в реверс прошивок
Добрый день мои белые кролики, всех с наступающим новым годом !🐰🎄
Захотелось сделать маленькую серию постов про реверс прошивки .

В ней будет несколько частей. Эта часть введение . В последующих будут затронуты конкретные модели прошивок
Что такое это ваш реверс прошивок ?

Сама прошивка это тип программного обеспечения, которое обеспечивает связь и управление аппаратными компонентами устройства. Это первый фрагмент кода, который запускается на устройстве. Обычно она загружает операционную систему и предоставляет специфические услуги по выполнению программ, взаимодействуя с различными аппаратными компонентами🔌
Многие устройства, которое вы используете, будут взаимодействовать с прошивкой.
Ее можно рассматривать как фактический код, который работает на IoT или встроенном устройстве.
Реверс прошивки включает в себя разборку и понимание внутренней работы устройства. 🔒
Это может варьироваться от простого анализа, такого как изучение различных аспектов устройства, таких как его файловая система и различные интерфейсы, до глубокого изучения самой прошивки и раскрытия внутренних деталей и алгоритмов прошивки.
Реверс прошивки полезен, ибо может привести к обнаружению различной важной информации об устройстве, такой как жестко закодированные данные, недостатки безопасности в различных критических алгоритмах и даже учетные данные для входа.
Прошивка может содержать информацию, такую как ключи шифрования, ключи API и другие жестко запрограммированные секреты.
Мы могли бы изменить прошивку и прошить устройство нашим исправленным кодом, чтобы изменить интересную логику в чипе.
При работе с паршивками вам придется разбираться в различных внутренних механизмах устройства.
Одним из важных аспектов устройства является его архитектура.
Большинство встроенных систем используют архитектуру RISC, поскольку в ней используются небольшие и оптимизированные инструкции, они обычно занимают меньшее количество тактов по сравнению с компьютерами, которые могут выполнять сложные задачи за один такт.
Четкое понимание архитектуры устройства важно для понимания внутренней работы устройства.
Какие бывают устройства с прошивками?

Устройства с прошивками делятся на несколько классов
Устройства на базе микроконтроллеров используются не только в сенсорных сетях. Они повсюду, от холодильника, микроволновой печи, охранной сигнализации, в вашем автомобиле их десятки, как и в вашем ноутбуке/компьютерах.
Обычно, когда у вас нет исходного кода для этой прошивки, вы прибегаете к обратному инжинирингу.
Сетевые устройства
Роутеры, коммутаторы, сетевые хранилища, VoIP-телефоны
Наблюдение - сигнализации, камеры, CCTV, DVRs, NVRs
Промышленная автоматизация - ПЛК, электростанции, промышленность
Мониторинг и автоматизация процессов
Датчики, умные дома, Z-Waves
Бытовые вещи
Бытовая техника - стиральные машины, холодильники, сушильные машины
Развлекательное оборудование - телевизор, видеорегистраторы, ресивер, стереосистема, игра
Консоли, MP3-плееры фотоаппараты, мобильный телефоны, игрушки
Другие сложные устройства
Жесткие диски, принтеры
Автомобили
Медицинские приборы
В зависимости от архетектуры, устройства используется технологический стек.
Реверсирование двоичных файлов прошивки немного отличается от реверсирования файлов Windows EXE и Linux ELF. У них нет предопределенной структуры.
Для двоичных файлов с «голым железом» вам понадобится техническое описание набора микросхем и создать карту памяти в вашем инструменте дизассемблирования, таком как IDA, Ghidra и тд, чтобы получить надлежащий дизассемблирование.
Карта памяти также помогает пользователям ответить на еще один очень важный вопрос: с какими GPIO и другими периферийными устройствами взаимодействует устройство. Эта информация в свою очередь поможет понять функциональность устройства.
На самом деле нам нужны специальные инструменты для быстрого поиска определенной информации перед загрузкой прошивки в наш любимый дизассемблер:
Порядок байтов архитектуры, потому что лучше знать, как значения хранятся в памяти
Базовый адрес, по которому загружается содержимое прошивки
В каких случаях какие прошивки используются?
Если вы рассматриваете для реверса устройство, с простыми задачами(к примеру регулирование температуры или света) , для него не потребуется какое-то сложное программное обеспечение, такое как Linux.
В этих случаях часто используется прошивка Bare-Metal.
Но что такое прошивка Bare Metal?
Проще говоря, этот тип прошивки напрямую взаимодействует с оборудованием, без участия драйвера или ядра.
Прошивка Bare Metal не делает много сложных вещей, перед ними обычно ставится не более 3 или 4 задач, и эти задачи помещаются в цикл, поскольку они запланированы для запуска в определенном порядке/условии. SDK, предоставленный поставщиком для этих устройств, предоставляет методы жизненного цикла, которые программист записывает, эти функции выполняются в цикле
Некоторыми небольшими вариантами сложных функций этих SDK являются FreeRTOS, mbed-os, они представляют собой операционные системы реального времени, которые позволяют вам выполнять планирование задач и очень быстро реагировать на некоторые запросы
Когда вы видите более сложные системы, такие как маршрутизаторы, умные домашние панели, дроны и медицинские устройства, они делают немногим больше, чем то, что делают системы с нуля.
Возьмем, например; типичный беспроводной роутер он имеет такие функции, как подключение по локальной сети и Wi-Fi, они могут заносить в черный или белый список определенные MAC-адреса, а некоторые современные маршрутизаторы имеют антивирусное программное обеспечение и другие функции защиты. Для реализации всех этих функций вам нужна полноценная операционная система, поддерживающая все эти сложные функции.
Общая статистика говорит, что наиболее популярным выбором ОС среди встраиваемых системных продуктов является Linux.
Для этого есть много причин, некоторые из которых - открытый исходный код, гибкость. Да и вообще линукс это весьма крутая система .
Вы можете найти устройства на базе Linux, такие, как интернет-роутеры, информационно-развлекательные системы и тд.
Прошивки такого типа обычно содержат как минимум три компонента: загрузчик, ядро и файловую систему📟
Загрузчик — это часть программного обеспечения, которая помогает загружать операционную систему, ядро и передает различные информационные потребности.
Как только загрузчик завершит выполнение, ядро вступит во владение.
Как только ядро начинает выполняться, оно запускает другие пользовательские приложения, чтобы сделать операционную систему пригодной для использования конечным пользователем.
Обычно это включает в себя запуск различных приложений и служб в фоновом режиме.
Как только все это будет сделано, пользователь сможет взаимодействовать с системой. Все пользовательские приложения и данные приложений хранятся в файловой системе.
Как говорилось ранее прошивки сильно привязаны к конкретной архитектуре, использующей данный процессор со своими собственными периферийными устройствами и коммуникационными шинами, со своими характеристиками и особенностями, что делает обратный инжиниринг утомительной задачей. Эту информацию можно найти в документации по архитектуре, если она доступна.
Рассмотрим несколько важных аппаратных архитектур

Самые популярные это:
ARM
Процессоры ARM представляют собой семейство центральных процессоров (ЦП), основанных на архитектуре компьютера с сокращенным набором команд (RISC). ARM расшифровывается как Advanced RISC Machine. Архитектуры ARM представляют собой другой подход к проектированию аппаратного обеспечения системы по сравнению с более привычными серверными архитектурами, такими как x86.
Общие инструкции таковы:
Арифметические и логические операции: ADD, SUB, MUL, LSL, ROR, и тд
Загрузить операции сохранения: LDR, LDM, STR,STM
Отраслевые операции: B, BL, BX,BLX . Операция перехода может использоваться с условным выполнением
Пример кода "привет мир" с этой архитектурой:
.data
msg:
.ascii "Hello world!\n"
len = . - msg
.text
#Точка входа нашего приложения
.globl _start
_start:
mov %r0, $1
ldr %r1, =msg
ldr %r2, =len
mov %r7, $4
swi $0
mov %r0, $0
mov %r7, $1
swi $0
MIPS
MIPS — это архитектура с уменьшенным набором инструкций RISC, которая в основном используется во встроенных системах, таких как шлюзы и маршрутизаторы. MIPS имеет 32 регистра общего назначения.
Термин MIPS является аббревиатурой от Microprocessor Without Interlocked Pipeline Stages. Это архитектура с сокращенным набором инструкций, разработанная организацией MIPS Technologies.
MIPS очень полезен для изучения, поскольку многие встраиваемые системы работают на процессоре MIPS.
Основные инструкции таковы:
Общие арифметические операции: add, addu, sub, subu, mult,dev
Инструкции по загрузке и хранению: la, lb, lw, sw,sb
Ветви и условные ветки: b, beq, bne, ble, bge, и т.д.
Переходы и вызовы функций: j, jal,jr
Пример "привет мир" на нем
.data
out_string: .asciiz "\nHello, World!\n"
.text
main:
li $v0, 4
la $a0, out_string
syscall #вызвать операционную систему для выполнения операции
li $v0, 10 # li загружает определенное числовое значение в регистр
syscall
Atmel AVR
AVR — это 8-битная RISC-архитектура, которая в основном используется в автомобильных приложениях, системах безопасности и развлечениях. AVR также является архитектурой, используемой платами разработки Arduino.
Общие инструкции:
Арифметические операции: add, addc, sub, subc
Ввод/вывод: in, out
Операции загрузки и хранения: ld, ldi, lds, st,sts
Пример кода на нем:
.include "./m328Pdef.inc"
ldi r16,0b00100000
out DDRB,r16
out PortB,r16
Start:
rjmp Start
RISC-V
RISC-V — это бесплатная и открытая ISA , основанная на установленном RISC. RISC-V ISA использует архитектуру загрузки-хранилища.
Он содержит целочисленные и логические инструкции, а также несколько инструкций памяти . RISC-V представляет собой архитектуру загрузки/сохранения, поэтому целочисленные операнды инструкций должны быть регистрами.
Общие инструкции таковы:
Арифметические операции: ADD, ADDI, SUB,LUI
Отраслевые операции: BEQ, BNE, BLT,BGE
Загрузка операций хранилища: LB, LH, LW, LBU,LHU
Пример "привет мир" на нем :
.global _start
_start:
addi a0, x0, 1
la a1, helloworld
addi a2, x0, 13
addi a7, x0, 64
ecall
addi a0, x0, 0
addi a7, x0, 93
ecall
.data
helloworld: .ascii "Hello World!\n"
Вообще архитектур в разы больше , я привела довольно известные , а вы смотрите в зависимости от ваших прошивок .
Постарайтесь изучить основные части архитектуры, такие как концепции основных инструкций и их программный поток. Хороший способ ознакомиться с различными архитектурами — написать простой код высокого уровня, а затем сравнить его с соответствующей сборкой.
Так же хочу привести иструменты

Это быстрый и простой в использовании инструмент для анализа, обратного проектирования и извлечения образов микропрограмм. Это инструмент для извлечения прошивки, он пытается извлечь двоичные файлы из любого бинарного блоба. Он делает это путем поиска сигнатур для многих распространенных форматов двоичных файлов, таких как zip, tar, exe, ELF и тд.
Binwalk имеет базу данных сигнатур двоичных заголовков, по которым выполняется сопоставление сигнатур. Общей целью использования этого инструмента является извлечение файловой системы, такой как Squashfs, yaffs2, Cramfs, ext*fs, jffs2 и тд, которая встроена в двоичный файл прошивки.
Файловая система содержит весь код приложения, который будет работать на устройстве.
Этот инструмент также имеет множество параметров, которые вы можете настроить, чтобы улучшить извлечение.
Неплохие инкременты и заметки по реверсу . Для начинающих будет полезно
Сборник различных полезных инструментов по реверсу прошивок
Это проект который направлен на перепроектирование базового ядра и оборудования PSP для создания актуальной технической документации системы, а также для предоставления бесплатной прошивки с открытым исходным кодом.
Еще один очень крутой тред инструментов по реверсу прошивок
Это ценный инструмент для людей, работающих в кросс-архитектурной среде (например, ARM, MIPS и т. д.), что обычно имеет место для разработчиков встраиваемых систем. Этот инструмент позволяет эмулировать двоичную прошивку для различных архитектур, таких как ARM, MIPS и т. д., в хост-системе, которая имеет различные архитектуры, такие как x86, amd64. Такой инструмент удобен, когда вы хотите проверить прошивку, но у вас нет устройства или настройка отладчика для этой системы очень сложна.
Это набор инструментов, помогающих отменить прошивку на основе UEFI. Инструменты для дампа памяти UEFI.
Существует патч против EdkShell , который делает memmap-дамп памяти команды, передает его в файл с именем mdmp. Затем запустите, dmp2segчтобы преобразовать этот выходной файл во множество файлов с фактическим содержимым памяти. Затем запустите, make_elf.rb, чтобы создать один файл ELF со всем содержимым памяти. Файл ELF не является исполняемым или чем-то еще, это просто удобный формат для хранения сегментов памяти.
Инструменты и скрипты для реверс-инжиниринга прошивки
Этот инструмент поможет вам исправить прошивку и переупаковать ее. Он извлекает прошивку с помощью Binwalk и предоставляет вам каталог, в котором находится файловая система прошивки. Затем вы можете пропатчить все, что хотите, добавить/удалить файл или пропатчить существующий, а ModKit может упаковать его обратно, чтобы вы могли прошить новую прошивку в хранилище устройства и загрузить только что пропатченную прошивку
Эта подпрограмма полезна для определения того, какие области файла, вероятно, 8051. Если вы хотите определить архитектуру файла в целом, полезным инструментом может быть cpu_rec .
Эта подкоманда делает некоторую статистику по прошивке. Он проходит через файл, как если бы это был непрерывный поток инструкций, и выполняет некоторые проверки этих инструкций. Изображение разбивается на блоки одинакового размера и возвращается значение теста для каждого блока (который по умолчанию имеет размер 512). Он обычно больше подходит для больших изображений (в этом контексте, что-то вроде> 4 КБ), где вы хотите знать, какие области, вероятно, являются кодами 8051, а какие — данными.
Это среда обратного проектирования для Polyend Tracker, написанная на Python. Он основан на неофициальных патчах, которые применяются к стоковой прошивке производителя. Эти исправления вводят собственный обработчик USB, заменяя существующий, но неиспользуемый обработчик USB RAWHID в Tracker.
Автоматизированная платформа для эмуляции и анализа встроенных прошивок на базе Linux
Итог

Как вы видите реверс прошивок довольно большая тема .
В нее входит множество прошивок и их архитектур , в этой небольшой статье мы затронули базовые архитектуры, а так же инструменты.
В будущем я буду развивать эту тему на конкретных примерах прошивок
А на этом все , статьи и материалы будут в архиве ниже .
Там будут материалы по архитектурам из этой статьи , а так же по реверсу прошивок. Надеюсь вам будет полезно.
Спасибо за прочтение❤️

Под конец года хочу еще раз поздравить всех с праздниками .
Я очень рада, что вы со мной!❤️🔥
Если Алиса гонится за белым кроликом он неминуемо попадет в страну чудес .Но сможет ли она от туда выйти ?🕳🐇