반응형
📘 컴파일 과정의 내부 구조 – 소스코드에서 실행파일까지
🔍 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 등으로 분석 가능하며, 디버깅/후킹/인젝션 대상 구조를 이해하는 데 도움이 된다.
📌 실전 과제
- 같은 main.c를 가지고 .s, .o, 실행파일을 직접 만들어보고 각각 열어서 확인해보기
- .s 어셈블리 파일에서 main 함수와 printf 호출 구문이 어떻게 어셈블리로 나타나는지 분석
- Ghidra로 .o 파일을 열어서 심볼 테이블 확인 실습
- 실행파일 포맷(PE/ELF), Import Table 분석, 심볼 해석, 함수 호출 규약(Cdecl, Stdcall 등)
반응형
'게임해킹 > knockon 부트캠프' 카테고리의 다른 글
[3주차 TIL] KnockOn Bootcamp - 메모리 구조와 매핑 (0) | 2025.04.22 |
---|---|
[3주차 TIL] KnockOn Bootcamp - 링커와 로더 (0) | 2025.04.22 |
[3주차 TIL] KnockOn Bootcamp - 아키텍쳐 (2) | 2025.04.22 |
[2,3주차 TIL] KnockOn Bootcamp - 프로젝트 만들기 (0) | 2025.04.15 |
[2주차 TIL] KnockOn Bootcamp - 탐색 알고리즘 (0) | 2025.04.15 |