반응형

오랜만에 글을 올리는 것 같네요.

그 동안 잘 지내셨습니까?

이 글을 어느 분들이 보실지 모르겠지만 저에게 영감을 주신 달토끼님에게 감사 드립니다.

(달토끼님이 잘 정리하신 걸 제 나름대로 정리 해 보았습니다. 그래야지 내꺼가 되니까^^)

http://kuaaan.tistory.com/102

 

우선, 이 글은 개발에 필요한 디버깅 기술이 아닌 분석자의 입장에서 분석을 할 때 유용할 정보를 언급하는데 초점을 맞췄습니다. 따라서 "왜 Map, Cod 파일을 생성하면 되는데 이렇게 할까?" 라고 생각이 들겠지만 보안팀에서는 회사의 소스에 대한 접근 권한이 없는 경우가 많으므로 그럴 때 분석을 효과적으로 하기 위해서 필요한 내용을 정리하는 것이니 이점을 감안하여 보시길 바랍니다.

 

제 블로그를 보시면 아시겠지만 반어로 작성하니 이점 참고 하시길 바랍니다.

무례하다면 먼저 사과 드립니다.

////////////////////////////////////////////////////////////

 

1. Cod 파일이란? Map 파일이란?

 

분 류 

설명 

 Map

 Map 파일은 Visual Studio에서 제공하는 컴파일 시 Application에서 사용하는 전역변수, 함수의 위치를 기록한 파일이다. 해당은 Symbol파일이 없을 경우 함수의 주소와 특정 함수를 알고 싶을 때 사용한다.
(※ pdb 파일이 있다면 굳이 할 필요가...;;)

 Cod

 컴파일을 하면서 C 코드가 어떻게 Assemble로 변환되어 지는지를 확인할 수 있는 파일이다. 해당 파일은 디스어셈블러의 분석하는데 있어서 사전 공부하는 중요한 지표가 될 수 있다.

 

Cod 파일은 확실하게 분석하는 입장에서는 반드시 확인하고 봐야하는 내용중에 하나 이다.

Map의 경우는 pdb와 연결되면 유용하지만 없을 경우에는 Map 파일이 있다면 해석하기 좋을 것이다.

 

2. Cod 파일 / Map 파일 생성 방법

  1) Cod 파일 생성 방법

     Cod 파일은 어셈을 공부하는 학생 및 어셈에 대해서 더 알고 싶은 사람이라면 꼭 봐야하는 파일이므로 모든 코딩을 할 때

     해당 파일을 생성하여 분석하는 것을 추천한다.

 

 

  2) Map 파일 생성 방법

     Map 파일은 PDB 파일은 전달 해주지 못할 경우 요청할 수 있는 파일이다.

 

 

3. 생성된 Cod / Map 파일

 

  1) Cod 파일

 

 ; Listing generated by Microsoft (R) Optimizing Compiler Version 14.00.50727.762

 TITLE [CPP 경로 ; c:\temp\test.cpp]
 .686P
 .XMM
 include listing.inc
 .model flat

INCLUDELIB MSVCRTD
INCLUDELIB OLDNAMES

PUBLIC ?TestFunction@@YAPAU_IMAGE_IMPORT_DESCRIPTOR@@PAUHINSTANCE__@@@Z ; TestFunction
EXTRN __RTC_Shutdown:PROC
EXTRN __RTC_InitBase:PROC
; COMDAT rtc$TMZ
; File c:\temp\test.cpp
rtc$TMZ SEGMENT
__RTC_Shutdown.rtc$TMZ DD FLAT:__RTC_Shutdown
rtc$TMZ ENDS
; COMDAT rtc$IMZ
rtc$IMZ SEGMENT

__RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase
; Function compile flags: /Odtp /RTCsu /ZI
rtc$IMZ ENDS

; COMDAT ?GetImportTable@@YAPAU_IMAGE_IMPORT_DESCRIPTOR@@PAUHINSTANCE__@@@Z
_TEXT SEGMENT
_optionalHeader$ = -20     ; size = 4
_dosHeader$ = -8     ; size = 4
_module$ = 8      ; size = 4
?TestFunction@@YAPAU_IMAGE_IMPORT_DESCRIPTOR@@PAUHINSTANCE__@@@Z PROC ; TestFunction, COMDAT

; 8    : {      

  00000 55   push  ebp
  00001 8b ec   mov  ebp, esp
  00003 81 ec d8 00 00
 00   sub  esp, 216  ; 000000d8H
  00009 53   push  ebx
  0000a 56   push  esi
  0000b 57   push  edi
  0000c 8d bd 28 ff ff
 ff   lea  edi, DWORD PTR [ebp-216]
  00012 b9 36 00 00 00  mov  ecx, 54   ; 00000036H
  00017 b8 cc cc cc cc  mov  eax, -858993460  ; ccccccccH
  0001c f3 ab   rep stosd

.................

_TEXT ENDS
END

 

 

  2) Map 파일

 

