#01_리버싱 스토리

 

1.1. 리버스 엔지니어링

리버스 엔지니어링(Reverse Engineering, 역공학)이란 물건이나 기계 장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업

 

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

리버스 코드 엔지니어링은 소프트웨어 분야의 리버스 엔지니어링

 

1.2.1. 리버싱(분석) 방법

실행 파일(exe)의 분석 방법에는 정적 분석과 동적 분석으로 크게 두가지 방법 존재

 - 정적 분석 : 파일의 겉모습을 관찰하여 분석하는 방법으로 파일을 실행하지 않고 파일의 종류, 크기, 헤더 정보, API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등의 다양한 내용을 확인하는 것.

   또한 디스어셈블러(Disassembler)를 이용해서 내부 코드와 그 구조를 확인하는 것도 정적 분석의 범주에 들어감

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

 

1.2.2. Source Code, Hex code, Assembly Code

리버싱에서 취급하는 대상은 보통 실행 파일인 경우가 많으며 소스코드 없이 바이너리 자체를 분석한다.

 - Source Code : 그림과 같이 개발도구 에서 소스코드(.cpp)를 빌드하면 실행 파일 생성

 - Hex Code : 생성된 실행 파일은 컴퓨터가 이해할 수 있는 2진수(바이너리) 형식으로 되어 있음. 하지만 0과 1로만 구분되어 있는 바이너리 파일을 직접 보고 의미를 해석시키는 것은 매우 어려워 2진수를 16진수(Hex)형식으로 변환시키곤 하는데, 자릿수가 줄어들면서 보기에 수월함. tmain()의 소스코드는 빌드 과정을 거치면서 다음 그림과 같은 Hex Code로 변환됨.

HelloWorld.exe Hex Code

 - Assembly Code : 사람이 좀 더 이해하기 쉬운 코드 형태로 일반적인 리버싱 과정에서는 어셈블리 코드를 분석함.

어셈블리 코드

1.2.3. 패치와 크랙

프로그램의 파일 혹은 실행중인 프로세스 메모리의 내용을 변경하는 작업을 패치(Patch)라고 함.

크랙(crack)은 패치와 같은 개념이지만 특별히 그 의도가 비합법적이고 비도덕적인 경우를 구분하여 말함.

패치의 주된 목적은 프로그램의 취약점 수정 기능 개선 등이며, 크랙은 주로 저작권을 침해하는 행위에 사용됨.

+ Recent posts