Self-Improvement

QEMU, 펌웨어을 통한 공유기 구현 1 본문

Firmware

QEMU, 펌웨어을 통한 공유기 구현 1

JoGeun 2018. 10. 26. 16:50

기본적인 qemu 사용법 예시는 아래의 방법과 같다. 

(예시는 arm으로 하였지만 2탄에서는 mips로 실제 공유기를 구현해보겠다.)


* gemu 설치

apt-get -y install qemu (qemu-system-arm 설치가 안될시 추가 명령어로 설치)

mkdir qemu (다운받을 파일들을 모아놓을 곳)


* armel 설치

https://people.debian.org/~aurel32/qemu/(원하는 형식으로 다운받기 본인은 armel의 wheezy_armel_standard 다운받음)


* 커널, 부트? 이미지 다운 

wget https://people.debian.org/~aurel32/qemu/armel/vmlinuz-3.2.0-4-versatile

wget https://people.debian.org/~aurel32/qemu/armel/initrd.img-3.2.0-4-versatile



* qemu 네트워크 브릿지 설정 (네트워크 브릿지 설정안할시 qemu-system-arm 명령어 할 시에 -redir tcp:9000:80 의 옵션를 사용해야함)

brctl addbr br0

ip addr flush dev eth0

brctl addif br0 eth0

tunctl -t tap0 -u `whoami`

brctl addif br0 tap0

ifconfig eth0 up

ifconfig tap0 up

ifconfig br0 up

brctl show

dhclient -v br0


출처 : https://gist.github.com/extremecoders-re/e8fd8a67a515fee0c873dcafc81d811c


* qemu 실행

qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -net tap,ifname=tap0 -net nic


(네트워크 브릿지를 안할시에 ---> qemu-system-arm -M versatilepb -kernel vmlinuz-3.2.0-4-versatile -initrd initrd.img-3.2.0-4-versatile -hda debian_wheezy_armel_standard.qcow2 -append "root=/dev/sda1" -redir tcp:9000::80 -redir tcp:9022::22)

※ -redir tcp:9022::22는 가상os에 파일을 전송하기위해 설정, -redir tcp:9000::80은 웹 접속을 위해 설정 ex) HostIP:9000


qemu 가상화가 실행되고 로그인 화면이 나오게 된다.

암호는 root/root, user/user로 되어있으며 root로 시작한다.


* scp 명령어를 통해 펌웨어 파일시스템을 qemu 가상화에 전송해준다.

scp cpio-root.tar root@IP:저장할 장소 (scp할시 root에 대한 퍼미션을 풀어줘야함 vi /etc/ssh/sshd_config, 네트워크 브릿지 설정은 안하면 -P 9022 추가)


* qemu에서 tar xvf로 풀어주고 파일시스템 내부로 들어간다.

tar xvf cpio-root.tar

cd cpio-root


* chroot을 해준다

chroot . ./bin/sh


* 웹을 시작해준다

/sbin/httpd

※chdir to "/var":aborting 오류가 나면 default 폴더에있는 것을 tmp파일로 옮겨준다.


* 기존 리눅스에서 가상OS IP로 접속 (네트워크 브리지를 안하였다면 HostIP:9000으로 접속한다)

※네트워크 브리짓 설정안하고 진행하게되면 404 Not Found가 뜨게된다. 아래의 명령어를 qemu안에서 실행한다.

cd /

mkdir /home/httpd/192.168.0.1/sess-bin

cp -r cgibin/* /home/httpd/192.168.0.1/sess-bin/

cp -r cgibin/* /bin/login-cgi


다시 localhost:9080으로 접속하면 성공.