
Программное обеспечение для анализа сырых бинарных прошивок
Цель этого проекта — анализировать сырую двоичную прошивку и автоматически определять некоторые её характеристики. Этот инструмент совместим со всеми архитектурами, поскольку, по сути, он просто выполняет простые статистические операции.
Основные возможности:
Сначала клонируйте git-репозиторий:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
Для сборки последней версии (только Linux):
autoreconf -i
./configure
make
sudo make install
binbloom firmware.bin
Эта команда должна выдать вывод, похожий на этот:
[i] 32-bit architecture selected.
[i] File read (20480 bytes)
[i] Endianness is LE
[i] 6 strings indexed
[i] Found 3 base addresses to test
[i] Base address seems to be 0x60000000 (not sure)
More base addresses to consider (just in case):
0x005b5000 (0)
0x0bcd0000 (0)
В этом выводе третья строка отображает предполагаемый порядок байтов (LE, little-endian), а шестая строка даёт предполагаемый адрес (0x60000000). Было идентифицировано 6 текстовых строк и 3 возможных базовых адреса. Если архитектура не указана, по умолчанию предполагается 32-битная архитектура.
Значение в скобках после каждого адреса-кандидата — это соответствующий балл. Чем выше балл, тем более вероятен адрес.
binbloom -a 64 firmware.bin
[i] 64-bit architecture selected.
[i] File read (327680 bytes)
[i] Endianness is LE
[i] 717 strings indexed
[i] Found 7535 base addresses to test
[i] Base address found: 0x0000000000010000.
More base addresses to consider (just in case):
0x000000000000e000 (276)
0x000000000000f000 (242)
0x0000000000011000 (175)
0x000000000000d000 (167)
0x000000000000b000 (121)
0x0000000000013000 (107)
0x0000000000012000 (100)
[...]
Опция -a указывает binbloom рассматривать 64-битную прошивку; приведённый выше вывод показывает предполагаемый базовый адрес 0x10000.
При работе с маленькими прошивками (размер < 10 Кбайт) определение порядка байтов binbloom может быть ненадёжным и давать ложные результаты, что приводит к неожиданным базовым адресам. В этом случае можно использовать опцию -e, чтобы указать порядок байтов:
binbloom -e be firmware.bin
Затем он выдаёт следующий вывод:
[i] Selected big-endian architecture.
[i] File read (1048576 bytes)
[i] Endianness is BE
[i] 764 strings indexed
[i] Found 18615 base addresses to test
[i] Base address seems to be 0x00000000 (not sure).
More base addresses to consider (just in case):
0x3f740000 (121043)
0x7ff48000 (61345)
0x41140000 (59552)
[...]
Затем порядок байтов принудительно задаётся (в данном случае big-endian), и binbloom опирается на эту конфигурацию для угадывания базового адреса.
binbloom -a 32 -e be -b 0x0 firmware.bin
[i] 32-bit architecture selected.
[i] Selected big-endian architecture.
[i] Base address 0x0000000000000000 provided.
[i] 764 strings indexed
Most probable UDS DB is located at @000ee8c8, found 7 different UDS RID
Identified structure:
struct {
code *p_field_0;
code *p_field_1;
uint32_t dw_2;
}
Этот анализ основан на эвристиках, поэтому он может давать ложные срабатывания. Вам нужно просмотреть список потенциальных баз данных UDS, найденных binbloom, и проверить, какая из них верна, если таковая имеется. Binbloom предоставляет идентифицированную структуру в своём выводе, что позволяет некоторым дизассемблерам анализировать память в соответствии с объявлением структуры.
Вы можете ускорить процесс поиска базового адреса, включив многопоточность с помощью опции -t. По умолчанию используется один поток.
binbloom -t 8 firmware.bin
Также реализован режим глубокого поиска, включаемый опцией -d, но он всё ещё экспериментальный. Этот режим может быть полезен в очень редких случаях, так как он может найти действительный базовый адрес, когда другие методы не работают, но он медленнее и может занять некоторое время.
Если вы хотите, чтобы инструмент отображал больше информации, используйте одну или несколько опций -v.
binbloom предоставляется под лицензией Apache 2.0.