'Header 가지고 놀기'에 해당되는 글 4건

  1. 2011.03.11 winDBG로 Process 리스트 및 Process 검증하기
  2. 2011.02.10 PE구조 알아보자
  3. 2010.01.08 Prefetch Header 분석 4
  4. 2009.09.02 Thumbs.db을 통한 사진파일 복구 3

모든 테스트는 Windows xp service pack 3에서 수행되었습니다.

- winDBG download
http://msdn.microsoft.com/en-us/windows/hardware/gg463009

- winDBG symbol download
http://msdn.microsoft.com/en-us/windows/hardware/gg463028


-LiveKD download
http://technet.microsoft.com/en-us/sysinternals/bb897415

위 URL에서 테스트시 사용할 파일을 다운로드 한 후 설치하였습니다.

winDBG는 기본설정으로 설치하였으며, symbol은 c:\symbols에 설치하였습니다.


1. LiveKD
설치 후 winDBG로 커널 접근을 쉽게 도와주는 LiveKD를  사용하였습니다.

-w 옵션을 사용하여, LiveKD를 사용함과 동시에 winDBG를 사용하였습니다.

사용자 삽입 이미지








2. PROCESS 내역 보기

!process 0 0 을 사용하여 현재 동작하고 있는 프로세스 내역을 확인해 봅니다.

0: kd> !process 0 0
**** NT ACTIVE PROCESS DUMP ****
PROCESS 825b7830  SessionId: none  Cid: 0004    Peb: 00000000  ParentCid: 0000
    DirBase: 02b40020  ObjectTable: e1002e40  HandleCount: 264.
    Image: System

PROCESS 82429948  SessionId: none  Cid: 0220    Peb: 7ffd8000  ParentCid: 0004
    DirBase: 02b40040  ObjectTable: e14558d8  HandleCount:  19.
    Image: smss.exe

PROCESS 82446da0  SessionId: 0  Cid: 0260    Peb: 7ffd7000  ParentCid: 0220
    DirBase: 02b40060  ObjectTable: e15e3858  HandleCount: 378.
    Image: csrss.exe

PROCESS 82344020  SessionId: 0  Cid: 0278    Peb: 7ffd8000  ParentCid: 0220
    DirBase: 02b40080  ObjectTable: e14f2590  HandleCount: 460.
    Image: winlogon.exe

PROCESS 8242f6e8  SessionId: 0  Cid: 02a4    Peb: 7ffdb000  ParentCid: 0278
    DirBase: 02b400a0  ObjectTable: e17ac350  HandleCount: 261.
    Image: services.exe

PROCESS 82449b88  SessionId: 0  Cid: 02b0    Peb: 7ffd7000  ParentCid: 0278
    DirBase: 02b400c0  ObjectTable: e17a6dd0  HandleCount: 349.
    Image: lsass.exe



3. 프로세스 링크 따라가기

작업관리자 -> 프로세스에서 확인되는 프로세스를 winDBG로 따라 들어 가보겠습니다.

0: kd> dt _EPROCESS 8238ea00
   +0x174 ImageFileName    : [16]  "cmd.exe"

   +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x821dc0a8 - 0x81f03658 ]


0: kd> dd 8238ea00+0x088
8238ea88  821dc0a8 81f03658
                  FLINK       BLINK


0: kd> dt _EPROCESS 81f03658-0x88
   +0x174 ImageFileName    : [16]  "AYServiceNT.aye"

   +0x088 ActiveProcessLinks : _LIST_ENTRY [ 0x8238ea88 - 0x82366280 ]



4. 프로세스 특징

윈도우는 Memory Pool에 8바이트 단위로 메모리를 할당합니다. Memory Pool에는 Ethread와 Eprocess와 같은 커널 오브젝트가 존재합니다.


- Pool_Header
메모리 풀에 할당된 메모리 블록은 관리를 위한 자료구조인 Pool_Header를 포함합니다.


- windbg에서
dt _POOL_HEADER 를 확인하면 0x004 offset에 PoolTag가 있습니다.


4-1. _POOL_HEADER에서 확인된 주소가 process와 thread를 담고있으면 0xe36f7250, 0xe5726854값을 가지게 됩니다.


PROCESS 82283370  SessionId: 0  Cid: 0574    Peb: 7ffde000  ParentCid: 0638
    DirBase: 02b403a0  ObjectTable: e1624420  HandleCount:  56.
    Image: notepad.exe


