컴퓨터의 언어 기계어 , 0 과 1로 이루어져 있음. (굉장히 비효율적)
기계어를 번역하는 어셈블리어의 개발, 그 이후 C, C++, Go, Rust 등의 등장 (컴파일러 개발)
- 고급 언어와, 저급 언어의 등장
- (과거)에니악 : 내부 저장장치 X , 사람이 전설을 연결하여 컴퓨터에 전달 or 천공 카드에 프로그램을 기록함.
- (현재) 프로그램을 메모리에 저장 가능
프로그래밍 언어 : 프로그램을 개발하기 위해 사용하는 언어
소스 코드 (Source Code) : CPU 가 수행해야 할 명령들을 프로그래밍 언어로 작성한 것
컴파일 (Compile) : 소스코드를 컴퓨터가 이해하도록 기계어의 형식으로 번역하는 것
컴파일러 (Compiler) 컴파일을 해주는 소프트웨어
인터프리팅, 인터프리터 : 컴파일러와 다르게 사용자의 입력, 작성한 스크립트를 그때 그때 번역하여 CPU 에 전달
전처리 (Preprocessing)
컴파일러가 소스 코드를 어셈블리어로 컴파일하기 전에, 필요한 형식으로 가공하는 과정
(순서) 주석 제거 -> 매크로 치환 -> 파일 병합
컴파일 (Compile)
C로 작성된 소스 코드를 어셈블리어로 번역하는 것, 과정에서 문법적 오류가 있으면 컴파일을 멈추고 에러 출력
어셈블 (Assemble)
컴파일로 생성된 어셈블리어 코드를 ELF 형식의 목적 파일(Object file)로 변환하는 과정
링크(Link)
여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정
디스어셈블
디스어셈블이란?
컴파일된 프로그램의 코드는 기계어로 작성되어 있기에 이해하기가 어렵기 때문에, 이를 어셈블리어로 재번역한 과정
프로그램을 실행시키지 않고 분석하는 방법
(ex. 자전거를 탈 때 타지 않고, 멀리서 자전거의 구조를 분석하는 방법으로 생각하면 됨. * 여기서 자전거 = 프로그램 )
1) 장점
2) 단점
난독화란?
리버싱으로 보호하기 위한 방법으로 코드를 변형, 실행 흐름 변경하는 것
- 다양한 동적요소를 고려하기 어려움.
프로그램을 실행시키면서 분석하는 방법
(ex. 자전거를 직접 타보면서 부품에 대한 이해를 높이는 방법)
1) 장점
2) 단점
- 안티 디버깅(Anti Debugging) : 동적 분석의 일종인 디버깅을 방해하는 것