Try Attack/Reverse Engineering[basic]

MFC_reversing

D4tai1 2019. 5. 26.

1. MFC

(1) Visual Studio의 c++로 만들어지고 UI가 있는 프로그램을 리버싱할 경우 MFC로 개발된 프로그램을 리버싱할 가능성이 높다,

(2) 이 말은 리버싱을 하기 위해서는 MFC의 구조를 알아야 한다는 것을 의미하지 않을까?

(3) MFC(Microsoft Foundation Classes)란?

 [1] 통합개발환경을 위한 Visual C++에 부속되는 클래스 라이브러리이다.

 [2] 객체지향 프로그래밍을 기반으로 윈도우 애플리케이션 개발에 적합한 환경으로 제공되는 프레임워크이다.

 [3] 쉽게 말해 API로 개발 시 같은 일을 반복하지 않기 위해, 유사한 내용은 사전에 클래스로 만들어 놓고 제공하는 라이브러리이다.


2. MFC의 구조

(1) 메세지 처리방식

 [1] MFC는 객체지향의 특성을 지니며, C++의 방식을 따른다.

 [2] 버튼을 누를 경우, 포커스가 올 경우 등의 메세지에 대한 이벤트 처리방식을 이용해 각각의 함수가 만들어져 있다.

 [3] 그렇기 때문에 프로시저에 해당하는 핸들러를 찾는 것이 무엇보다 중요하다.


(2) rdata섹션과 가상함수

 [1] 개발자가 어떠한 클래스를 만들더라도 그 클래스는 MFC가 제공하는 기본클래스를 상속받아 쓰는 것이 많다.

 [2] 그렇기 때문에 가상함수(Virtual Function)와는 뗄 수 없는 관계이다.

 [3] 가상함수는 .rdata 섹션에 존재한다.


(3) MFC 기본 형태

 [1] MFC 프로그램의 기본 틀을 구성하고 있는 많은 오브젝트가 모두 클래스로 구현되어 있다.

 [2] 그래서 MFC개발자들은 AFX클래스에서 원하는 기능을 상속받아 클래스를 생성하는 방법으로 쉽게 코딩이 가능하다.

 [3] 그러나 이러한 부분은 어셈블리 코드로 보면 쉽게 보이지 않는다. ㅠㅜㅡ

 [4] 또한 기본 API를 이용해서 개발한 것보다 상세한 위치나 특성을 파악하기 힘들다.

 [5] 그래서!! 원하는 기능을 찾기 위해서는 MFC의 구조를 이해하고 메세지 핸들러와 가상함수의 위치를 찾는 작업이 필요하다.

 [6] 모두 다 분석하기는 어려우므로 특정버튼을 눌렀을 때나 초기화 루틴이 분석대상이 되므로 그 부분을 따라가면 좋다.

 [7] WinMain()에 해당하는 메세지 루프부분은 MFC의 클래스 집합인 MFC42.DLL에 들어있다.

 [8] 이곳은 메세지 큐에 메세지가 들어왔는지 확인하면서 메세지가 들어왔다면 해당 주소를 확인한다.

 [9] 이후 exe 내에 해당 주소로 점프해서 기능에 대한 동작을 한다.

 [10] 메세지 루프부분에 브레이크포인트를 걸었다면 계속 멈출 것이다.


(4) MFC로 개발 되었는지 확인하는 방법

 [1] PE header에서 MFC42.dll과 같은 MFC관련 dll을 import하는지 확인하면 된다.

 [2] 만약 프로텍터나 패커로 패킹이 되어 IAT 정보를 알 수 없을 경우는?

  ▶ unpack한다..

  ▶ 메모리에 풀렸을 때 코드를 보고 MFC관련 클래스가 .rdata 섹션에 있는지 확인한다.


(5) MFC라이브러리 등록

 [1] MFC는 마이크로소프트에서 심볼에 해당하는 lib파일이 모두 함께 배포된다.

 [2] 리버싱을 하기 전 lib파일을 등록해 놓는다면 보다 편하게 작업할 수 있다.

 [3] 올리디버거나 이뮤니티디버거의 debug - Select Import Libraries에서 등록할 수 있다.


(6) MFC프로그램의 초기화 루틴

 [1] MFC 프로그램은 초기화될 때 많은 액션을 취한다.

 [2] 다이얼로그 프로젝트의 초기화 루틴은 OnInitDialog()에서 이루어진다.

 [3] OnInitDialog()를 찾는 방법

  ▶ IDA가 import테이블로 이동하는 MFC42.dll의 OnInitDialog()함수를 분석해준다.

  ▶ MFCApplication의 프로젝트를 만들었다면 CMFCApplication 클래스가 생성되고 그 안에 CMFCApplicationDlg내에서 작업할 것이다.

  ▶ 그 안에 OnInitDialog()는 오버라이딩 되서 CDialog의 OnInitDialog()에서 시작한다.

  ▶ CDialog는 MFC기본 클래스로 lib파일로 위치를 알 수 있다.


'Try Attack > Reverse Engineering[basic]' 카테고리의 다른 글

Virtual address  (0) 2019.07.12
위장 악성코드를 실행하는 방법  (0) 2019.05.31
[codegate_2017] angrybird  (0) 2019.04.08
[csaw CTF 2015] wyvern  (0) 2019.04.08
BreakPoint  (0) 2018.12.28

댓글