바이너리 파일(Binary File)
- 파일 중 텍스트 파일이 아닌 파일, 즉 데이터의 저장과 처리를 목적으로 0과 1로 나타나는 파일이며 jpg, gif, pdf 등이 여기에 해당한다.
- 바이너리 파일을 읽거나 쓸 때는 프로그램이나 하드웨어 프로세서를 통한 변환 과정이 필요하다. 이 과정을 복호화(decoding)이라고 한다. 0과 1로만 구성되어 있어 원본 그대로는 의미를 파악할 수 없기 때문이다.
- 바이너리 파일에 포함되는 정보로 이 바이너리 파일에 대한 정보를 담는다.
파일 시그니쳐(File Signature)
- 파일에 대한 정보를 주는 파일 헤더 또는 파일 헤더와 파일 푸터에 모두 존재하는 숫자 식별자이다.
- magic number라고도 불리는데 모든 파일 형식은 고유의 파일 시그니쳐를 가지며 이는 다른 형식의 파일 시그니쳐와 중복되지 않는다.
파일 시그니쳐는 파일의 위/변조를 찾는 등의 보안 목적에서 사용된다.
PE & ELF
PE(Portable Exacutable)
- 윈도우 OS에서 표준 바이너리 파일 형식이다.
- UNIX 기반 OS에서 표준 바이너리 파일 형식이다.
Mac OS에서는 Mach-O 파일 형식이 사용된다.
컴파일(Compile)
- 아래의 예시는 C 프로그램의 컴파일 과정이다.
1. 전처리(Preprocessing phase)
- #include, #define 등과 같은 전처리기를 토대로 원래 C 프로그램을 변경한다.
- .c 파일에서 .i 파일이 된다.
2. 컴파일(Compilation phase)
- C 프로그램을 어셈블리어 프로그램으로 번역한다.
- 구문 오류(syntax error)가 발생하는 시점이다.
- .i 파일에서 .s 파일이 된다.
3. 어셈블(Assembly phase)
- 어셈블리어 프로그램(text)을 기계어 프로그램(binary)으로 변환한다.
- .s 파일에서 .o파일이 된다.
4. 링킹(Linking phase)
- .o 목적 파일들을 모두 합쳐 실행 가능한 파일을 생성한다.
- 작성된 코드가 라이브러리들과 연결된다.
디스어셈블러
- 기계어를 어셈블리어로 변환하는 프로그램을 의미한다.
IDA
- 가장 많은 기능을 가지고 있으나 유료인 디버거이다.
Ghidra
- 미국 국가 안보국에서 만든 리버스 엔지니어링을 위한 프레임워크이다.
gdb
- C, C++ 등 여러 언어를 지원하는 디버거이다.
x64dbg
- DLL, EXE 파일을 어셈블러 코드로 볼 수 있다.(윈도우 전용이라는 뜻)
Ollydbg
- 소스 코드가 없을 때 유용하게 사용되는 바이너리 코드 분석 디버거이다.