2017. 10. 12. 21:36ㆍSystemHacking/System
가상머신 VMware에서 C언어 파일을 컴파일 해서 실행파일로 만드는방법에 대해서 알아보겠습니다
간단히 말하자면, C언어 파일을 만든뒤 컴파일하면 끝입니다
아래는 C언어 파일입니다 ( #vi hello.c )
유닉스 운영체제에서 무료로 제공되는 컴파일러 gcc 를 사용하겠습니다
#gcc hello.c -o hello
-o ( output ) 옵션 : 출력파일명 = hello
file 명령어를 통해서 해당 파일의 종료를 확인할 수 있습니다
hello 라는 실행파일이 생성되었고, 실행시킬 수 있습니다
gcc를 이용해서 쉽게 C언어 파일을 실행파일로 컴파일 하였습니다
컴파일 되어지는 과정에 대해서 알아보겠습니다
[ 컴파일 과정 ]
1> 전처리 과정
hello.c -> hello.i
include, define 처리
2> 컴파일 과정
-> hello.s ( 어셈블 형태 )
3> 어셈블러 과정
-> hello.o ( 바이너리파일, 0 과 1 )
4> 링킹 과정
-> hello
실행에 필요한 라이브러리파일들과 연결시켜준다 ( = 혼자서 실행가능한 실행파일이 생성된다 )
#gcc hello.c -o hello -v
v 옵션을 통해서 컴파일 과정을 볼 수 있다
#gcc hello.c -o hello -save-temps
-save-temps 옵션을 통해서 컴파일 과정에서 생성되어 지는 파일들을 삭제 하지 않게 할 수 있습니다
hello.i 파일 ( 전처리 과정뒤에 생성되는 파일 , define이나 include를 처리 후 생성되는 파일 )
hello.c -> [ 전처리 ] -> hello.i -> [ 컴파일 ] -> hello.s -> [ 어셈블리 ] -> hello.o -> [ 링킹 ] -> hello
[ 컴파일러 과정 ]
Reading specs from /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/specs
gcc version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release)
/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cpp -lang-c -v -undef -D__GNUC__=2 -D__GNUC_MINOR__=91 -D__ELF__ -Dunix -Di386 -D__i386__ -Dlinux -D__ELF__ -D__unix__ -D__i386__ -D__i386__ -D__linux__ -D__unix -D__i386 -D__linux -Asystem(posix) -Asystem(unix) -Acpu(i386) -Amachine(i386) -Di386 -D__i386 -D__i386__ -D__tune_i386__ hello.c hello.i
// 전처리 과정
// cpp 사용
GNU CPP version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (i386 Linux/ELF)
#include "..." search starts here:
#include <...> search starts here:
/usr/i386-redhat-linux/include
/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/include
/usr/include
End of search list.
/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cc1 hello.i -quiet -dumpbase hello.c -version -o hello.s
// 컴파일 과정
// cc1 사용
GNU C version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release) (i386-redhat-linux) compiled by GNU C version egcs-2.91.66 19990314/Linux (egcs-1.1.2 release).
as -V -Qy -o hello.o hello.s
// 어셈블리 과정
// as 사용
GNU assembler version 2.9.5 (i386-redhat-linux) using BFD version 2.9.5.0.22
/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/collect2 -m elf_i386 -dynamic-linker /lib/ld-linux.so.2 -o hello /usr/lib/crt1.o /usr/lib/crti.o /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtbegin.o -L/usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66 -L/usr/i386-redhat-linux/lib hello.o -lgcc -lc -lgcc /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/crtend.o /usr/lib/crtn.o
// 링킹 과정
// collect 사용
'SystemHacking > System' 카테고리의 다른 글
[8] Use After Free / Double Free Bug (0) | 2017.06.16 |
---|---|
[7] PLT / GOT / objdump활용법 (0) | 2017.06.14 |
[6] Format String Bug [FSB] (0) | 2017.06.08 |
[5] Heap Buffer Overflow ( Heap기반의 버퍼오버플로우 ) (0) | 2017.06.07 |
[4] 환경변수를 이용한 버퍼 오버플로우 공격 ( 에그쉘) (1) | 2017.06.05 |