임베디드 기기를 분석하고자 할때, 가장 먼저 펌웨어를 얻어야 한다.
제조사에서 펌웨어를 제공하는 경우도 있겠지만, 그렇지 않다면 물리적인 접근을 통해 펌웨어를 추출해야 한다.
대표적으로 UART를 연결해서 펌웨어를 추출하기도 하지만, ROM 자체에 SPI 통신을 통해 펌웨어를 추출할 수도 있다.
SPI 통신으로 펌웨어를 추출하는 과정을 정리하고자 한다.
라즈베리파이 SPI 활성화
라즈베리파이는 기본적으로 SPI가 활성화 되어 있지 않다.
따라서, 펌웨어 추출전에 SPI를 활성화 시켜주는 작업이 필요하다.
$ sudo raspi-config
전원을 키고 위 명령어를 치면, 다음과 같은 창이 뜬다.
Advanced Options - Network Interface Names 를 선택하면 위와 같은 창이 나온다.
SPI를 선택하여 Enable 시켜주고, 라즈베리파이를 재부팅한다.
$ ls /dev/*spi*
/dev/spidev0.0 /dev/spidev0.1
/dev 디렉토리에 spidev가 잡힌다.
펌웨어 추출 (flashrom)
위 사진은 라즈베리파이4의 핀맵이다. 핀맵을 적절히 연결하여 장치 간의 통신을 할 수 있다.
추출하려는 칩 모델의 Datasheet를 확인하면, 위와 같이 핀의 역할을 확인할 수 있다.
추출할 칩 | 라즈베리파이4 |
---|---|
CS | SPI_CE0_N(24) |
DO(MISO) | SPI0_MISO(21) |
VSS(GND) | GROUND(9) |
VCC | 3.3V DC Power(1) |
CLK | SPI0_CLK(23) |
DI(MOSI) | SPI0_MOSI(19) |
두 장치의 연결은 위 표와 같이 6개를 연결시켜줘야 한다.
flashrom download
# 수동 빌드
$ git clone https://github.com/flashrom/flashrom.git
$ make && make install
flashrom은 칩 모델의 Datasheet에 맞춰서 미리 정의해놓아 쉽게 펌웨어를 추출할 수 있다. 지원되는 칩 모델이 아니라면, 형식에 맞게 직접 추가해주면 된다.
앞서 봤던 데이터 시트를 보고 라즈베리파이 핀맵과 적절히 매핑시킨다.
$ sudo flashrom -p linux_spi:dev=/dev/spidev0.0 -r firmware.bin, spispeed=8000 -VV
위 명령어를 통해 연결된 칩을 추출하여 파일로 저장할 수 있다.
정상적으로 펌웨어 추출이 되었다!
이제 binwalk로 펌웨어를 추출해서 분석하면 된다.
추출이 안될 때
연결을 잘 해도 칩을 인식하지 못하는 경우가 있다. 정확한 이유는 모르지만 칩오프를 해서 읽으면 잘 읽힌다.
칩이 PCB위에서 뭔가 영향을 받아서 전류가 적절하게 들어가지 못했나? (추측)
왜 그런지 생각해봐야겠다 :)
Ref