0: kd> dt _POOL_HEADER 82283370-0x18-0x8
nt!_POOL_HEADER
   +0x000 PreviousSize     : 0y000000001 (0x1)
   +0x000 PoolIndex        : 0y0000000 (0)
   +0x002 BlockSize        : 0y001010000 (0x50)
   +0x002 PoolType         : 0y0000101 (0x5)
   +0x000 Ulong1           : 0xa500001
   +0x004 ProcessBilled    : 0xe36f7250 _EPROCESS
   +0x004 PoolTag          : 0xe36f7250
   +0x004 AllocatorBackTraceIndex : 0x7250
   +0x006 PoolTagHash      : 0xe36f


4-2. Object_Header
Object_HEADER는 Type필드를 가지고 있으면 오브젝트에 대한 일반적인 속성을 담고 있습니다. 해당 값이 프로세스일 경우 PsProcessType과 같거나 0xbad040값을 갖습니다.

PROCESS 82283370  SessionId: 0  Cid: 0574    Peb: 7ffde000  ParentCid: 0638
    DirBase: 02b403a0  ObjectTable: e1624420  HandleCount:  56.
    Image: notepad.exe

0: kd> !object 82283370
Object: 82283370  Type: (825b7e70) Process
    ObjectHeader: 82283358 (old version)
    HandleCount: 2  PointerCount: 17

0: kd> dd PsProcessType L1
805659b8  825b7e70



4-3. DISPATCHER_HEADER
Eprocess구조체 가장 앞부분에 존재하는 DISPATCHER_HEADER의 type과 size를 확인해보면, 프로세스의 경우 type은 0x3 size는 0x1b라는 것을 알 수 있습니다.


PROCESS 82283370  SessionId: 0  Cid: 0574    Peb: 7ffde000  ParentCid: 0638
    DirBase: 02b403a0  ObjectTable: e1624420  HandleCount:  56.
    Image: notepad.exe


0: kd> dt _DISPATCHER_HEADER 82283370
ntdll!_DISPATCHER_HEADER
   +0x000 Type             : 0x3 ''
   +0x001 Absolute         : 0 ''
   +0x002 Size             : 0x1b ''
   +0x003 Inserted         : 0 ''
   +0x004 SignalState      : 0
   +0x008 WaitListHead     : _LIST_ENTRY [ 0x82283378 - 0x82283378 ]



'Header 가지고 놀기' 카테고리의 다른 글

PE구조 알아보자  (0) 2011.02.10
Prefetch Header 분석  (4) 2010.01.08
Thumbs.db을 통한 사진파일 복구  (3) 2009.09.02
Posted by 도시형닌자
:
예전에 두목님한테 가르침을 전수받은 그대로를 다시 재구성해 보았다.

좋다! 그럼 PE를 알아보자!

역시 귀찮아서 Onenote 내용을 evernote에 붙여서 그림으로 만든 후 가져다 붙였다.


사용자 삽입 이미지
Posted by 도시형닌자
:

일전에 악성코드 분석하다가 Prefetch(이하 한글로 쓰죠~)에 대해서 완전 잘못알고 있다가 낭패를 본 경험이 있습니다

프리패치란 윈도우 부팅될때 윈도우가 사용할 파일들을 메모리에 올리는 것이고, 많은 윈도우 부팅시 지렁이(?) 지나갈 때 느리게 하는거군 이라고만 생각하고 있다가, 악성코드 리버싱 하는 도중에 Filemon 띄어놓고 있다가 pf파일을 만들길래 헉! pf만들어서 윈도우 부팅될때마다 실행되게 하려는구나! 라고 어처구니 없는 생각에 엄청난 삽질을 거듭했죠..;;

결론적으로 뭐 틀린말은 아니지만 위의 문단에서 가장 틀린 부분은 pf를 만든다고 윈도우 부팅될때마다 실행되는건 아니라는 것이지요. 프리패치는 사용자가 윈도우 사용중 어떤 특정 파일을 실행시킬때도 생성하게됩니다-제가 잘못 알고 있던 부분이죠-프리패치 이것도 구조가 꽤 복잡하고 뭐 그렇습니다.

먼저 prefetching이란 windows xp 이후부터 나오는 기술로 어원그대로 '先꺼내기(?)'정도로 해석할 수 있겠습니다.
 (비스타부터는 슈퍼패치라는 기술로 바뀌었어요~)
