본문 바로가기

My Study/Reversing

심볼(Symbol)과 맵(Map) 파일

이번에 알아볼 것은 심볼과 맵 파일에 대한 내용입니다.
다들 공부하다보면 심볼이 없어서 어찌고 저찌고 심볼이 필요하네..필요없네.. 라는 글은 많이 보셨을 것입니다.
그러면 그 심볼이라는 것이 무엇일까요?? 그리고 맵 파일은 무엇일까요?? 알아보도록 하겠습니다.

사실 저도 WinDbg를 공부하면서 추상적으로 심볼 파일을 이해한 상태로 공부를 했는데 이번엔 조금더 자세히 알아보았습니다.

심볼 파일 이란..
컴파일러에 소스를 짠 다음 컴파일 시키면 링크라는 과정을 거치게 됩니다. 필요한 모듈들을 묶는 작업이 되겠죠.
이 때 어셈브리 코드에 해당되는 소스코드의 위치, 함수 이름, 변수 이름 등등 이러한 정보들을 담고 있는 파일이 하나 생성되게 됩니다. ( 링커에서 옵션을 줄 경우 ) 바로 그 파일이 심볼 파일 입니다. 확장자는 .pdb입니다.
그러면 컴파일을 마친 후 pdb파일이 어떻게 생겼는지 보도록 하겠습니다.

다들 저렇게 생긴 파일을 보신적 있으실 것입니다. 바로 저 빨간색 동그라미 있는 파일이 심볼파일(.pdb)입니다.

위에서 설명 드렸지만 저 심볼 파일은 디버깅 할때 상당히 유용한 파일입니다. 이유는 다들 아시겠지만 저 파일이 유출이 된다면 해당 파일에 대한 변수명, 함수명 등 이런 정보가 다 노출되게 됩니다. 상당히 치명적이겠죠. 아마 리버서들에게는 저 심볼정보가 거의 소스코드라고 느낄 것입니다.

WinDbg에서 심볼파일의 힘이 얼마나 대단한지 보도록 하겠습니다. 
먼저 Consol_Study파일을 WinDbg에서 열어서 main함수 부분을 보도록 하겠습니다. ( 심볼정보 로드 X )

뭔가 CALL은 많이 하고 있는데 어떠한 함수를 CALL하고 있는지는 모릅니다. 
당연히 해당 실행 파일은 주소정보만을 가지고 있을 뿐이지.. 함수이름까지 가지고 있진 않기 때문이죠..

이제 심볼 파일을 로드 시키고 다시 main함수 부분을 보도록 하겠습니다.

심볼정보 로드 안했을 때와 했을 때를 비교하면서 보시면 확실히 차이를 느끼실 것입니다. 
어떠한 함수들이 호출되고 있는지 전부다 보여주고 있죠.

이정도면 심볼 파일에 대한 이해는 되셨을 꺼라 봅니다. 

잠시 WinDbg가 심볼 정보를 어떻게 로드하는지 이야기하고 넘어가도록 하겠습니다.

보통 WinDbg로 심볼 서버에서 심볼 정보를 로드하게 되면 모든 심볼이 로드 되는게 아니라 그 모듈에 필요한 심볼만 로드가 되는 것을 볼 수 있습니다. 바로 Lazy Load로 동작을 하기 때문입니다. 필요할 때마다 가져다 쓴다.. 훨씬 성능에 도움이 되겠죠?
필요한 모듈의 심볼 정보를 바로 얻기 위해서는 " ld [모듈 이름]" 명령어를 쓰시면 됩니다.

이제 심볼 파일에 대해 알아보았는데 .. 이러한 심볼 파일도 두 종류가 있습니다.
바로 공용 심볼과 전용 심볼 입니다.
공용 심볼 : 중요한 디버깅 정보들을 모두 제거한 상태, 함수명 정보는 가지고 있음.
전용 심볼 : 모든 디버그 정보를 포함하고 있는 심볼 파일
보통 우리가 컴파일 해서 생성되는 심볼 파일은 전용 심볼입니다.
이러한 전용 심볼을 로드하게 되면 WinDbg에서는 (private pdb symbols) 이라는 정보를 나타내고 있을 것입니다.
그러면 아까 Consol_Study의 심볼 파일은 전용 심볼 이었으므로 한번 봐보겠습니다.

맞군요. 그 아래 deferred 라고 나온 것은 심볼이 로드가 되지 않았다는 것입니다.
그리고 그 아래 export symbols 는 외부 심볼을 뜻하는거 같네요.

마소에서는 자기들이 만든 모든 파일에 대해서는 심볼 파일을 배포하고 있습니다. 당연히 공용 심볼로 말이죠.
해당 심볼 서버 : http://msdl.microsoft.com/download/symbols
WinDbg에서 특정 경로에 심볼 서버를 연결시켜 reload 시키면 그 때 그 때 필요한 심볼 파일을 얻어오게 됩니다.

마소는 왜 이런 심볼 파일을 배포 할까요?? 
개발자들이 개발을 하다보면 많은 API함수들을 사용하게 됩니다. 이 때 API함수 사용을 잘못해서 오류가 생길 경우 디버깅을 해야되는데 이럴 경우를 대비해 마소에서는 심볼정보를 배포하는 것입니다.

그러면 개발자가 직접 자기가 만든 프로그램의 심볼을 배포해야될 때 공용심볼을 배포하려면 어떻해야 될까요??
공용심볼을 만들어야겠죠. 방법은 링커의 옵션을 설정해 주면 됩니다.

전용 기호 제거라는 부분에 저렇게 써주고 컴파일을 시키면 공용심볼이 만들어지게 됩니다.

용량을 봐도 차이가 있습니다. 전용 심볼보다 8~9배는 더 적습니다. ( 확장자만 .pdb로 바꿔서 배포.. )
이제 공용 심볼을 로드 시키고 다시 정보를 봐보겠습니다.

아까와는 다르게 나오네요. 전용 심볼과 공용 심볼 차이 입니다.

이제 맵(Map)파일에 대해서 알아보도록 하겠습니다.
맵 파일 : 함수들의 주소와 소스코드의 줄 번호 등을 기록해 놓은 텍스트 파일
위에서도 설명했지만 링커는 컴파일시 각 모듈들을 연결을 하게 되는데 이 때 함수 주소나 소스코드 줄 번호 등을 기록해서 파일로 생성시키면 맵 파일 되게 됩니다.

생성된 맵 파일을 열어보겠습니다.

Address에는 RVA값이 적혀 있네요. ImageBase와 합쳐진 주소도 나타내 주는군요.

그러면 이러한 맵파일은 언제 사용하느냐..
디버깅이 불가능 하거나 심볼 정보를 확인할 수 있는 상황에서 맵 파일을 사용하게 됩니다.
위와 같은 경우는 실행파일 이므로 주소가 절대 바뀌지 않으니 그 때 상황을 찾아가기 쉬울 것입니다.

이렇게 컴파일 시 맵 파일을 생성시키려면 이것 또한 링커에서 옵션을 설정해주면 됩니다.
생성된 맵 파일을 보시겠습니다.


지금까지 심볼 파일과 맵 파일에 대한 내용을 알아보았습니다.


'My Study > Reversing' 카테고리의 다른 글

Windows 7,Vista Random Imagebase  (7) 2010.04.18
IDAStealth 플러그인  (0) 2010.04.16
모달 윈도우 무력화  (0) 2010.04.15
IDA v5.2 -> IDA v5.5 원격 디버깅  (0) 2010.04.13
바이트코드 기반 언어 심볼 정보 포함 이유  (0) 2010.04.13