스터디에서 주로 리눅스에서 C언어 프로그램의 취약점을 찾는 공격을 진행하기 때문에 C언어에 대한 공부를 해보자.
컴파일 과정(Compile Process) ?
쉽게 말해, visual studio 에서 F5키를 눌러서 c언어 실행시키는 그 과정이다.
위 과정을 거치면서 실행 가능한 바이너리 파일로 만들어진다.
* 파일(file) ?
의미 있는 정보를 담고 있으며, 이름을 가지고 있는 저장 장치상 논리적인 단위
C언어에서는 이러한 파일을 바이트별로 따로 읽을 수 있는 바이트의 집합으로 취급한다.
1) 바이너리 파일(binary file)
: 데이터의 저장과 처리를 목적으로 0과 1의 이진 형식으로 인코딩된 파일
프로그램이 이 파일의 데이터를 읽거나 쓸 때 어떤 변환이 일어나지 않는다.
2) 텍스트 파일(text file)
: 사람이 알아볼 수 있는 문자열로 이루어진 파일
프로그램이 이 파일의 데이터를 읽거나 쓸 때는 포맷 형식에 따라 데이터의 변환이 일어난다.
1. 전처리기(Preprocessor)
C언어에서 printf 함수를 사용하기 위해 #include <stdio.h> 를 항상 명시한다.
이렇게 #으로 시작하는 구문을 처리하는 것이 전처리기이다.
예를 들어, #define A 10 을 명시하고 int main() 에서 int A; 을 선언해주면 전처리기 과정을 통해서
int 10; 으로 치환된다.
2. 컴파일러(Compiler)
컴파일러는 해석기, 번역기라는 뜻으로 우리가 작성한 소스 코드를 컴퓨터가 이해할 수 있는 컴퓨터 언어로
변환시켜주는 역할을 한다.
소스 코드는 인간들이 이해하기 쉽도록 설계된 "고수준 언어"라고 하고, 기계가 이해할 수 있는 언어는
"저수준 언어"라고 한다.
즉, 고수준 언어를 기계가 이해할 수 있는 저수준 언어로 변환해주는 것이다.
3. 에셈블러(Assembler)
어셈블리어를 기계어 형태의 오브젝트 코드로 해석해주는 컴퓨터 언어 번역 프로그램이다.
완전히 기계어로 바꿔주는 역할을 한다.
목적코드(=오브젝트 코드) 파일은 어셈블된 프로그램 명령어와 데이터가 들어있는 ELF 바이너리 포맷 구조를 갖는다.
* ELF(Executable and Linking Format) ?
실행 가능한 바이너리 또는 오브젝트 파일 등의 형식을 규정한 것
4. 링커(Linker)
링커는 여러 개의 오브젝트 파일 또는 라이브러리들을 연결하는(=링크) 역할을 한다.
이 과정이 끝나면 실행 가능한 실행파일(.exe)가 만들어진다.
'System' 카테고리의 다른 글
Hackctf x64 Buffer Overflow write-up (0) | 2022.03.28 |
---|---|
Hackctf Basic_BOF #2 Write-up (0) | 2022.03.28 |
Handray2 (0) | 2022.03.28 |
Handray (0) | 2022.03.28 |
시스템 해킹이란? (0) | 2021.09.11 |
댓글