이번 포스팅에서는 firmware분석 환경 구축에 대하여 다루어보도록 하겠습니다!

이 포스팅의 예제로는 iptime 8.76버전의 mips아키텍쳐 firmware를 가지고 진행하였으며, 운영체제는 칼리리눅스에서 진행하였습니다.


firmware를 분석 환경을 구축하기 위해서는 크게 firmware mod kit, qemu 이 두 가지 툴이 필요합니다.


1. firmware mod kit(fmk)

https://bitsum.com/firmware_mod_kit.htm


This kit gives the user the ability to make changes to a firmware image without recompiling the firmware sources. It works by extracting the firmware into its component parts, then extracting the file system image (assuming its in one the supported formats). The user can then make modifications to the extracted file system, and rebuild the firmware image.


번역 : 이 키트는 사용자가 펌웨어 소스를 다시 컴파일하지 않고 펌웨어 이미지를 변경할 수있는 기능을 제공합니다. 펌웨어를 구성 요소로 추출한 다음 파일 시스템 이미지를 추출합니다 (지원되는 형식으로 가정). 그런 다음 추출 된 파일 시스템을 수정하고 펌웨어 이미지를 다시 작성할 수 있습니다.


위 글은 fmk의 공식 페이지의 description의 일부분을 가져온 것 입니다. 설명되어있는대로 fmk는 펌웨어에서 시스템 이미지를 추출할 수 있습니다.


.bin 형태의 펌웨어 바이너리 파일을 fmk를 통해 시스템 이미지와 파일들을 추출해올 수 있습니다.


1.1 필요 패키지 설치

fmk설치에 앞서 fmk를 사용하기 위해 선행으로 설치해야하는 패키지들이 있습니다.


1
apt-get install zlib1g-dev build-essential liblzma-dev python-magic



zlib1g-dev와 liblzma-dev는 압축관련 패키지이고, python-magic은 파일포맷을 확인하기 위한 패키지, 패키지 작성을 위한 것이라고 하네요!


1.2 fmk clone

이 패키지들을 설치한 후 git에서 fmk를 clone해옵니다.

1
git clone https://github.com/rampageX/firmware-mod-kit.git



1.1에서 선행 패키지들을 이상없이 설치 하였다면 git에서 fmk를 받아 온 후 따로 make / make install 같은 과정 필요 없이 
바로 사용할 수 있는 상태입니다.


여러 쉘이 있으나, firmware에서 이미지를 추출하기 위해서는 extract-firmware.sh를 사용합니다.


1.3 extract-firmware.sh

extract하는 방법은 아래와 같습니다.

1
extract-firmware.sh target_firmware.bin



실행 후에는 실행한 디렉터리에 extract의 결과물인 fmk라는 디렉터리가 생성됩니다.


fmk내부에는 세 개의 디렉터리가 존재하는데

image_parts는 extract한 시스템 이미지들이 존재하고

logs에는 로그들이,

rootfs에는 시스템 파일들이 존재합니다.


얘네들을 가상머신으로 전송해서 구동시켜야합니다.


2. qemu

QEMU는 가상화 소프트웨어 가운데 하나다. Fabrice Bellard가 만들었으며 x86 이외의 기종을 위해 만들어진 소프트웨어 스택 전체를 가상머신 위에서 실행할 수 있다는 특징이 있다. 동적 변환기(Portable dynamic translation)를 사용한다.


[출처] 위키백과 : https://ko.wikipedia.org/wiki/QEMU


firmware를 직접 구동해보기 위해서 필요한 에뮬레이터(?)라고 생각하시면 될 것 같습니다.

IOT의 firmware가 실행 되는 아키텍쳐는 대부분 arm / mips 이기 때문에 추출만 한다고해서 바이너리들을 분석 pc에서 실행 해 볼 수 없습니다.

따라서 가상의 arm / mips 머신을 생성하여 firmware를 구동 시켜야합니다. 이때 가상의 arm / mips 머신 생성 및 구동을 도와주는 것이 QEMU입니다.


2.1 qemu 패키지 설치



apt-get install qemu



apt-get으로 qemu 패키지를 설치합니다.


2.2 해당 아키텍쳐 필요 파일 다운로드

https://people.debian.org/~aurel32/qemu/ 로 최초 접속하면 아래와 같은 사이트를 만날 수 있습니다.

사이트에 리스팅된 목록을 보시면 짐작 가능하시겠지만 arm, mips등 아키텍쳐 별로 나열되어있습니다. 저는 mips용 firmware를 실행하기 위해

mips를 클릭하여 들어갔습니다. 




여러 개의 파일이 있는데, 각 파일이 어떤 용도인지는 잘모르겠습니다ㅠ 아시는 분이 있으면 좀 알려주세요 ㅠㅠ

