1장 리버싱 스토리

.1 리버스 엔지니어링

일반적인 의미에서 리버스 엔지니어링(Reverse Engineering; 역공학)이라고 하면 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업이라고 할 수 있습니다.

.2 리버스 코드 엔지니어링

리버스 코드 엔지니어링(Reverse Code Engineering)이란 소프트웨어 분야에서의 리버스 엔지니어링이라 생각하면 된다. 아직 용어정립이 안되어 RCE, RE, 리버싱, 역공학 등을 막 섞어 사용하고 있으며 이 책에서도 리버싱, 분석, 상세분석 등으로 리버스 엔지니어링을 표현한다.

.2.1 분석 방법

분석 방법은 크게 두가지로 나눌 수 있다. 정적분석, 동적분석.

1) 정적분석

파일의 겉모습을 보고서 분석하는 방법이다. 정적 분석 단계에서는 프로그램을 실행하지 않음.

파일의 종류(EXE, DLL, DOC, ZIP 등), 크기, 헤더 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인한다. 또, 디스어셈블러(Disassembler)를 활용하여 내부 코드를 확인하는 것도 정적분석에 범주에 들어갈 수 있다.

정적분석 방법으로 얻은 정보는 추후 동적분석을 할 때 유용하게 쓰임

2) 동적분석

파일을 직접 실행시켜서 그 동작과 행위를 분석하고, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법이다. 파일, 레지스트리(Registry), 네트워크 등을 관찰하면서 프로그램 행위를 분석한다. 또, 디버거(Debugger)를 이용하여 프로그램 내부 구조와 동작원리를 분석할 수 있다.

정적분석으로 정보 수집 → 프로그램 구조와 동작원리 예측 → 동적 분석하며 프로그램 행위 분석.

※ 리버싱 ≠ 디버깅

.2.2 소스코드, 헥스코드, 어셈블리코드

분석하는 파일은 보통 실행파일

분석할 때는 소스코드 없이 바이너리 자체를 분석.

⇒ 소스코드와 바이너리 코드의 관계를 알면 리버싱에 도움됨.