이때 Prefetching때 사용하는 파일이 프리패치파일이라고 하죠

1. Prefetching이란 Application들의 성능 향상을 위해서 구동에 필요한 데이터들을 메모리에 먼저 올려놓게 하는 것
2. Prefetch란 Prefetching시 사용하는 파일로 메모리에 올려놓으려는 정보를 담고 있는 파일을 말합니다

사용자 삽입 이미지

풀어서 설명하자면 하드디스크를 엑세스 하는 시간이 길어지면 길어질수록 '느리다'라고 할 수 있으니 그러한 작업을 최소화 하고자 데이터를 미리 메모리에 올리는 기술이라고 할 수 있습니다.
그림 아래로 내려갈수록 엑세스 속도가 느려지는 것을 확인할 수 있죠

(아.. 이 그림이 요기잉네? //컴퓨터 개론,구조,운영체제등등 다 포함되는 또 이 그림이야! 라고 하실만 하실테지만서도 이해를 돕고자..)





그렇다면 네이버 지식인님에서 자주 올라오는 "윈도우 부팅속도가 느린데 어떻게 해야하죠" 라는 답변에 "프리패치를 지우세요" 라고 답변 달아주시는 분들은 어떤생각 일까요?

물론, 윈도우는 한번이라도 실행했다면 해당 파일에 pf를 만듭니다. c:\windows\prefetch\에 들어가보시면 알겠지만, 윈도우 업데이트 받았던 것, 이런 파일도 내가 실행시켰던가? 라는 생각이 들 정도로 많은 파일들이 존재하죠

사용자 삽입 이미지

따라서, 프리패치를 지워주는 것이 어떻게 생각하면 좋을 수도 있겠죠;
위의 그림에서 보시면 알겠지만 프리패치 파일은 application_name-hash.pf 형태로 이루어져 있습니다.
(hash에 관한 정보는 다음에 올리겠습니다)

여하튼 프리패치 파일은 사용자의 삭제가 있기전까지는 절대로 지우지지 않습니다. 따라서 침해대응이나 포렌식 관련하여 중요한 정보가 된다고 합니다. 한가지 예로 침해사고가 발생시 해당 시간의 MAC 타임으로 파일들을 검색하였을 경우에 만들어진 프리패치가 있다면, 원본파일이 지워졌어도 공격자가 이런 것을 실행했었구나 얼추 계산할 수 있죠.


포스팅 내용은 이게 아니었는데 사설이 길었군요
그렇다면 본격적으로 프리패치 파일에 어떤 내용이 담겨있나 확인해보겠습니다
(사용된 이미지는 Windows XP SP2, 사용 프리패치는 노트패드로 하였습니다.)

먼저 Winhex로 해당 프리패치 파일을 오픈하였습니다.
1) 0x00 -> prefetch signature

사용자 삽입 이미지
위의 Drag된 8바이트 부분이 프리패치의 header signature 입니다. 시그니처이기 때문에 바뀔일이 없겠죠?


2) 0x58 -> 해당 파일을 실행하기 위해서 메모리에 올라와야할 파일들의 수
(바인딩 될 DLL도 있고 부수적으로 실행되야하는 exe파일, nls, ime, sdb등등)의 개수를 나타냅니다.
사용자 삽입 이미지
위의 값인 0x25 / 십진수로 바꾸면 총 36개의 파일들이 notepad 실행될 때 사용되네요


3) 0x64 -> 메모리에 올려야할 파일들의 목록이 있는 곳의 offset 값
사용자 삽입 이미지

Endian방식에 따라 00 00 29 38 offset 값으로 이동해보죠
사용자 삽입 이미지
어떤 파일들이 메모리에 올라와야 할지 확인할 수있습니다


4) 0x68 -> 메모리에 올라와야 할 파일들의 총 길이
사용자 삽입 이미지

뭐.. 예상하셨겠지만, OS에게 어디까지가 메모리에 올려야 할 부분이야 라고 알려줘야겠죠?
위의 Drag된 부분이 그 값이지요. 0x64 번지의 offset값이 가르치는 부분에서 떨어진 만큼의 값이니 이동해봅시다
(00 00 29 38 + 00 00 0F FA 부분으로 가시거나 00 00 29 38에서 go to offset 하셔서 current position으로 이동하셔도 되겠죠)
여하튼 00 00 39 32 로 이동하게 되는데 다음 그림처럼 끝 부분인 것을 확인할 수 있습니다.
사용자 삽입 이미지


