Основываясь на своем опыте и боли, собрал некоторую информацию, какой минимум необходим для реверса UEFI-образов. Я не уверен, что лычка "статья" нам подходит, поэтому, модераторы знают, что сделать, если у них появятся сомнения.
Оглавление
1. Достаем образ UEFI
1.1 Chipsec
1.2 RWeverything (Intel only)
1.3 Сайты вендоров комплектующих
2. Необходимые инструменты
2.1 Дизассемблеры
2.2 Плагины для дизассемблеров
2.2.1 efiXplorer & efiXloader (IDA)
2.2.2 efiSeek (Ghidra)
2.3 UEFITool
3. Эмуляция и отладка
4. На что стоит опираться
Достаем образ UEFI
Чтоб начать анализировать/реверсить UEFI-образ (или прошивку), нам необходимо достать её. Я насчитал несколько способов, как это можно сделать, у каждого безусловно есть свои плюсы и минусы, какой удобнее - решать вам.
Chipsec
Chipsec - это инструмент, позволяющий сделать дамп UEFI для его последующего анализа, помимо этого, Chipsec также имеет собственное API для работы с модулями UEFI. Также, Chipsec может с другими компонентами платформы, включая хардварь. Инструмент является кроссплатформенным, а также может запускаться в UEFI Shell (графическая оболочка командной строки), единственная сложность у вас будет с его установкой, так как установка везде разная в зависимости от ОС. К примеру, если вы пользуетесь Windows, то вам будет необходимо отключить DSE и TSM (делается это не сложно), так как Chipsec имеет собственные драйверы. естественно, не подписанные (насколько я помню). Более подробно об установке расписано в их собственном мануале.
Для нас, это, наверное, лучший вариант, так как прошивка будет "в чистом виде", без всяких паддингов и прочего. Chipsec рекомендуется запускать на отдельных системах, которые выступают в роли "отладочных", хотя, конечно, если вам не жалко, можете и на своей машине попробовать, но я сам бы не рекомендовал, ибо я так тоже однажды убил свою систему (драйвера Wacom делают чудеса, ведь это было как раз из-за них).
RWEverything (Intel Only)
RWEverything тоже весьма мощный инструмент, позволяющий производить запись и чтение на достаточно низком уровне ОС. Забавно, но через него также можно сдампить UEFI. Более подробно это расписано в переводе статьи от Яши - http://xssforum7mmh3n56inuf2h73hvhnzobi7h2ytb3gvklrfqm7ut3xdnyd.onion/threads/43125/
К сожалению, RWEverything работает только с процессорами Intel, так что обладатели AMD проходят мимо (как и я, собственно)
Сайты вендоров комплектующих
Логично, вендоры также предоставляют всякие обновления UEFI/BIOS, поэтому, мы можем брать образы для наших с вами дел. Не самый лучший вариант, но если ничего другое мы реализовать не можем, тогда только так. Из минусов, это то, что у нас остаются AMI Aptio Capsule и LZMA-хидеры, но, зато не надо биться с тем же Chipsec.
Из минусов, мною замеченных, вы вряд ли сможете достать какие-либо отдельные модули. У меня, к сожалению, так не получилось с модулями PEI (Pre-EFI Initialization) и DXE (Driver Execution Environment), но с DXE не сработает, только если доставать их через UEFITool, о котором мы поговорим позднее.
Необходимые инструменты
После того, как мы смогли достать образ UEFI, нам необходимо понять, чем же мы будем анализировать прошивку, как с ней работать и всё-всё-всё. В этом топике мы поговорим, какой-минимум инструментов нам может пригодиться, ну и соответственно какие инструменты использую я сам.
Дизассемблеры
Дизассемблер - это основной инструмент, с которым мы будем работать на протяжении всех наших дел с UEFI. Выбор у нас между двух таких фиговин: IDA и Ghidra. Почему только они? Потому что другие не очень либо совсем не справляются с нашей задачей, а также не имеют возможности работы с плагинами. Скорее всего у вас уже есть что-то одно из предложенного, так что здесь я долго останавливаться не буду, что вам удобно, то и используйте.
Плагины для дизассемблеров
К сожалению, дизассемблеры не умеют в анализ UEFI «из коробки», поэтому, на помощь приходят плагины, созданные коммьюнити. Сперва поговорим об IDA.
efiXplorer & efiXloader
Два данных плагина для IDA позволяют нам полностью прочувствовать всю боль.
efiXloader – лоадер-плагин, отвечающий за правильный процессинг UEFI драйверов в контексте IDA. efiXloader умеет в определение входных точек DXE-драйверов, а также может «распаковывать» драйвера UEFI и складывать их в отдельную папку (рядом с анализируемым образом), что очень удобно бывает, когда нужно проанализировать что-то отдельно. Помимо этого также предоставляет возможность более удобной навигации по драйверам, что безусловно круто.
Результат работы efiXloader по извлечению драйверов
efiXplorer – плагин для анализа UEFI, весьма мощный инструмент, позволяющий определять сервисы, GUID, структуры и прочие начинки UEFI спецификации, а также читать NVRAM. Помимо этого, efiXplorer может и сам искать уязвимости в драйверах по определенным паттернам, но с этим стоит быть аккуратнее, так как могут попасться "false-positive уязвимости", банальный пример – SMMCallout, работающий в контексте SMMHandler.
Результат работы efiXplorer на примере сервиса EFI_BOOT_SERVICE
efiSeek
Это плагин для Ghidra, по сути он мало чем отличается от efiXplorer. Он также может находить сервисы, протоколы, GUID, и прочее. Ничего необычного в нем нет, но если вы пользуетесь Ghidra – он вам определенно поможет.
UEFITool
Небольшая тулза, которая может парсить, извлекать и изменять UEFI-образы. Весьма простая, но полезная, если необходимо что-то сделать с образом или просмотреть сигнатуры и принадлежность модулей к чему-либо.
Эмуляция и отладка
Несмотря на все сложности, мы можем эмулировать целую прошивку. А также, если мы занимаемся разработкой под UEFI, мы можем эмулировать UEFI Shell, но это в другой раз. Здесь все зависит от вашего оборудования, умений и желания.
Для эмуляции нам понадобится QEMU, как «база» для всех модулей, входящих в наш «эмулятор», собственно, QEMU это «full system emulator». На базе QEMU будет использоваться Unicorn, для эмуляции CPU (в нашем случае x86_64), это нас избавит от морок с какими-либо околохардварными проблемами.
Однако, это не даст нам эмулировать бинарные файлы, так как Unicorn изначально не предоставляет такие возможности. Зато такие возможности предоставляет Qiling Framework, который может запускаться в контексте Unicorn, следовательно и эмулировать бинарные файлы, единственное, что нам необходимо сделать – настроить Qiling на возможность эмуляции UEFI-модулей.
В конце концов, мы также можем эмулировать и наши вещи, не относящиеся к UEFI, например – фаззеры, ведь фаззинг это весело!
Более подробно об этом можно почитать в этой статье.
Если у вас есть дополнительное оборудование, а также лишний ПК/ноутбук, вы можете заниматься отладкой почти напрямую, не заморачиваясь с эмуляцией, превратив лишнюю систему в «slave». В зависимости от процессора, у нас есть возможность нащупать JTAG (Joint Test Action Group), а также работать через USB3 (USB3 Hosting DCI). При активации DCI на нашей «дебаг-системе» порт USB3 также переходит в режим «slave» и начинает принимать команды от хоста. В зависимости от производителя и серии процессора способы активации DCI могут отличаться друг от друга. Для Intel активация может быть произведена тремя путями: через EFI HII (EFI Human Interface Infrastructure), Intel Image Flash Tool и P2SB.
На что стоит опираться
Конечно, картина может быть не полной, это нормально. В какой-то момент вы можете столкнуться с вопросами, по типу: «А что делает это, а что делает то?», «Что за параметр у этой функции?» и т.п. Это вполне нормальные вопросы.
Главным вашим помощником будет спецификация UEFI (желательно смотреть самые последние редакции спецификации), это официальная спецификация, описывающая стандарт и его условности. Она будет для вас словно «Библия» (как и для разработчиков), поэтому, если у вас возникают какие-то вопросы по поводу чего-либо – опирайтесь на нее, очень большая вероятность, что вы найдете ответ именно в спецификации.
2540 страниц чистой агонии
Второй вашей опорой может послужить EDKII, конкретно – Driver Writer's Guide. Он не покрывает все огрехи, но поможет вам разобраться в некоторых условностях работы UEFI, а также в функциях UEFI. Если вам необходимо понять, что делает та или иная функция и у вас нет времени рыться в сорцах EDKII, то это самое оно.
Иногда бывает так, что может попасться какой-нибудь странный GUID, который нигде не был замечен до этого ранее. К счастью, коммьюнити отслеживаются GUID, поэтому можно легко найти интересующий вас, к примеру, вы можете найти такой в репозитории ProcessHacker.
В конце концов, вам также поможет банальный гуглеж ваших вопросов или функций/сервисов, скорее всего ваш вопрос уже был когда-то задан на форумах или где-либо еще.
Мне никогда не равилось, что я пишу.
Автор: atavism
Последнее редактирование: