'PE'에 해당되는 글 2건

  1. 2012.04.03 1.시작하며... (3)
  2. 2009.12.08 FunnyPE (4)

Naver Perl Community & Study Cafe


2012.04.03 16:33

1.시작하며...


안녕하세요 h0ney 입니다!

이번 강좌에 설명할 내용은 레지스트리 Hive 파일 포멧 분석기(Registry Hive File Format Analyzer)  입니다.

사이버 포렌식에서 Registry Hive 파일 분석은 선택이 아니라 필수일 정도로 중요도가 높습니다.

이를 프로그래밍 도구를 만들면서 전체 구조를 파악하며 공부하는 글을 적어보려고 합니다.

프로그래밍 분석에 사용될 언어는 perl 이며 Windows Forensic Analysis의 regpl.pl 을 참고하여 설명드리겠습니다.


보안 공부를 할때 기본적으로 배우는 개념 중 PE 구조 라는 것이 있습니다.

(PE구조란 윈도우 운영체제에서 지원되는 실행 파일의 형식을 뜻하며 실행을 할 수 있는 구조를 가진 파일입니다. )


이런 PE구조를 분석 및 공부를 하려면 

PE구조에 관련된 서적을 열심히 읽어야 하는데

책을 아무리 읽어도 16진수가 난무하는 알 수 없는 값들 때문에

눈꺼플이 무거워지고 꾸벅꾸벅 잠만 쏟아집니다 ^^;;


PE구조 같은 파일구조를 공부하기에 좋은 방법을 소개하자면

첫 번째로는 샘플 파일을 Hex Editor를 통해 직접 값들을 확인하며 공부하는 방법.

두 번째로는 파일에 관련된 도구를 직접 사용해서 내부 구조를 확인하는 방법

세 번째로는 프로그래밍으로 직접 파일구조 분석 도구를 만들어 보는 방법입니다.


Hex Editor 나 도구를 이용해서 구조를 확인하고 넘어가도 상관이 없지만 

도구를 직접 만들어 본다는 것만으로 설레이지 않나요?? ㅎㅎ


좋은 점에 대해서 부연 설명을 드리자면...

1. 분석도구를 만드려면 파일 구조가 온전한지 값이 잘 출력되는지 

    테스트를 하며 만들어야 하기 때문에 자연스럽게  파일구조가 머릿속에서 그려집니다.


2. 책에서 봤던 혹은 알고있는 내용과는 다르게 다양한 변수들이 많이 생기는데

   이런 변수들을 하나하나 해결할 수록 단단한 내공이 쌓여지게 됩니다.


3. 파일의 구조를 생성하는 것에 대한 알고리즘을 알게되어 다른 형식의 파일을 접하더라도

   쉽게 이해할 수 있는 지식도 생기게 되죠!!


도구로 만들고 싶다는 생각이 불쑥불쑥 솟아 나시죠??!!


레지스트리 Hive 파일 분석기를 잘 만들어 두면 레지스트리 값들을 모두 

얻을 수도 있고, 지워진 레지스트리 값도 복구가 가능하기 때문에

많은 분야로 확장 가능할 것이라 생각됩니다.


강좌는 아래와 같이 2가지로 나누어서 진행하려고 합니다.

1. perl을 이용하여 내부 값들을 알아보며 각각의 키와 값들을 뽑아내어 보는 파트 


2. C#을 이용하여 UI를 꾸며 분석도구를 만들어가는 파트


두 파트 모두 도구는 만들어져 있으니 어떻게 설명하느냐가 

중요할 것 같습니다.. 부담이 되네요 ㅡ_ㅠ

모르는 부분도 많으니 피드백 주시면 감사하겠습니다 ^^/


준비물

1. Perl 설치 ( 링크를 참고 하시면 됩니다 ^^ 이럴때 카페 홍보!! )

2. Registry Hive File 문서 ( 문제가 될 시 삭제 하겠습니다.)

The WindowsNT Registry File Format.pdf

FORENSIC ANALYSIS OF UNALLOCATED SPACE.pdf

3. Windows Forensic Analysis의 perl 소스코드

4. Hex Editor - ICY Hexplorer ( 제가 좋아하는 Hex Editor 입니다 )

hex_setup216.exe

5. 끝없는 열정!


신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 0 Comment 3
2009.12.08 06:31

FunnyPE

 
작년 10월 말 부터 12월 초까지 약 한달 반정도 걸린

개인적인 프로젝트입니다.

즐겁게 PE 파일구조를 를 보자 라는 의미에서 만든 Funny PE 입니다 ^^;




¨ 운영체제 : Windows XP Professional

¨ 개발도구 : Microsoft Visual Studio 2008

¨ 개발언어 : Visual C# 2008

¨     : GDI+


일반적으로 EXE 파일을 분석할 때, DLL 의 정보를 분석할 때
 
혹은 바이러스를 분석 해야 할 때 PE 구조에 따라 파일을 분석해야 합니다
 
이런 실행할 수 있는 파일의 구조는 분석하기가 까다롭고, 보기에도 난해함으로 쉽고 단순하면서,

