오랜만에 글을 올리는 것 같네요.
그 동안 잘 지내셨습니까?
이 글을 어느 분들이 보실지 모르겠지만 저에게 영감을 주신 달토끼님에게 감사 드립니다.
(달토끼님이 잘 정리하신 걸 제 나름대로 정리 해 보았습니다. 그래야지 내꺼가 되니까^^)
☞ http://kuaaan.tistory.com/102
우선, 이 글은 개발에 필요한 디버깅 기술이 아닌 분석자의 입장에서 분석을 할 때 유용할 정보를 언급하는데 초점을 맞췄습니다. 따라서 "왜 Map, Cod 파일을 생성하면 되는데 이렇게 할까?" 라고 생각이 들겠지만 보안팀에서는 회사의 소스에 대한 접근 권한이 없는 경우가 많으므로 그럴 때 분석을 효과적으로 하기 위해서 필요한 내용을 정리하는 것이니 이점을 감안하여 보시길 바랍니다.
제 블로그를 보시면 아시겠지만 반어로 작성하니 이점 참고 하시길 바랍니다.
무례하다면 먼저 사과 드립니다.
////////////////////////////////////////////////////////////
1. Cod 파일이란? Map 파일이란?
분 류 |
설명 |
Map |
Map 파일은 Visual Studio에서 제공하는 컴파일 시 Application에서 사용하는 전역변수, 함수의 위치를 기록한 파일이다. 해당은 Symbol파일이 없을 경우 함수의 주소와 특정 함수를 알고 싶을 때 사용한다. |
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] INCLUDELIB MSVCRTD PUBLIC ?TestFunction@@YAPAU_IMAGE_IMPORT_DESCRIPTOR@@PAUHINSTANCE__@@@Z ; TestFunction __RTC_InitBase.rtc$IMZ DD FLAT:__RTC_InitBase ; COMDAT ?GetImportTable@@YAPAU_IMAGE_IMPORT_DESCRIPTOR@@PAUHINSTANCE__@@@Z 00000 55 push ebp ................. _TEXT ENDS |
2) Map 파일
Timestamp is 52ddfe3f (Tue Jan 21 13:57:35 2014) Preferred load address is 00400000 Start Length Name Class .................................................................. Address Publics by Value Rva+Base Lib:Object 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 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) 에게 감사 드립니다.
'Reverse > 분석 문서' 카테고리의 다른 글
[WinDbg 따라하기 - 0x008] VMWare windbg 연결 하기 (0) | 2014.01.29 |
---|---|
[WinDbg 따라하기 - 0x007] Name Mangling 이란? (0) | 2014.01.22 |
LoadLibrary와 GetMoudleHandle 의 차이 (0) | 2013.07.03 |
자식 프로세스 분석 하기 (2) | 2013.04.12 |
악성파일이 자주 날라 오는 요즘...분석 (0) | 2013.03.28 |