[Reversing] 리버스 엔지니어링이란?

(1) 리버스 엔지니어링이란 무엇인가?
1-1. 리버스 엔지니어링 개념
1-1-1. 리버스 엔지니어링
-
물건, 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하며 그 원리를 이해하고 단점을 보완하며 새로운 아이디어를 추가하는 일련의 작업
1-1-2. 리버스 코드 엔지니어링
-
소프트웨어 분야의 리버스 엔지니어링으로 소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻
(2) 리버싱 분석 방법
2-1. 정적 분석
-
파일의 겉모습을 관찰하여 분석하는 방법
-
정적 분석 단계에서는 파일 실행하지 않음
-
파일의 종류(DLL, EXE, DOC, ZIP등), 크기, 헤더(PE)정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 디지털 인증서 등 다양한 내용 확인
-
디스어셈블러를 이용하여 내부 코드와 그 구조를 확인하는 것
2-2. 동적 분석
-
파일을 실행시켜 그 행위를 분석하는 방법
-
디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법
-
파일 레지스트리, 네트워크 등을 관찰하면서 프로그램의 행위 분석
-
디버거를 이용하여 프로그램 내부 구조와 동작 원리를 분석
두 가지 방법을 잘 활용하면 프로그램을 리버싱할 때 시간 단축과 효과적인 분석이 가능하다.
디버깅은 리버싱 방법 중 비중이 크고 재미있는 분야이긴 하지만 리버싱의 하위 개념이다.
(3) Source Code, Hex Code, Assembly Code
-
리버싱에서 취급하는 대상은 보통 실행 파일인 경우가 많은
-
소스코드 없이 실행 파일의 바이너리 자체를 분석
3-1. Source Code

-
[그림 1]과 같이 개발 도구(Visual C++)에서 소스 코드를 빌드하면 실행 파일 생성
3-2. Hex Code

-
생성된 실행 파일은 컴퓨터가 이해할 수 있는 2진수(Binary) 형식으로 되어 있음
-
리버싱 전문가라도 0과 1로만 구성되어 있는 binary 파일을 직접 보고 의미를 해석하는 것은 매우 힘듦
-
2진수를 16진수(Hex)형식으로 변환시키는데, 자릿수가 줄어들면서 보기 수월하기 때문
3-3. Assembly Code

-
사실 Hex Code는 사람에게 직관적인 형태가 아님
-
Hex Code를 디스어셈블(Disassemble) 과정을 거쳐서 어셈블리 코드로 변환하여 보여줌
-
일반적인 리버시 과정에서는 어셈블리 코드를 분석하곤 함
(4) 패치와 크랙
4-1. 패치
-
프로그램의 파일 혹은 실행 중인 프로세스 메모리 내용을 변경하는 작업
-
주된 목적은 프로그램 취약점 수정과 기능 개선
4-2. 크랙
-
패치와 같은 개념이지만 특별히 의도가 비합법적이고 비도덕적인 경우를 구분하여 뜻함
-
주된 목적은 저작권을 침해하는 행위(불법 복제/사용 등)에 주로 사용
# Reference
'Reversing' 카테고리의 다른 글
[Reversing] Process Explorer (0) | 2020.03.26 |
---|---|
[Reversing] 스택 (0) | 2020.03.25 |
[Reversing] IA-32 Register (0) | 2020.03.25 |
[Reversing] 리틀 엔디언 표기법 (0) | 2020.03.24 |
[Reversing] OllyDbg 사용법 (0) | 2020.03.24 |