본문 바로가기

0x00 /0x01 Reversing

- 리버싱 기초

# 리버스 코드 엔지니어링 (Reverse Code Enginerring)

 

- 말 그대로 완성된 소프트웨어의 코드를 역으로 분석하는 것이다.

- RCE, RE, 리버싱이라고 불리기도 한다.

- 소프트웨어를 역공학하는 것, 즉 분석 혹은 상세 분석하는 것이다.



( 이미지 출처 : http://chrispinionlive.com/?p=2276 )

 

 

 

# 리버싱(분석) 방법

 

- 실행 파일의 분석방법에는 크게 2가지 방법이 있다. ( 정적 분석, 동적 분석 )

 

 1. 정적 분석

 

 - 파일의 겉 모습을 관찰하여 분석하는 방법이다.

 

 - 정적 분석 단계에서는 파일을 실행하지 않는다.

 

 - 파일의 종류(EXE, DLL, DOC, ZIP등), 크기, 헤더(PE) 정보, Import/Export API, 내부 문자열, 실행 압축 여부, 등록 정보, 디버깅 정보, 

   디지털 인증서 등 다양한 내용을 확인하는 것이다.

 

 - 디스어셈블러를 이용하여 내부 코드와 그 구조를 확인하는 것도 정적 분석에 포함된다.

 

 * 참고 : 이렇게 정적 분석으로 얻은 정보들은 동적 분석을 할 때 좋은 참고 자료로 사용된다. 

 

 

 2. 동적 분석

 

 - 파일을 직접 실행시켜서 그 행위를 분석하고, 디버깅을 통하여 코드 흐름과 메모리 상태 등을 자세하게 살펴보는 방법이다.

 

 - 파일, 레지스트리, 네트워크 등을 관찰하면서 프로그램의 행위를 분석한다.

 

 - 디버거를 이용하여 프로그램의 내부 구조와 동작 원리를 분석하는 것도 동적 분석에 포함된다.

 

 

 

 

# Source Code, Hex Code, Assembly Code

 

- Source Code : 소스 코드는 프로그래밍 언어로 소프트웨어 등을 설계 할 때 사용되는 코드를 말한다.

                        (개발을 할 땐, 프로그래밍 언어로 작성이 되고, 컴파일러에 의해 컴퓨터가 이해할 수 있는 기계어(Binary)로 변환된다.)

 

- Hex Code : Hex Code는 말 그대로 16 진수 코드이다. 사람이 0과 1로 표현된 Binary Code를 해석하는 일은 매우 어렵기 때문에, 

                   분석을 할 때Binary Code를 Hex Code로 변환시켜서 분석을 한다. 

                   (Binary Code를 Hex Code로 변환시켜주는 유틸리티로는 Hex Editor가 있다.)

 

- Assembly Code : 기계어와 일대일 대응이 되는 컴퓨터 프로그래밍의 저급 언어이다. 위의 2가지 코드보다는 사람이 분석하기가 훨씬 쉽다.

 


즉, 리버싱을 한다는 것은 일반적으로 Binary Code로 되어있는 실행 파일을 분석하는 작업인데, 분석을 좀 더 편하게 하기 

위해서, Binary Code를 OllyDbg와 같은 툴을 이용하여 Assembly Code로 변환시켜 분석을 한다.

 

 

* 참고 : 실행 파일을 생성하는 어떠한 프로그래밍 언어라도 빌드 과정을 거치면 모두 기계어로 변환된다. 

            디버거를 이용하여 어떠한 실행 파일이라도 어셈블리 언어로 번역해서 볼 수 있기 때문에, 기본적으로 어셈블리 언어를 잘 알아야 한다.

 

 

* 참고 : Packer와 Protector

           ① Packer (Run Time Packer)

               - 실행 압축 유틸리티. 실행 파일의 코드, 데이터, 리소스 등을 압축시킨다. 

                 일반 압축 파일과 다른 점은 실행 압축된 파일 그 자체도 실행 파일이라는 것이다.

           ② Protector

               - 실행 압축 기능 외에 파일과 그 프로세스를 보호하려는 목적으로 anti-debugging, 

                  ani-emulating, anti-dump 등의 기능을 추가한 유틸리티이다.

 

 

 

 

 

# 패치와 크랙

 

 1. 패치 (Patch)

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

 

 

 2. 크랙 (Crack)

 - 패치와 같은 개념이지만 크랙은 의도가 비합법적이고 비도덕적인 경우를 따로 구분하여 크랙이라고 한다.

 

* 예를 들면 어떤 소프트웨어에 취약점이 존재하여, 이를 개선하기 위한 업데이트 같은 경우를 패치라고 말하며, 

  어떤 소프트웨어를 사용하기 위해 인증 과정을 거쳐야하는데 이를 우회하기 위해 프로세스 메모리의 내용을 

  변경하는 경우, 저작권 침해 및 불법 복제등이 목적인 경우를 크랙이라고 말한다.





# 참고 도서 : 리버싱 핵심원리