본문 바로가기
게임해킹/knockon 부트캠프

[3주차 TIL] KnockOn Bootcamp - 컴파일러

by HHack 2025. 4. 22.
반응형

 

📘 컴파일 과정의 내부 구조 – 소스코드에서 실행파일까지


🔍 2.1 컴파일이란 무엇인가?

C언어로 작성한 소스코드는 CPU가 이해하지 못한다.
이 코드를 컴퓨터가 이해할 수 있는 **기계어 바이너리(executable)**로 바꾸는 과정이 바로 컴파일이다.
이 과정은 한 단계로 끝나는 것이 아니라 총 4단계에 걸쳐 진행된다.


🔧 2.2 컴파일 4단계 요약

단계 이름 결과 파일 확장자 역할
1단계 전처리(Preprocessing) .i 매크로, #include 처리
2단계 컴파일(Compilation) .s C코드 → 어셈블리
3단계 어셈블(Assembling) .o 어셈블리 → 목적코드
4단계 링킹(Linking) 없음 (.exe, .out) 목적코드 + 라이브러리 결합

🧪 실습 – gcc 명령어로 직접 확인해보기

예시 파일: main.c

#include <stdio.h>
int main() {
    printf("Hello, Reverse!\n");
    return 0;
}

✅ 1단계: 전처리 (Preprocessing)

gcc -E main.c -o main.i

결과:

  • #define, #include, #ifdef 등 모든 매크로 확장 완료
  • stdio.h의 내용이 전부 삽입된 거대한 C 코드가 생성됨

리버싱 관점:

  • 전처리된 .i는 디버깅 시 매크로 단위 코드 추적, 헤더 기반 취약점 추적에 유용함

✅ 2단계: 컴파일 (Compilation)

gcc -S main.i -o main.s

결과:

  • C 코드가 어셈블리 코드(.s) 로 변환됨
  • .s 파일에는 x86 또는 ARM 명령어가 인간 친화적인 형태로 나열됨

리버싱 관점:

  • 어셈블리 분석의 시작 지점
  • 함수 경계, main 함수, 스택프레임 구조 확인 가능

✅ 3단계: 어셈블 (Assembling)

gcc -c main.s -o main.o

결과:

  • .o 파일 = 기계어로 변환된 목적코드
  • 실행 불가능하지만, 실행파일로 변환될 준비가 완료된 상태

리버싱 관점:

  • .o 파일은 Ghidra나 IDA로 열 수 있으며, 심볼이 보존되어 있는 경우 분석 용이
  • 라이브러리 병합 전 순수 코드 확인 가능

✅ 4단계: 링킹 (Linking)

gcc main.o -o main

결과:

  • 실행 가능한 바이너리 생성 (main.exe, a.out, main)
  • 외부 함수(printf 등)와 라이브러리가 연결된 완성본

리버싱 관점:

  • PE/ELF 구조 완성됨
  • .text, .data, .bss, .plt, .got 등 분석 단위가 등장함

🔬 각 파일 변화 흐름 요약

graph TD;
    main.c --> main.i[전처리 (.i)]
    main.i --> main.s[컴파일 (.s)]
    main.s --> main.o[어셈블 (.o)]
    main.o --> main[링킹 (실행파일)]

🧠 리버싱 응용 포인트

컴파일 단계 리버싱 포인트
전처리 헤더 파일 분석, 매크로 조건 분기 흐름 추적
컴파일 어셈블리로의 명령어 변환 확인
어셈블 목적코드 내 함수 분석, 심볼 테이블 추적
링킹 외부 라이브러리, Import Table 확인, 후킹 포인트 설정

✅ 정리

  • 실행파일은 단순히 main.c → main.exe가 아니라, 4단계의 명확한 변환 과정을 거쳐 생성된다.
  • 리버싱을 할 때는 어셈블리 파일(.s)링킹된 실행파일을 함께 분석해야 정확한 흐름을 파악할 수 있다.
  • 각각의 중간 산출물은 IDA, Ghidra, objdump 등으로 분석 가능하며, 디버깅/후킹/인젝션 대상 구조를 이해하는 데 도움이 된다.

📌 실전 과제

  1. 같은 main.c를 가지고 .s, .o, 실행파일을 직접 만들어보고 각각 열어서 확인해보기
  2. .s 어셈블리 파일에서 main 함수와 printf 호출 구문이 어떻게 어셈블리로 나타나는지 분석
  3. Ghidra로 .o 파일을 열어서 심볼 테이블 확인 실습
  4. 실행파일 포맷(PE/ELF), Import Table 분석, 심볼 해석, 함수 호출 규약(Cdecl, Stdcall 등)
반응형