본문 바로가기

System Hacking

1일차] 환경 구축 및 컴파일 과정

실습 환경 : Red Hat 6.2 버전 ( 메모리 보안기법이 적용이 되어있지 않은 환경)

리눅스를 위한 부트 로더가 grub가 아닌 LILO이기 때문에 직접 운영 체제를 입력해 줘야 한다. linux-up을 입력해주자.

# ID - root, PW - 1234   ( root 계정으로 실습을 진행해야 한다. )

   

NASM 다운로드 방법

#> wget http://www.nasm.us/pub/nasm/releasebuilds/0.99.05/nasm-0.99.05.tar.gz   --> wget으로 다운로드 받음.

#> tar xvfz nasm-0.99.05-xdoc.tar.gz

#> cd nasm-0.99.05

#> ./configure

#> make

#> make install

#> cp nasm /usr/bin

 

C 컴파일

- windows : visual studio, eclips, ...  ---> Compiler 가 아닌 IDE

- IDE: 개발환경( 컴파일러 + 편집기 + 디버거 + ...)

- 컴파일러: GCC, 편집기: VI, 디버거: GDB

 

실습에 사용할 컴파일러 및 디버거

C 컴파일러 : GCC ( GNU C Compiler )

어셈블러    : GAS ( GNU Assembler)          : AT&T 문법을 지원

NASM( Netwired Assembler ) :  INTEL 문법을 지원 IA32          // 이것만 설치

디버거       : GDB( GNU DeBugger )바이너리 분석 도구

 

[ 컴파일러 과정 살펴보기 ]

 

 

1). hello.c 파일 만들기

 

 

 

2). gcc -v 옵션을 통해 컴파일 과정의 자세한 내용보기 + gcc -save-temps 를 통해서 임시파일을 지우지 않고 내용보기 .

 

 

 

 

 

[ 컴파일 과정 분석 ]

1). 전처리 과정: cpp   (hello.i 확인) --> #define MAX가 치환됨을 확인

/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


 

2). 컴파일 과정: cc1 (hello.s 어셈블리 언어 확인)

 /usr/lib/gcc-lib/i386-redhat-linux/egcs-2.91.66/cc1 hello.i -quiet -dumpbase hello.c -version -o hello.s

 

 

3). 어셈블리 과정 : as(목적파일 확인)  : 여기부터 바이너리 형태로 되어있으며, 링킹과정을 거쳐야만 실행파일까지 도달할 수 있다. 여기서 사용한 printf는 c 표준 라이브러리 함수이기 때문에 링킹을 해야 완전한 실행파일이 하나 완성되는 것이다.    

as -V -Qy -o hello.o hello.s

 

4). 링킹 과정 : ld, collect2  --> 실행에 필요한 여러가지 라이브러리

/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

 

 

software engineering( 소프트웨어 공학 )

- 소프트웨어를 만드는 전체 과정

- 기획 -> 설계 -> 구현 -> 배포 -> 유지보수

 ## 리버싱(리버스 엔지니어링) 배포 ->구현