펌웨어 분석을 위한 binwalk, fmk 사용법
- 임베디드
- 2020. 2. 18. 23:35
펌웨어 자동 분석 툴에는 대표적으로 binwalk와 fmk가 있다. 실제 제조사 웹페이지에 공개되어있는 구버전 펌웨어를 사용해서 binwalk와 fmk에서 많이 쓰이는 사용법을 알아보았다(공부하면서 추가되는 내용이 있다면 계속 추가할 예정이다).
- 환경: Ubuntu
- 펌웨어: 제조사 웹페이지에 공개된 펌웨어 1.2.4 버전
binwalk 사용법
binwalk는 펌웨어 파일의 구성을 분석할수 있는 툴로 파일 시그니처를 사용해서 어떤 데이터가 들어있는지 확인해준다. binwalk 설치는 apt-get으로 간단히 설치가 가능한데 fmk는 binwalk가 설치되어있어야 동작하기 때문에 꼭 설치해주어야 한다.
binwalk 옵션은 상당히 많은데 이 중에 자주 쓰이는 옵션만 다뤘다.
파일 시그니쳐 분석 (default: -B)
파일 시그니쳐 분석 옵션은 -B인데 default 옵션이기 때문에 옵션을 안줘도 된다. 펌웨어 데이터는 실행파일, 압축된 데이터, 이미지파일, 파일시스템 등으로 구성되어있는데 각각 고유의 시그니쳐를 갖고있기 때문에 시그니쳐 분석을 하면 해당 펌웨어가 어떤 데이터나 파일시스템을 쓰고있는지에 대한 대강의 정보를 알 수 있다.
> binwalk gk7101_hzd_V1.2.4-app.bin
데이터는 xs로 압축되었고 Squashfs 파일시스템(오프셋 0x137F18)을 사용하다는 것을 알 수 있다. Squashfs는 아주 작은 리눅스 장비에서 쓰는 압축된 형태의 파일시스템이다.
펌웨어 아키텍쳐 분석 (-A)
펌웨어 아키텍쳐를 식별하고 싶으면 -A 옵션을 주면 된다. gk7101_hzd_V1.2.4-app.bin 펌웨어의 아키텍쳐는 ARM인 것을 알 수 있다.
> binwalk -A gk7101_hzd_V1.2.4-app.bin
펌웨어 엔트로피 분석 (-E)
펌웨어 엔트로피 분석을 할 수 있는 -E 옵션이 있다. 파일 바이트 정보를 아래와 같이 엔트로피 그래프로 출력해주는데 이건 아직 정확한 해석법?을 모르겠다. 펌웨어 구조가 어떻게 되어있는지 대략적인 위치파악을 시각적으로 할 수 있는 것 같다.
> binwalk -BE gk7101_hzd_V1.2.4-app.bin
펌웨어 파일 추출 (-e)
펌웨어 내부에 알려진 파일 타입을 추출해주는 옵션으로 언패킹이 가능하다. 펌웨어 언패킹은 binwalk 말고도 다양한 방법(fmk나 dd 등)이 존재한다.
> binwalk -e gk7101_hzd_V1.2.4-app.bin
위에서 보는 것과 같이 _~.extracted 폴더가 생성되는데 폴더 내부를 보면 언팩된 squashfs 파일시스템을 볼 수 있다.
fmk(firmware-mod-kit) 사용법
fmk(fimware-mod-kit)은 펌웨어에서 각종 파일을 추출할 수 있는 툴로 mod라는 단어가 들어간 이름답게 리패키징 기능도 갖추고 있는 툴이다.
fmk 설치
위에서도 언급했다시피, fmk는 내부적으로 binwalk가 동작하기 때문에 binwalk가 설치되어 있어야 하며 필요한 관련 패키지도 몇가지 설치되어 있어야 한다. fmk는 깃허브 주소를 사용해서 클론해주는 방식으로 직접 다운을 받았다.
> apt-get install apt-get install git build-essential zlib1g-dev liblzma-dev python-magic
> git clone https://github.com/rampageX/firmware-mod-kit.git
혹은 fmk tar 파일을 다운받아 압축을 푼 후 직접 configure, make 해주어도 된다.
> tar xvfz fmk_XXX.tar.gz
> cd fmk/src
> ./configure
> make
펌웨어 파일 추출
firmware-mod-kit 내부 파일들을 보면 여러 sh 파일들을 볼 수 있다. 그 중에서 extract-firmware.sh 를 사용하면 펌웨어를 언패킹할 수 있으며 언팩된 파일시스템은 fmk 폴더에서 확인할 수 있다.
>extract-firmware.sh gk7101_hzd_V1.2.4-app.bin
fmk 폴더를 확인해보면 image_parts, logs, rootfs 디렉토리로 구성되어 있는데 image_parts에는 파일시스템 이미지가 들있고 logs에는 의미그대로 각종 로그(fmk는 내부적으로 binwalk를 사용하다보니 binwalk.log가 남아있다)가 들어있고 rootfs는 펌웨어 루트파일스스템을 추출한 결과가 들어있다. rootfs는 뭔가 덜풀린 것 같은데...흠(이건 좀 펌웨어 분석에 대한 식견?이 쌓인 후에 생각해보도록 하겠다)
혹은 firmware-mod-kit 내부의 unsquashfs_all.sh 를 사용해서도 언팩할 수 있다.
자주 사용되는 것 위주로만 간단히 binwalk, fmk의 사용법을 알아보았다. 앞으로 Iot 카테고리에 올릴 포스팅에서는 직접 공개된 펌웨어를 분석해보면서 (펌웨어분석은 처음이기에) 여러가지 시행착오나 분석과정 등을 다룰 예정이다.
'임베디드' 카테고리의 다른 글
UART 해킹, 래빗(rabbit) 사용해서 쉘 획득하기 (2) | 2020.03.03 |
---|---|
binwalk -e 에러, 'sasquatch -p 1 -le -d '%%squashfs-root%%' (0) | 2020.03.01 |
QEMU, 펌웨어를 이용한 가상 공유기 환경 구축 (MIPS) (4) | 2020.02.24 |
바이너리 디핑 플러그인, bindiff를 사용한 펌웨어 패치 분석 (0) | 2020.02.21 |