Timestamp is 52ddfe3f (Tue Jan 21 13:57:35 2014)

 Preferred load address is 00400000

 Start         Length     Name                   Class
 0001:00000000 00010000H .textbss                DATA
 0002:00000000 0000366cH .text                   CODE
 0003:00000000 00000104H .CRT$XCA                DATA
 0003:00000104 00000104H .CRT$XCAA               DATA
 0003:00000208 00000104H .CRT$XCZ                DATA

 ..................................................................

  Address         Publics by Value              Rva+Base       Lib:Object
 ..................................................................

 0002:000005e6       _GetModuleHandleW@4        004115e6 f   kernel32:KERNEL32.dll
 0002:000005f0       __RTC_InitBase             004115f0 f   MSVCRTD:init.obj
 0002:00000630       __RTC_Shutdown             00411630 f   MSVCRTD:init.obj
 0002:00000648       _printf                    00411648 f   MSVCRTD:MSVCR80D.dll
 0002:00000650       __RTC_CheckEsp             00411650 f   MSVCRTD:stack.obj
 0002:00000680       @_RTC_CheckStackVars@8     00411680 f   MSVCRTD:stack.obj
 0002:00000700       @_RTC_AllocaHelper@12      00411700 f   MSVCRTD:stack.obj
 0002:00000740       @_RTC_CheckStackVars2@12   00411740 f   MSVCRTD:stack.obj
 0002:0000084a       _getchar                   0041184a f   MSVCRTD:MSVCR80D.dll
 0002:00000980       _mainCRTStartup            00411980 f   MSVCRTD:crtexe.obj
 0002:00000c80       _NtCurrentTeb              00411c80 f i MSVCRTD:crtexe.obj
 0002:00000d70       __RTC_NumErrors            00411d70 f   MSVCRTD:userapi.obj
 0002:00000d80       __RTC_GetErrDesc           00411d80 f   MSVCRTD:userapi.obj
 0002:00000da0       __RTC_SetErrorType         00411da0 f   MSVCRTD:userapi.obj
 0002:00000dd0       __RTC_SetErrorFunc         00411dd0 f   MSVCRTD:userapi.obj
 0002:00000e00       __RTC_SetErrorFuncW        00411e00 f   MSVCRTD:userapi.obj
 0002:00000e30       ?_RTC_GetErrorFunc@@YAP6AHHPBDH00ZZPBX@Z 00411e30 f   MSVCRTD:userapi.obj
 0002:00000e40       ?_RTC_GetErrorFuncW@@YAP6AHHPB_WH00ZZPBX@Z 00411e40 f   MSVCRTD:userapi.obj

 ..................................................................

 0005:000002ac       __imp____p__fmode          004182ac     MSVCRTD:MSVCR80D.dll
 0005:000002b0       __imp____p__commode        004182b0     MSVCRTD:MSVCR80D.dll
 0005:000002b4       __imp___adjust_fdiv        004182b4     MSVCRTD:MSVCR80D.dll
 0005:000002b8       __imp____setusermatherr    004182b8     MSVCRTD:MSVCR80D.dll
 0005:000002bc       __imp___configthreadlocale 004182bc     MSVCRTD:MSVCR80D.dll
 0005:000002c0       __imp___CRT_RTC_INITW      004182c0     MSVCRTD:MSVCR80D.dll
 0005:000002c4       __imp__getchar             004182c4     MSVCRTD:MSVCR80D.dll
 0005:000002c8       __imp__printf              004182c8     MSVCRTD:MSVCR80D.dll
 0005:000002cc       __imp___onexit             004182cc     MSVCRTD:MSVCR80D.dll
 0005:000002d0       \177MSVCR80D_NULL_THUNK_DATA 004182d0     MSVCRTD:MSVCR80D.dll

 entry point at        0002:00000118

 

4. Map 파일 활용

 

 

 

5. Cod 파일 활용

  Cod 파일을 열어 보면 이게 몬지 잘 모를 것이다. 그럴땐 우선 Notepad++ 나 소스 코드의 하일라이트를 제공하는 프로그램을 이용하여 분석하면 수월하게 진행 할 수 있을 것이다. (언어 -> A -> Assembly)

 

 

 

그리고 또 하나의 팁은 SEGMENT/ENDS, PROC/ENDP 단위로 보면 된다.

즉,

 

???? SEGMENT

@@@ PROC

~~~~~

@@@ ENDP

???? ENDS

 

////////////////////////////////////////////////////////

 

Map 파일은 알고 있었는데 Cod 파일에 대해서는 VS 에서 디버깅할 때 어셈도 같이 보는 방식 이였는데

이렇게 파일로 생성 할 수 있다니 즐거운 경험을 하였습니다.

다시 한번 이 글을 빌어 달토끼님(http://kuaaan.tistory.com) 에게 감사 드립니다.

 

반응형

+ Recent posts