즐겁게 분석을 하기 위한 프로그램을 구현하기 위해서 이러한 프로그램을 작성하였으며,

한 눈에 PE의 모든 구조를 볼 수 있는 Simple Map GDI+로 구현하여

PE File 의 전체 구조를 파악 할 수 있도록 하였습니다.





 본 프로그램은 윈도우의 실행 파일 Format PE(Portable Excutable) File Format 을 분석해주는 도구입니다.

PE File
을 메모리에 올려놓은 뒤, 각각의 클래스를 생성하여 그 정보들을 TreeView를 통해 사용자가

보기 편하도록 구현해 놓았으며, TreeView의 각 세부적인 부분들을 16진수 및 아스키문자로

확인할 수 있도록 구현하였습니다.



 각 Header에 관한 핵심적인 정보출력 및 실행파일 내에 위치하는 Section 의 가상 주소 및 실제주소,

그리고 Section의 속성을 조사하여, 실행파일이 패킹이 되어있는지에 대한 여부를 판단하였습니다.


 PE
구조에서 dll 의 정보를 확인 가능하며 실제 메모리에 Load되는 위치를 확인 할 수 있으며,

dll
에서 사용되는 함수들의 이름까지 확인 가능합니다.

 재배치 섹션도 구현하여, Load되는 메모리가 겹쳐질 때, 어떤 방식으로 재배치가 이루어 지는지

확인 할 수 있으며, Resource 정보를 통해 아이콘, 메뉴, 다이얼로그 등등 Resource의 정보들이 확인 가능합니다.

 실행파일이 패킹이 되어 있는지에 대한 여부에 따라 기존의 OP Code Disassembly가 가능하도록 구현하여,

어셈블리로는 어떤 식으로 코드가 풀어졌는지 확인 할 수 있습니다.

마지막으로 프로그램의 핵심적인 부분으로써 한눈에 PE 구조를 확인할 수 있도록

분석한 파일에 맞춰 전체 구조를 그려주는 PE Viewer 도 구현하였습니다.





시스템적인 구조 적인 부분은 그냥 넘기도록 하고,

프로그램 실행부분을 설명드리겠습니다.



PE File format 파일을 분석하기 위해는 일단 파일을 불러와야 합니다.

파일을 불러오는 방식은 2가지입니다.

첫 번째 방법으로는 폴더이미지를 클릭을 하면 파일열기 대화상자를 이용하여 

PE
구조를 가진 파일들을 불러올 수 있으며,

두 번째로는 Drag & Drop 을 이용하여 파일을 프로그램으로 끌어오는 방법이 있습니다.

위 그림은 폴더 이미지를 눌렀을 때의 그림이며,

파일을 선택했을 시에 그 파일에 대하여 분석이 시작됩니다.

이 과정에서 PE 구조가 아닌 파일을 불러 들었을 시에는 PE 구조가 아니라는 경고 창이 뜨며,

PE
구조를 분석하지 않으며, PE 구조일 시에는 각각의 구조체에 따라 분석이 되며,

File Info Tab
ListView 창에는 C#에서 제공하는 파일 클래스를 사용하여,

파일의 속성, 이름, 사이즈, 생성 시간, 마지막 접근시간 등을 출력했습니다.




PE 구조를 가진 파일의 로드가 끝났을 때,

두 번째 Tab PE Analysis 에는 PE의 전체구조를 Treeview로 출력해서 보여주며,

각각의 Header 값들을 클릭했을 시에는 아래에 ListView에는 주소값과,

16
진수 값 그리고 ASCII 코드로 출력이 되게 됩니다.


Tab
에 오른쪽에 있는 값들은 분석에 있어서 중요한 정보들을 저장시켜 놓았으며,

주로 디버깅을 대신하여 변수의 값들을 Check 할 때 효과적으로 사용하였습니다.


아래쪽에 있는 메모리 출력 Viewer 에서 Offset 의 범위를 지정하여
 
탐색 아이콘을 누르면 지정한 주소의 범위까지 메모리의 값들을 확인할 수 있습니다.




Tab
2,3번째인 Headers Section PE 구조를 토대로 중요정보들을 출력해주는 부분입니다.

코드의 처음 실행부분인 Entrypoint 나 메모리에 처음 올라오는 값인 ImageBase

그리고 Image Size , PE 구조에서 중요한 정보들을 확인하기 쉽도록

하나의 Tab으로 만들어 놓았습니다.

그리고 DATA DIRECTORY에서도 중요한 6가지 정도의 값들의 주소와 Size를 보여줍니다.



Sections Tab 에서는 Section이 있는지 나열해 주며, Section 들의 이름,

가상주소 및 실제주소, 그리고 Size와 속성들까지 출력해줍니다.

Section
을 클릭했을 경우 Flag 값을 체크하여 아래에

Check Box
에서 해당되는 값들의 결과값을 알려줍니다.



Section
들의 주소가 같은지 다른지 보여주는 distinction 부분도 함께 구현했으며,

