본문 바로가기

드림핵

[드림핵 Reverse Engineering] Stage 1,2


[Stage 1]

#서론

 

 

- 리버스 엔지니어링(Reverse Engineering, 리버싱, 역공학) : 완성된 제품을 해체하고 분석하여 구조와 기능, 디자인을 파악하는 것

- 리버싱의 용도

    > Good Case

        1. 프로그램의 보안성 평가

        2. 악성코드 분석

     > Bad Case

        1. 프로그램 불법 크랙

        2. 게임핵

 


[Stage 2]

#바이너리 #컴파일

 

 

- 프로그램 : 연산 장치가 수행해야 하는 동작을 정의한 일종의 문서

- 바이너리(프로그램) : Stored-Program Computer에서 프로그램을 이진(Binary) 형태로 저장하므로 프로그램을 바이너리라고 하기도 함.

 

- 프로그래밍 언어(Programming Language) : 프로그램을 개발하기 위해 사용하는 언어

    > 고급 언어

        C, C++, Go, Rust 등

    > 저급 언어

        어셈블리어, 기계어 등

 

- 컴파일러(Compilter) : 소스코드를 컴퓨터가 이해할 수 있는 기계어 형식으로 번역해주는 소프트웨어

    ex. GCC, Clang, MSVC 등

- 인터프리터(Interpreter) : 사용자의 입력, 또는 사용자가 작성한 스크립트를 그때 그때 번역하여 CPU에 전달하는 프로그램

 

- 컴파일 과정

    1) 전처리(Preprocess) : 소스코드를 어셈블리어로 컴파일하기 전에 필요한 형식으로 가공하는 과정

        add.c → add.i

        - 주석 제거

        - 매크로 치환

        - 파일 병합

    2) 컴파일(Compile) : C로 작성한 소스코드를 어셈블리어로 번역하는 것.

        add.i → add.S

        -  소스코드의 문법 검사

        - 문법적 오류가 있다면 컴파일 멈추고 에러 출력

    3) 어셈블(Assemble) : 컴파일로 생성된 어셈블리어 코드를 ELF 형식의 목적 파일로 변환하는 과정.

        add.S → add.o

        - 어셈블리어 코드가 기계어로 변환되어 더이상 사람이 해석하기 어려워짐

    4) 링크(Link) : 여러 목적 파일들을 연결하여 실행 가능한 바이너리로 만드는 과정.

        add.o → add

        - 실행할 수 있는 프로그램 완성

 

- 디스어셈블(Disassemble) : 기계어로 컴파일된 코드를 어셈블리어로 재번역하는 것

- 디컴파일(Decompile) : 규모가 큰 바이너리를 쉽게  이해하기 위해 어셈블리어보다  고급언어로 바이너리를 번역하는 것

    > 디컴파일러 : Hex Rays, Ghidra 등