
원시 바이너리 펌웨어 분석 소프트웨어
이 프로젝트의 목적은 원시 바이너리 펌웨어를 분석하여 일부 특징을 자동으로 결정하는 것입니다. 이 도구는 기본적으로 단순한 통계를 수행하므로 모든 아키텍처와 호환됩니다.
주요 기능:
먼저, git 저장소를 클론합니다:
git clone https://github.com/quarkslab/binbloom.git
cd binbloom
최신 버전(리눅스 전용)을 빌드하려면:
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, 리틀 엔디언)을 표시하고, 여섯 번째 줄은 추정된 주소(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임을 보여줍니다.
작은 펌웨어(크기 < 10KB)를 다룰 때 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)
[...]
그러면 엔디언이 강제로 지정되고(이 경우 빅 엔디언) 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;
}
이 분석은 휴리스틱에 기반하므로 위양성(false positive)이 발생할 수 있습니다. binbloom이 찾은 잠재적 UDS 데이터베이스 목록을 읽고, 정확한 것이 있는지 확인해야 합니다. binbloom은 출력에서 식별된 구조를 제공하여, 일부 디스어셈블러가 구조체 선언 다음의 메모리를 구문 분석할 수 있게 합니다.
-t 옵션으로 멀티스레딩을 활성화하여 기본 주소 검색 과정을 가속화할 수 있습니다. 기본적으로 단일 스레드가 사용됩니다.
binbloom -t 8 firmware.bin
-d 옵션으로 활성화되는 깊은 검색 모드도 구현되어 있지만 아직 실험적입니다. 이 모드는 다른 방법이 작동하지 않을 때 유효한 기본 주소를 찾을 수 있지만, 느린 모드이므로 완료하는 데 시간이 걸릴 수 있는 매우 드문 경우에 유용할 수 있습니다.
도구가 더 많은 정보를 표시하도록 하려면 -v 옵션을 한 번 이상 사용하십시오.
binbloom은 Apache 2.0 라이선스에 따라 제공됩니다.