다를 경우에는 어느 정도의 주소의 차이가 나는지도 나타나게 됩니다.






5
번째 Tab Import & Export 에서는 해당 파일이 어떠한 DLL Import 하고 있으며

어떠한 함수들을 사용하고 있는지 나열 해주는 부분으로써

TreeView
를 사용하여 각 DLL 에 따른 함수

그리고 그 함수가 가지고 있는 주소까지 확인이 가능합니다.

Export
도 마찬가지로 구조에 따라 Export 하는 값들을 확인 할 수 있습니다.


6
번째 TabRelocation 은 주로 DLL 파일이 재배치가 이루어져야 함으로

주로 DLL 파일에서 확인을 할 수 있습니다.

system Architecture
에서 설명된 Relocation에 구조체에 따라

재배치를 수행하는 값에 대해서 TreeView로 확인할 수 있습니다.


이 두 Tab에 관련된 값들을 구하는 방법은 파일을 분석할 당시

각각의 클래스를 모두 작성했기 때문에 쉽게 UI 부분을 완성할 수 있었습니다.







7
번째 Tab Resource 를 표현하는 방법에는 많은 고민을 하였는데

IMAGE_RESOURCE_DIRECT
ORY 에서 DIRECTORY ENTRY 를 접근할 수 있으므로,

3
개의 TreeView 를 사용하여, Resource 를 표현하였고, 첫 번째 TreeView 에서

IMAGE_RESOURCE_DIRECTORY
값을 클릭했을 경우에는

두 번째 TreeView 에서
리소스 타입 디렉터리 정보들을 확인 할 수 있도록 하였습니다.


링크를 따라가듯이 다음 값으로 접근할 때 마다 새로운 TreeView 가 그려지며,

마지막 값까지 접근했을 시에는 해당 리소스의 이름과 데이터 엔트리 값을 확인 할 수 있으며,

이 값에 따라 실제 리소스 데이터 값으로도 접근이 가능합니다.


Disassem Tab
은 코드의 Entry Point 값과 그 값에 해당되는 Section 을 파악하여

OP
코드를 코드의 Size 만큼 Disassembly 하여 ListView 에 출력하는 부분입니다.

EntryPoint
Section 의 속성을 파악하여 그 속성의 값에 따라

파일이 Packing 되었는지 되지 않았는지도 Check 할 수 있습니다.



Packing 이 되지 않았을 때만 Disassembly 를 수행하며, Disassembly 를 하게 되면 주소값과,

OP
코드 그리고 Assembly 를 나열하여 ListView에 뿌려줍니다. 

Disassembly Code
가 길어질 경우를 대비하여 progressbar 를 연동하여 진행상황을 알 수 있습니다.






Data Abstraction Tab
에서는 이제껏 분석한 정보들을 통해 전체적인 PE File의 구조를 그려줍니다.

GDI+
를 사용하여 전체 값들을 출력하였으며,

각각의 구조체에 맞춰서 Header를 그려줬으며, Header의 좌표가 저장되어 있어

그 좌표에 따라 화살표를 그려주는 모듈도 만들어 사용자가 보기 좋도록 출력하는데 노력을 들였습니다.

키보드의 화살표에 따라 투명도 조절이 가능하며,

마우스 휠을 사용하여 이미지의 ZOOM 을 조절하는 기능도 있습니다.

그리고 마우스 클릭을 이용하여 좌표이동이 가능합니다.


왼쪽에 툴바를 삽입하여 Pen 으로 그릴 수 있는 모드와

Move
하는 모드 2가지를 선택할 수 있도록 하였으며,

이미지 파일로 저장도 가능합니다.

모든 기능 중에 가장 신경을 많이 쓴 부분이며,

효율적으로 각각의 PE 구조를 볼 수 있도록 많은 부분을 생각하여 작성하였습니다.




위 그림은 프로그램의 순서도이며, 어떤 방식으로 프로그램의 PE 구조를 분석하는지 보여줍니다.

파일을 불러온 뒤 PE 구조와 관련된 Header 파일들을 분석한 뒤,

그 결과값에 따라 PE 파일인지 Check 한 뒤 계속적으로 분석을 할 것인지의 여부를 판단합니다.

PE
파일일 경우에만 순차적으로 분석을 하며 아닐 경우에는 분석하지 않습니다.

Disassembly
같은 경우에는 Packing의 유무에 따라 Disassembly 코드를 변환을 결정 짓습니다.



=======================================================================================

어디까지나 개인적으로 만든 프로젝트라

코드를 공개하기가 꺼려집니다.

가독성 문제도 있고 너무나 제식대로만 코드를 짜서 ^^;;


프로그램은 원하는 분들에게만 배포할 생각이며,

PE에 관심있으신 분들은 저에게 문의 주시기 바랍니다.




감사합니다 :)

=======================================================================================

프로그램 실행파일


잔버그가 많네요 ㅠ_ㅠ

추후에 기회가 된다면 유지보수하겠습니다 :)

신고
크리에이티브 커먼즈 라이선스
Creative Commons License
Trackback 3 Comment 4


티스토리 툴바