발자취
[Reverse Engineering] #01. Binary 본문
본 게시물은 Dreamhack의 Reverse Engineering 로드맵 과정을 학습한 기록이다.
#01 서론
- 저급 언어: 기계어, 어셈블리어 등
- 기계어: 컴퓨터의 언어. 0과 1로 이루어짐
- 어셈블리어: 기계어보다 좀 더 사람이 이해하기 쉬운 언어
- 고급 언어: C, C++ 등과 같이 사람이 이해하기 쉬운 언어
사람들이 이해하기 쉬운 고급 언어 또는 어셈블리어로 프로그램을 개발한 뒤, 이를 기계어로 변환하여 컴퓨터가 이해할 수 있게 하는 과정을 거침.
- 고급 언어 -> [컴파일러] -> 기계어- 어셈블리어 -> [어셈블러] -> 기계어
#02 프로그램과 컴파일
1. 프로그램: 연산 장치가 수행해야 하는 동작을 정의한 일종의 문서.
- 프로그램을 연산 장치에 전달하면 CPU가 그 명령들을 처리
- programmable: 사용자가 정의한 프로그램을 해석해 명령어를 처리할 수 있는 연산 장치
- programmable한 연산 장치: 컴퓨터
- non-programmable한 연산 장치: 계산기
- 과거에는 프로그램을 내부 저장 장치에 저장할 수 없었음(비효율적) → Stored-Program Computer로 프로그램을 메모리에 저장할 수 있게 됨
- 프로그램 == 바이너리: 개발자나 해커 등은 프로그램을 바이너리라고 부름 → 이는 Stored-Program Computer의 저장 장치에 프로그램이 바이너리 형태로 저장되기 때문
2. 컴파일
1) 컴파일러와 인터프리터
- 컴파일: 프로그래밍 언어로 작성한 소스 코드를 컴퓨터가 이해할 수 있는 기계어 형식으로 번역하는 것
- 컴파일러: 컴파일을 해주는 소프트웨어 (예: GCC, MSVC 등)
- 인터프리팅: 사용자의 입력 또는 사용자가 작성한 스크립트를 그때 그때 번역하여 CPU에 전달 (Python, Javascript 등은 컴파일을 필요로 하지 않고 인터프리팅 과정을 거침!)- 인터프리터: 인터프리팅을 해주는 프로그램
3. 컴파일 과정
- C언어 (전처리 - 컴파일 - 어셈블 - 링크)
1) 전처리: 컴파일러가 소스코드를 어셈블리어로 컴파일하기 전에 필요한 형식으로 가공하는 과정. 다음과 같은 과정을 가짐
(1) 주석 제거
(2) 매크로 치환: #define으로 정의한 매크로의 이름을 값으로 치환
(3) 파일 병합
- gcc에서는 -E 옵션으로 전처리 결과를 확인할 수 있음. (파일명.i)
$ gcc -E 파일명.c > 파일명.i
$ cat 파일명.i
2) 컴파일: C로 작성된 소스코드 → 어셈블리어로 번역 (소스코드의 문법 검사 후 오류가 있으면 컴파일을 중지하고 에러 출력)
- -S 옵션으로 소스 코드를 어셈블리 코드로 컴파일 가능
- 최적화 기술로 효율적인 어셈블리 코드를 생성함 (-o 옵션)
- 최적화한 후 컴파일하면 반복문을 어셈블리어로 옮기는 것이 아니라 반복문의 결과로 가질 값을 직접 계산해 이를 대입하는 코드를 생성함
- $ gcc -S 파일명.i -o 파일명.S $ cat 파일명.S
3) 어셈블: 컴파일로 생성된 어셈블리어 코드를 목적 파일로 변환하는 과정 (사람이 해석하기 어려움)
- 리눅스에서는 ELF 형식(리눅스의 실행파일 형식)의 목적 파일을 가짐
- 윈도우에서는 PE 형식의 목적 파일을 가지게 함
- -c 옵션으로 목적 파일로 변환함$ gcc -c 파일명.S -o 파일명.o
4) 링크: 여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정
#03 디스어셈블과 디컴파일
1. 디스어셈블: 어셈블의 역과정. 컴파일된 프로그램의 코드는 기계어이므로 사람이 이해하기 어렵기 때문에 디스어셈블 과정을 거침
- 바이너리 코드 → 어셈블리 코드 → [리버스 엔지니어링] → 소스코드
2. 디컴파일: 어셈블리어보다 고급 언어로 바이너리를 번역
- 어셈블리어와 기계어는 거의 일대일로 대응되나, 고급 언어와 어셈블리어는 이런 대응 관계가 없어 바이너리의 소스코드와 동일한 코드를 생성하지는 못함 → 그러나 동작을 왜곡하지 않고 효율적이기 때문에 사용하는 것이 유리
'Dreamhack Study > Reverse Engineering' 카테고리의 다른 글
| [Reverse Engineering] #05-2. 어셈블리어와 x86-64 - Quiz (0) | 2024.05.30 |
|---|---|
| [Reverse Engineering] #05-1. 어셈블리어와 x86-64 - 이론 (0) | 2024.05.29 |
| [Reverse Engineering] #04. Windows Memory Layout (0) | 2024.05.29 |
| [Reverse Engineering] #03. 컴퓨터 구조와 명령어 집합 구조 (0) | 2024.05.29 |
| [Reverse Engineering] #02. 동적 분석과 정적 분석 (0) | 2023.05.14 |