다만, 여러 서치 결과 qcow2확장자 파일 중에는 wheezy를 받은 경우가 대부분이라, 저도 wheezy를 받아서 사용하였습니다.


그래서 결과적으로 어떤 파일을 다운 받아야하느냐면!

아래로 조금 내리면 가상머신을 구동하기위한 샘플 명령이 있습니다. 거기에 맞춰 파일을 다운 받으시면 되는데요,


빨간 네모로 강조가 된 쟤들이에요!


vmlinux-3.2.0-4-4kc-malta와 debian_wheezy_mips_standard.qcow2 이 파일입니다.


구축하기위해 검색도 많이하고 여러 블로그를 참조했습니다만, 제대로 실행되지 않아서 여러번 실패를 겪었습니다. 제 경험으로는

다운로드페이지에 게시된 대로 다운받아 실행을 하는게 가장 정확할 것같습니다.

혹시 제 캡쳐본과 링크를 열었을 때 업데이트 등의 이유로 게시된 버전이 다르다면 홈페이지 예제를 따라가는 것을 추천드립니다.



다운이 다 받아지셨다면, 이제 머신을 구동시켜 볼 수 있습니다.

1
qemu-system-mips -M malta -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0"



구동 방법은 파일다운 받았던 곳에 있던 샘플을 쉘에 날려주시면 됩니다.



2.3 네트워크 브릿지 설정

위 과정을 거치면 구동도 되고, 외부망과 연결도 됩니다만... 다만 Host -> Guest간 내부 통신이 되지 않습니다.

ftp, ssh등의 서비스를 이용하기엔 여러가지로 불편합죠,, 이러한 이유로 네트워크 브릿지 설정을 해주는 것이 편합니다.


역시 네트워크 브릿지 설정을 하기 위해 설치가 필요한 패키지가 있습니다.


1
apt-get install bridge-utils



tunctl이라는 패키지도 필요하다고는 하는데, apt-get install tunctl로는 설치가 안되는거 같구... 

[추가] tnctl설치 방법입니다.(2017-09-18)

1
apt-get install uml-utilities



저같은 경우에는 제 칼리 리눅스에 default로 설치 되어있었습니다. 

이번에 환경을 구축하면서 우분투와 데비안이 생각보다 많이 다른 걸 몸소 느낄 수 있었습니다ㅠㅠ

패키지 설치가 끝나면, 아래와 같이 가상 인터페이스를 생성하고 브릿지를 연결해줍니다.


1) 브릿지 디바이스 생성 

brctl addbr virbr0


2) 가상 tap0 인터페이스 생성

tunctl -t tap0 -u 유저명


3) eth0와 tap0 브릿지 추가, 인터페이스 up

brctl addif virbr0 eth0

brctl addif virbr0 tap0


ifconfig eth0 up
ifconfig tap0 up
ifconfig virbr0 up

brctl stp virbr0 on

4) 브릿지 작업 성공 확인
brctl show



5) virbr0인터페이스에 ip할당, eth0인터페이스의 ip주소 삭제

ifconfig virbr0 172.16.1.2/16

ifconfig eth0 0.0.0.0 promisc


ip addr flush dev eth0

route add default gw 172.16.255.254


위 과정을 마치면 설정은 끝났습니다!

이제 실행 할 때 사용했던 예제에 몇가지를 추가 해주면 됩니다.


1
qemu-system-mips -M malta -m 128M -kernel vmlinux-3.2.0-4-4kc-malta -hda debian_wheezy_mips_standard.qcow2 -append "root=/dev/sda1 console=tty0" -netdev tap,id=net0,ifname=tap0,script=no,downscript=no -device e1000,netdev=net0,mac=00:aa:00:60:00:01
cs

이대로 돌려주시면되어욥




왼쪽 QEMU가 가상머신창, 오른쪽이 Host의 쉘입니다. 각자 IP가 할당되었어요.

qemu가 속도가 느리기 때문에 저는 Host에 vsftp를 설치해서 가상머신에서 파일을 다운받았습니다.


그리고 다운받은 fmk디렉터리의 rootfs디렉터리로 들어가서 chroot명령어를 실행해준 후 /sbin/httpd를 실행해서 http데몬을 실행합니다.

1
2
chroot ./ ./bin/sh
/sbin/httpd





위의 내용을 기반으로 만든 브릿지 설정하는 쉘코드와 가상머신 구동 쉘코드를 첨부합니다! 필요하신분은 받아서 써보세욥

runMips.sh

setup_bridge_sh


환경은 구축되었으니... 이제 열심히 분석해보아야겠네요, 분석은 추후에 포스팅해보도록 하겠습니다.

'Study > IoT' 카테고리의 다른 글

MIPS 리버싱 기초-2(if, bof)  (0) 2017.09.14
MIPS 리버싱 기초-1(hello world)  (2) 2017.09.13

+ Recent posts