5) 0x6C -> Volume Infomation Block
사용자 삽입 이미지

해당 부분은 사용되는 컴퓨터의 디스크 정보 부분입니다. 우선 이동해보죠
사용자 삽입 이미지

첫부분의 4Byte 00 00 00 28은 Volume Infomation Block의 offset값을 나타냅니다 0x28 을 십진수로 바꾸면 40이니
Drag된 부분이 Volume Infomation Block이네요.
해당 부분은 정리가 아직 덜 끝나서 몇일 후에 다시 포스팅 하기로 하고 한가지 부분만 살펴보고 넘어가겠습니다.
Volume Infomation Block부분만 따로 떼어서 0x08부분을 확인해보죠
사용자 삽입 이미지

결론부터 말씀드리면 위의 Drag한 8Byte 부분이 Volume 최초 생성 시간이 되겠습니다.
사용자 삽입 이미지
이 밖에도 Volume Serial Number, 폴더 경로의 offset, 폴더 경로의 수등 다양합니다. 해당 정보는 정리되는데로 포스팅 하겠습니다.


6) 0x78 -> 마지막 실행 시간
사용자 삽입 이미지
해당 8byte 부분이 XXX-hash.pf 의 XXX가 마지막으로 실행된 시간입니다.
마찬가지로 decode date로 돌려보면
사용자 삽입 이미지
위와 같은 시간을 얻을 수 있습니다.


7) 0x90 -> 실행 회수
사용자 삽입 이미지
vmware로 스냅샷 돌리면서 사용하니까 notepad를 4번밖에 사용안했네요 ㅎㅎ
이 걸로 내가 wow를 몇번이나 접속 했는지를 알아낼 수 있는!!!!....쿨럭(물론 더 좋은 방법도 많습니다)


물론 공부할때는 수동으로 이렇게 하나하나 보는 것이 더 도움이 되긴합니다만,
바쁜데 이렇게 사용할 수도 없는 노릇이고
그래서 역시나 이런 것을 자동으로 보여줄 수 있는 툴이 있죠

소개해 드릴 툴은 "WinPrefetchView"라는 툴입니다
사용자 삽입 이미지
해당 툴은 자동으로 c:\windows\prefetch 부분에 있는 pf파일을 읽어옵니다(다른곳에 있는 pf는 못읽어요)
위의 그림에서 1번 부분이 프리패치 파일 목록이며
2번 부분이 해당 프리패치에 기록된 선택된 application이 실행될 때 메모리에 올려진 부분이며
3번은 프리패치 파일 선택 후 우 클릭 Properties를 선택했을 때 나타나는 부분입니다.


참~! 그래도 프리패치를 사용하고 싶지않다 하시는 분들은
KEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management\PrefetchParameters EnablePrefetcher 값을
0으로 설정해주시면 됩니다.
0 : 사용안함
1 : Application 만 사용
2 : Boot 할 때 사용되는 것만 사용
3 : 그냥 둘 다 사용 <-- 이게 디폴트 설정값이죠


프리패치때문에 삽질했던 기억 때문에 포스팅해봤는데
다른분들한테 도움이 되었으면 좋겠네요 ㅎㅎ

Posted by 궁상박군
:
얼마전에 다녀온 휴가때 찍은 사진을 친구로부터 받은 적이 있습니다.
기억으로는 굉장히 많이 찍었던 것 같은데, 받은 사진을 보니 몇장이 비는 것 같아서
"우리 어디서 찍지 않았던가"라고 되물으니
"몰라 사진없어" 라고 대답하더군요
다행히 친구가 보내준 파일의 압축을 풀어보니 Thumbs.db라는 파일이 있어서 Thumbs.db로 사진을
복구시켜 이건 왜 안줬어라고 협박(?)해 원본을 다시 받아낼 수 있었습니다.

가끔 사진을 모아놓거나 드라마나 영화등 동영상을 모아놓는 폴더를 열어보면 다음과 같이 Thumbs.db 라는 파일을 종종 보실 수 있습니다. (물론, 폴더옵션에서 숨겨진 파일 보기에 체크를 하셔야 보이지만요)

또한 p2p에서도 Thumbs.db라는 파일명으로 검색하면 굉장히 많은 파일을 확인하실 수 있습니다

