리버스 엔지니어링(Reverse Engineering RE:역공학)의 일반적인 의미는 물건이나 기계 장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석하여 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업.
소프트웨어 분야의 리버스 엔지니어링은 리버스 코드 엔지니어링(Reverse Code Engineering, RCE)라고 하는데 대체로 소프트웨어를 리버싱 관점에서 상세하게 분석한다는 뜻.
리버싱(분석)방법에는 크게 두 가지 방법이 있다. 정적분석과 동적 분석이다.
1) 정적분석
파일 겉모습을 관찰하여 분석하는 방법. 정적 분석 단계에서는 파일을 실행하지 않는다. 파일의 종류(EXE,DLL,DOC 등), 크기 해더(PE)정보, Import/Export API, 내부 문자열, 실행압축 여부, 등록 정보, 디버깅 정보, 디지털 서명 등의 다양한 내용을 확인하는 것. 또한 디스어셈블러(Disassembler)를 이용해서 내부 코드와 그 구조를 확인하는 것도 정적 분석의 범주에 들어갈 수 있다.
정적분석으로 얻어낸 다양한 정보는 동적 분석에 좋은 참고자료가 된다.
2) 동적 분석
파일을 직접 실행시켜서 그 행위를 분석하고, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세히 살펴보는 방법. 파일, 레지스트리(Registry),네트워크 등을 관찰하면서 프로그램 행위를 분석. 또한 디버거(Debugger)를 이용하여 프로그램 내부구조와 동작원리를 분석할 수 있다.
대체로 정적분석으로 정보수집을 하면서 해당 프로그램의 구조 동작 원리를 예측, 그 예측으로 동적 분석 방법에 아이디어를 제공하므로 두가지 방법을 잘 활용하면 더 효과적인 분석이 가능하다.
리버싱에서 취급하는 대상은 보통은 실행파일인 경우가 많다. 소스코드 없이 실행파일의 바이너리 자체를 분석한다. 그렇다면 소스와 바이너리 코드 사이의 관계를 살펴보자.
1. Source Code
소스 코드는 Hello.cpp같이 우리가 평소 코딩을 할때 원본 파일을 말한다.
2. Hex Code
생성된 실행파일은 컴퓨터가 이해할 수 있는 2진수(Binary) 형식으로 되어 있다. 하지만 0과 1로만 구성되어 있는 Binary 파일을 직접 보기에는 어려우므로 2진수를 16진수 HEX로 변환시켜서 보기 수월하게 만듬.
3. Assembly Code
HEX 코드는 사람에게 직관적인 형태가 아니다. 따라서 사람이 좀더 이해하기 쉬운 어셈블리(Assembly)코드 형태로 보는것. 일반적인 리버싱 과정에서는 위와 같은 어셈블리 코드를 분석한다.
'리버스 엔지니어링' 카테고리의 다른 글
리틀 엔디언 표기법 (0) | 2018.01.04 |
---|---|
Hello World 문자열 패치 (0) | 2018.01.03 |
Ollydbg BP 설치 방법 (0) | 2018.01.03 |
ollydebug를 사용해서 디버깅 입문해보자 (0) | 2018.01.03 |
리버스 엔지니어링 환경 구축 (0) | 2018.01.02 |