지금까지 리버스 엔지니어링에 대해 수박 겉핡기씩으로 공부 해왔지만 이번 기회에 제대로 공부해보고자 하여 리버스 엔지니어링에 대해 공부한 내용을 공유하고자 합니다.
제가 주로 공부하는데 참고하는 책은 "리버싱 핵심 원리"라는 서적이며 그 외에도 인터넷 서칭을 통해 더 많은 내용을 찾아 공부하려고 합니다.
게시글을 보시고 질문이나 지적할 내용이 있다면 댓글로 달아주시면 감사하겠습니다.
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
제가 처음으로 리버스 엔지니어링에 대해 알게 된건 대학교 1학년 시절 어떠한 롤 전적 검색 사이트에 롤 전적 검색 원리가 너무 궁금해 문의 메일을 넣었던 것으로부터 시작했습니다.
롤 전적 검색 사이트는 저에게 답변으로 리버스 엔지니어링을 통해 이루어진다라는 답변을 주었습니다.
하지만 1학년이던 저에게는 리버스 엔지니어링은 너무나 어려운 내용이였기에 군대를 다녀온 후 3학년 때부터 조금씩 관련 서적에 대해서 읽기 시작했습니다.
많은 내용을 알진 못했지만 프로그램 개발자로써 프로그램의 내부가 어떻게 이루어졌는지 알 수 있다는 것에 많은 매력을 느꼈고 개발자라면 충분히 알아야 하는 내용이라고 생각이 들었습니다.
그러기에 이렇게 공부하는 내용을 보시는 여러분들과 공유하고자 합니다. 여러분들도 개발자로써 이 내용에 대해서 이해하신다면 많은 도움이 될 것이라고 생각 됩니다.
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
리버스 엔지니어링이란?
- 소프트웨어의 한 분야로, 이미 만들어진 시스템을 역으로 추적하여 처음의 문서나 설계기법 등의 자료를 얻어내는 일
- 장치 또는 시스템의 기술적인 원리를 그 구조분석을 통해 발견하는 과정
- 물건이나 기계장치 혹은 시스템 등의 구조, 기능, 동작 등을 분석아혀 그 원리를 이해하며 단점을 보완하고 새로운 아이디어를 추가하는 일련의 작업
더 많은 정의가 있겠지만 프로그래머의 입장에서 리버스 엔지니어링은 이미 컴파일이 된 프로그램을 소스코드 없이 분석하는 작업이라고 생각합니다.
이러한 리버싱 엔지니어링의 실행파일 분석 방법은 크게 2가지로 나누어집니다.
- 정적 분석
- 동적 분석
정적분석은 실제 실행 없이 컴퓨터 소프트웨어를 분석하는 것을 의미합니다. 파일의 종류, 크기, 헤더 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보 등의 다양한 내용을 확인하는 것입니다. 또한 디스어셈블러를 이용해서 내부 코드와 그 구조를 확인하느 그것도 정적 분석의 범주에 들어갈 수 있습니다.
동적분석은 실제 또는 가상 프로세서에서 프로그램을 실행함으로써 수행하여 분석하는 것을 의미합니다. 파일을 직접 실행시켜서 그 행위를 분석하고, 디버깅을 통하여 콛 흐름과 메모리 상태 등을 자세히 살펴보는 방법입니다. 파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램의 행위를 분석합니다. 또한 디버거를 이용하여 프로그램 내부 구조와 동작 원리를 분석 할 수 있습니다.
프로그래밍 공부를 막 시작하게 되면 C/Python/JAVA/C++ 등의 언어를 통해 프로그램을 작성하고 컴파일을 하여 실행파일을 만들게 되는데, 앞으로 리버싱을 하게 되면서 자주보게 될 3가지 종류의 코드가 존재합니다.
- Source Code
- Hex Code
- Assembly Code
Source Code는 프로그래밍 언어를 통해 작성한 코드를 의미합니다.
그 후 컴파일을 통해 생성된 실행 파일은 컴퓨터가 이해할 수 있는 2진형식으로 되어 작성되게 됩니다. 0과 1로 이루어진 binary파일을 통해서는 아무리 대단한 리버싱 전문가라도 직접 보고 의미를 해석하는데 어려움이 있습니다. 따라서 2진수를 16진수 형식으로 변환시켜 확인하는 hex Code가 존재합니다.
위 프로그램은 hex Editor 입니다.
하지만 Hex Code 역시 사람에게는 직관적인 형태가 아닙니다. 따라서 좀 더 사람이 이해하기 쉬운 어셈블리 코드 형태로 보기 위해 디버거를 이용합니다. 아래의 사진처럼 디버거 이용시 어셈블리어 코드를 확인 할 수 있습니다.
위의 3가지 코드를 앞으로 자주 보게 될 것입니다.
저는 "리버싱 핵심 원리"를 참고하여 작성하지만 예제에 대해서는 언급하지 않을 예정입니다.
혹시 궁금사항이 있으시면 댓글로 달아주시면 최대한 답변 드리도록 하곘습니다.
'리버스 코드 엔지니어링' 카테고리의 다른 글
[리버스 엔지니어링] 함수 호출 규약 정리 (0) | 2018.11.14 |
---|---|
[리버스 엔지니어링] CPU 레지스터 (0) | 2018.11.14 |
[리버스 엔지니어링] 바이트 오더링 (0) | 2018.10.31 |
[리버스 엔지니어링] OllyDbg 간단한 사용법 (0) | 2018.10.30 |
댓글