그렇다면 Thumbs.db에는 어떤 내용이 있을까요
윈도우 폴더에서 미리보기를 사용하는 경우 해당 파일에 대한 미리보기정보를 Thumbs.db에 담습니다.
(흔히들 thumbnail-엄지손톱- 이렇게 얘기하시는데 엄지손톱만하게 보여주기 때문에 이렇다면
thumb는 엄지이기때문에 조금 큰것일까요? 쿨럭;;
여튼 thumbnail이란 보려고 하는 이미지가 용량이 크거나, grid형태로 보여주기 위해 조그만 이미지로 보여줄 때 사용하는 것을 말합니다)

또한, 그림파일(jpg, bmp, gif)이나, 동영상등 형식에 상관없이 미리보기로 보여질 이미지들은 모두 jpg의 해더형식으로 thumbs.db에 저장이 됩니다.
(참고 : jpg의 file header(시작점)의 시그니처는 FF D8 이며, footer(끝점)는 FF D9 입니다.)

Thumbs.db에 모든 미리보기 파일이 JPG형식으로 저장되며, JPG의 시작점과 끝점의 시그니처도 알았으니
winhex로 해당 파일을 열어서 복구를 시켜보도록 하겠습니다.

1). Find Hex Values로 FFD8을 찾습니다.

2) 우선 Beginning of block으로 체크 후 FFD9를 찾습니다.

3) 찾은 부분에 End of block으로 체크 후 선택된 영역(FF D8 ~~ FF D9까지) 통채로 새파일 만들기로 집어넣습니다.

4) 새로운 파일을 만들었으면 파일명.jpg로 저장합니다.


5) 이제 확인해볼까요?

p2p에서 아무파일이나 다운받은거라 혹시나 걱정(?)을 했는데 다행히도 가족 비디오 같은 장면이 나왔네요

하지만 여기서 의문이 드는것은 제가 처음에 사진을 받았을 때 몇장이 없어서 Thumbs.db를 확인하여 파일을 복구하였다고 했는데, 사진파일이 한두장도 아니고 이처럼 수동으로 다 했을까요?
물론, 자동화 툴이 있죠 "Thumbnail Database Viewer"이라는 툴입니다.


위와 같이 폴더를 선택하였을 때 폴더안에 Thumbs.db파일이 존재할 경우 목록이 보여지며, Thumbs.db파일을 선택하면 미리보기로 저장된 화면들이 보여지게 됩니다.

Thumbs.db파일의 역활을 아시는분들은 이미 지웠겠지만, 이 글을 통해서 아시는 분들은 이제 지우도록 해야겠죠?
파일탐색기에서 검색해서 지우는 방법도 있지만 Thumbs Cleaner를 이용하셔도 됩니다
(포스팅하면서 확인해보니 Thumbs Cleaner은 Thumbs.db라는 파일명만 찾는군요;;이름이 바뀌거나 다른파일을 Thumbs.db로 만들어 놓으면 잘못된 결과를 보여줍니다)

또한, 지우셨으면 이제부터 안만들어지도록 해야겠죠?
윈도우탐색기 -> 폴더 -> 도구옵션 -> 보기에서 미리 보기 캐시 안 함을 체크해주시고 모든 폴더에 적용을 눌러주시면 이제 앞으로 만들어지지 않습니다.

다른 방법으로는 시작 -> 실행 -> gpedit.msc 를 입력하여 그룹 정책을 띄우시고
사용자 구성 -> 관리 템플릿 -> Windows 구성 요소 -> Windows 탐색기를 선택 후
다음과 같이 "축소판 그림 캐싱 사용 안 함"를 선택합니다.

다음과 같은 화면에서 축소판 그림 캐싱 사용 안 함을 '사용'으로 바꿔 주고 확인을 눌러줍니다.

이제 파일을 미리보기 하셔도 Thumbs.db파일은 생성되지 않을 것입니다.


블로그 첫 글이 약간 허접하네요 -ㅅ-; 다음에는 조금 색다른 아이디어로 포스팅 하겠습니다

'Header 가지고 놀기' 카테고리의 다른 글

winDBG로 Process 리스트 및 Process 검증하기  (0) 2011.03.11
PE구조 알아보자  (0) 2011.02.10
Prefetch Header 분석  (4) 2010.01.08
Posted by 궁상박군
: