보통 우분투 환경에서 컴파일을 하면 x86 아키텍처 환경에서 컴파일된 바이너리가 나온다.


그러나 아키텍처는 x86만 있는게 아니라 mips,arm등 다양하다.


x86에서 mips,arm등 다양한 아키텍처를 사용한 바이너리를 만들기 위해서 크로스 컴파일을 한다.



1. 다양한 아키텍처 환경 구성

먼저 ubuntu 14.04에서는 아래의 패키지가 설치되지 않는다.


나는 칼리리눅스에서 실습했다.


sudo apt-get install -y  gcc-multilib-arm-linux-gnueabi

sudo apt-get install -y  gcc-multilib-arm-linux-gnueabihf

sudo apt-get install -y  gcc-multilib-mips-linux-gnu

sudo apt-get install -y  gcc-multilib-mips64-linux-gnuabi64

sudo apt-get install -y  gcc-multilib-mips64el-linux-gnuabi64

sudo apt-get install -y  gcc-multilib-mipsel-linux-gnu

sudo apt-get install -y  gcc-multilib-powerpc-linux-gnu

sudo apt-get install -y  gcc-multilib-powerpc64-linux-gnu

sudo apt-get install -y  gcc-multilib-s390x-linux-gnu

sudo apt-get install -y  gcc-multilib-sparc64-linux-gnu

sudo apt-get install -y  gcc-multilib                                 ->                 m32옵션(64bit에서 32bit 바이너리 크로스 컴파일) 


위 명령어들을 통해 패키지를 설치하면 다양한 아키텍처 환경이 구성된다.


2. 크로스 컴파일


mips 아키텍처로 컴파일을 해보겠다.


mips-linux-gnu-gcc -o test test.c


매우 간단하게 x86환경에서 mips 바이너리를 컴파일 했다.


3. 실행


우분투 환경에서 위 아키테처 파일들을 실행시키고 싶으면 먼저 실행이 가능하도록 환경을 구성해줘야 한다.


sudo apt-get install qemu-user-static


이 패키지는 이렇게 다양한 아키텍처를 지원한다.



이제 위에서 컴파일한 바이너리를 실행시키면 된다.


qemu-mips-static -L /usr/mips-linux-gnu ./test


4. 디버깅


x86이 아닌 다른 아키텍처 바이너리를 디버깅 하기 위해선 먼저 gdb-multiarch를 설치해야 한다.


sudo apt-get install gdb-multiarch


gdb로 원격 디버깅을 통해 디버깅이 가능하다.


qemu-mips-static -L /usr/mips-linux-gnu -g 1234(포트) ./test


gdb-multiarch (터미널 새로 열어서)

(gdb) target remote localhost:1234





가끔 가다 안되는 것들도 있다.


크로스 컴파일 및 실행할 때 환경을 잘 구축 해줘야 하는데


msb,lsb 문제 운영체제 문제등 각종 문제들로 잘 작동되지 않을 수 있다.


위에서 설명한 부분은 아예 환경을 구축한게 아니고 크로스컴파일러를 통해 컴파일 하였으므로 완전하지 않다.


이부분에 대해서는 좀더 많은 공부와 삽질이 필요할 듯 하다.



xinetd란

-> inetd가 관리하는 포트에 접속 요청이 들어오면 inetd는  tcpd 프로그램에 요청을 넘기고 tcpd는 hosts.{allow|deny} 파일 규칙에 따라 허락여부를 결정.

    허락된 요청에 대해 서버 프로세스가 시작된다.


쉽게말해 대회 때 nc나 클라이언트측 소켓 짤때 서버측 소켓 짤 필요없이 xinetd가 서버에서 통신해줌.



apt-get install xinetd


세팅


vi /etc/xinetd.conf



# Simple configuration file for xinetd

#

# Some defaults, and include /etc/xinetd.d/


defaults

{


# Please note that you need a log_type line to be able to use log_on_success

# and log_on_failure. The default is the following :

# log_type = SYSLOG daemon info


}

#Telnet Setting


service telnet{

        disable=no

        flag= REUSE

        socket_type=stream

        wait=no

        user=root

        server=/usr/sbin/in.telnetd

        log_on_failure+=USERID

}


includedir /etc/xinetd.d



vi /etc/services

맨 밑에


서비스명            포트번호/tcp


vi /etc/xinetd.d/서비스명


service 서비스명

{

        flags = REUSE

        socket_type = stream

        wait = no

        user = root//권한(관리자 권한으로 해놓으면 해커들에의해 권한이 따일수도)

        server = /tmp/test_file//실행될 파일의 경로

        disable = no

}


/etc/init.d/xinetd restart  //서비스 재시작



ex)




xinetd로 돌아가는 프로그램은 사용자의 입력을 그대로 받는다.


즉 scanf 든 gets 든 알아서 입력을 처리해줌





+ Recent posts