sweetchip's blog

0x00 프로그래밍/0x01 c, c++ 2건이 검색되었습니다.

Ubuntu 기준으로 크로스 컴파일 하는법.


최근 여러 아키텍쳐 환경을 구성해야할 일이 있어서 메모!


1. 아래 명령어로 여러 아키텍쳐 gcc 설치 (arm, mips, ppc 등 다수 포함)

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


복사가 어렵다면 http://pastebin.com/iksPEaAH


2. 설치 이후 아래와 같이 컴파일

arm-linux-gnueabi-gcc -o test test.c -> arm

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


결과

[sweetchip@ubuntu qemutest]$ file test

test: ELF 32-bit LSB executable, ARM, EABI5 version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.3, for GNU/Linux 3.2.0, BuildID[sha1]=a9248b1c3ba0c940029d23e1f345d3df28f6d39b, not stripped


[sweetchip@ubuntu qemutest]$ file test_mips

test_mips: ELF 32-bit MSB executable, MIPS, MIPS32 rel2 version 1 (SYSV), dynamically linked, interpreter /lib/ld.so.1, for GNU/Linux 3.2.0, BuildID[sha1]=2e9ee6c560f47f28aa1ee329fba06e38bbb0960e, not stripped



보너스


만약 ubuntu 에서 mips나 arm 바이너리를 돌리고 싶다면 아래 명령어를 통해서 qemu를 설치한다

sudo apt-get install qemu-user-static


qemu-user-static 은 이미지를 구하지 않고도 ELF 바이너리를 돌릴수 있도록 도와주는 매우 땡큐한 툴이다.


설치 이후 가능한 목록은 아래와 같다.

[sweetchip@ubuntu qemutest]$ ls /usr/bin/qemu-

qemu-aarch64-static       qemu-m68k-static          qemu-mipsn32el-static     qemu-ppc64-static         qemu-sparc64-static

qemu-alpha-static         qemu-microblazeel-static  qemu-mipsn32-static       qemu-ppc-static           qemu-sparc-static

qemu-armeb-static         qemu-microblaze-static    qemu-mips-static          qemu-s390x-static         qemu-tilegx-static

qemu-arm-static           qemu-mips64el-static      qemu-or32-static          qemu-sh4eb-static         qemu-unicore32-static

qemu-cris-static          qemu-mips64-static        qemu-ppc64abi32-static    qemu-sh4-static           qemu-x86_64-static

qemu-i386-static          qemu-mipsel-static        qemu-ppc64le-static       qemu-sparc32plus-static

엄청나게 많은 아키텍쳐를 지원한다.


그중 아까 컴파일한 arm과 mips를 돌려보자. (사전에 gdb-multiarch 설치 필요, apt-get 으로 설치한다.)


-> qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test -> GDBServer에 test 바이너리를 돌림 (gdb에서 target remote ip:31338 로 접근 가능)

[root@ubuntu qemutest]$ qemu-arm-static -L /usr/arm-linux-gnueabi -g 31338 ./test


[sweetchip@ubuntu qemutest]$ gdb-multiarch 

GNU gdb (Ubuntu 7.11-0ubuntu1) 7.11

Copyright (C) 2016 Free Software Foundation, Inc.

License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html>

This is free software: you are free to change and redistribute it.

There is NO WARRANTY, to the extent permitted by law.  Type "show copying"

and "show warranty" for details.

This GDB was configured as "x86_64-linux-gnu".

Type "show configuration" for configuration details.

For bug reporting instructions, please see:

<http://www.gnu.org/software/gdb/bugs/>.

Find the GDB manual and other documentation resources online at:

<http://www.gnu.org/software/gdb/documentation/>.

For help, type "help".

Type "apropos word" to search for commands related to "word".

(gdb) target remote localhost:31338

Remote debugging using localhost:31338


....


(gdb) disas main

Dump of assembler code for function main:

   0x00010438 <+0>: push {r11, lr}

   0x0001043c <+4>: add r11, sp, #4

   0x00010440 <+8>: ldr r0, [pc, #12] ; 0x10454 <main+28>

   0x00010444 <+12>: bl 0x102e0 <printf@plt>

   0x00010448 <+16>: mov r3, #0

   0x0001044c <+20>: mov r0, r3

   0x00010450 <+24>: pop {r11, pc}

   0x00010454 <+28>: andeq r0, r1, r8, asr #9

End of assembler dump.

(gdb) 



======================================================================================

-> qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips -> mips 바이너리 실행


[root@ubuntu qemutest]$ qemu-mips-qemu-mips-static -L /usr/mips-linux-gnu/ ./test_mips

hello world



생각보다 간편한 크로스컴파일과 실행 ㅋㅋ

저작자 표시 비영리 변경 금지
신고

댓글 0

안녕하세요 pgnsc입니다.


급하게 아스키코드나 헥스코드를 일반 문자로 변환해야 되는데 그 많은걸 일일히 모두다 꿰고 있을수는 없어서 필요할때마다 찾아보게 됩니다.


아스키코드에 대해서.


아스키(ASCII, American Standard Code for Information Interchange, 미국 정보 교환 표준 부호)는 영문 알파벳을 사용하는 대표적인 문자 인코딩이다. 아스키는 컴퓨터와 통신 장비를 비롯한 문자를 사용하는 많은 장치에서 사용되며, 대부분의 문자 인코딩이 아스키에 기초를 두고 있다.

아스키는 1967년에 표준으로 제정되어 1986년에 마지막으로 개정되었다. 아스키는 7비트 인코딩으로, 33개의 출력 불가능한 제어 문자들과 공백을 비롯한 95개의 출력 가능한 문자들로 이루어진다. 제어 문자들은 역사적인 이유로 남아 있으며 대부분은 더 이상 사용되지 않는다. 출력 가능한 문자들은 52개의 영문 알파벳 대소문자와, 10개의 숫자, 32개의 특수 문자, 그리고 하나의공백 문자로 이루어진다.

아스키 코드는 국제 표준 기구에 의해 개발되었으며 미국 국립 표준 연구소에서 제정하였다.[1]

일부 수정 및 출처 위키피디아. http://ko.wikipedia.org/wiki/아스키코드



헥스코드는 그냥 16진수입니다. 0 ~ 9, a~f 로 이루어진 숫자입니다.


사진은 인터넷 상에 많이 떠돌고 있는 사진입니다.


아래사진을 보시기를 권장드립니다.


위에는 알파벳은 상관없는데, 특수문자에서 몇개 짤리는게 보이더군요.


변환할때마다 코드를 짜는것보다 전 이게 나은것 같네요 ㅋㅋ



신고

Comment 2