리버스 엔지니어링(Reverse Engineering)은 이미 만들어진 시스템이나 장치에 대한 해체나 분석을 거쳐 그 대상의 구조와 기능, 디자인 등을 알아내는 일련의 과정을 말한다.
요약하자면 "완성품의 설계도 없이 구조와 동작 과정을 알아내는" 모든 단계를 말하고 이를 역공학이라 지칭한다.

소스 코드가 없는 상태에서 컴파일된 대상 소프트웨어의 구조를 여러가지 방법으로 분석하고, 메모리 덤프를 비롯한 바이너리 분석 결과를 토대로 동작 원리와 내부 구조를 파악한 다음, 이를 바탕으로 원래의 소스가 어떻게 작성된 것인지 알아내는 과정이다.
Stack Analysis(정적 분석)
정적 분석은 프로그램을 실행시키지 않고 분석하는 방법이다. 정적 분석을 위해서는 실행 파일을 구성하는 모든 요소, 실행 파일을 구성하는 모든 요소, 대상 실행 파일이 실제로 동작할 CPU 아키텍처에 해당하는 어셈블리 코드를 이해하는 것이 필요합니다.
Dynamic Analysis(동적 분석)
동적 분석은 프로그램을 실행시켜서 입출력과 내부 동작 단계를 살피며 분석하는 방법이다. 동적 분석을 위해서는 실행 단계별로 자세한 동작 과정을 살펴봐야 하므로, 환경에 맞는 디버거를 이용해 단계별로 분석하는 기술을 익혀야 한다.
코드가 컴파일 되는 과정

사람이 이해할 수 있는 소스 코드를 컴퓨터가 이해할 수 있는 형태인 프로그램으로 바꾸려면 컴파일을 거쳐야 한다.
이러한 과정에 사용되는 프로그램을 컴파일러 라고 부른다. 모든 프로그래밍 언어가 컴파일러를 통해서 실행 가능한 바이너리가 되는 것은 아니다, 대개는 단독적으로 실행 가능한 바이너리가 되기 위해서 컴파일 과정을 거친다. 컴파일러가 소스 코드를 바이너리로 변환하기 위해서는 몇 가지 단계를 거친다.

원본 소스 코드는 사람이 알아보기 쉽도록 각종 주석이나 매크로 등을 포함하고 있다. 참조할 헤더 파일을 포함하고 있기도 한다. 이와 같은 정보는 실제로는 코드가 아니라 참조를 위해 붙여둔 정보이므로, 컴파일러는 이를 모두 미리 처리해서 다음 단계에서 변환할 준비를 마치면 '중간 언어'를 컴파일ㄹ가 분석하고 최적화하여 어셈블리 코드로 만들어 준다.
어셈블리 코드는 컴퓨터가 이해할 수 있는 기계 코드를 사람이 알아보기 쉽게 명령어(Instruction) 단위로 표현한 것이다.
즉 어셈블리 코드와 기계 코드는 1:1 대응이 가능하므로, 최종적으로 어셈블리 코드가 기계 코드로 번역되는 과정을(어셈블, Assemble) 거쳐 실행 가능한 바이너리가 완성된다.

바이너리가 어떤 방식으로 동작하는지, 어떤 소스 코드를 바탕으로 만들어졌는지를 알아내려면 분석가는 컴파일러가 수행하는 과정을 역으로 진행해야 한다.
주어진 바이너리를 어셈블리 코드로 변환하고, 변환된 어셈블리 코드를 분석하면 대상 바이너리가 어떤 식으로 동작하는지 알 수 있게된다. 이렇게 바이너리 코드를 어셈블리 코드로 변환하는 과정을 Disassemble(디스어셈블) 이라 한다.
정적 분석 방법에 해당되는 방법은 디스어셈블을 거쳐 나온 어셈블리 코드를 분석하여 소프트웨어의 동작 구조를 알아내는 과정을 가리킨다.
'Reversing' 카테고리의 다른 글
Base Relocation Table (0) | 2021.12.30 |
---|---|
PE File Format (0) | 2021.12.15 |
윈도우 기초 (0) | 2021.04.22 |
easy-crackme1 (0) | 2021.02.20 |
x64 (0) | 2021.01.29 |
댓글