|
Windbg 를 통해서 문제가 발생한 시점의 Callstack을 Check 해볼 경우 간혹, Function Name 대신에 0xXXX 와 같은 Hex 정보 또는 ?? 와 같은 알 수 없는 character로 표시되는 경우가 간혹 발생한다. Function Name은 일반적으로 Stack에서 Frame pointer (EBP) 정보를 통해 얻어오기 때문에 Stack의 Frame pointer를 얻어내는 위치에 잘못된 stack값이 들어 있다면, Windbg 역시 정상적으로 정보를 출력해 주지 못할 것이다. 이와 같은 현상은 주로 Stack corruption이 발생할 때, 볼 수 있으며, 원인은 1) 문제가 발생한 시점에 stack을 사용하고 있는 Function operation에서 local variables의 buffer overflow 등으로 인하여, stack의 previous EBP 값을 overwrite 하거나, 2) Function의 calling conventions(calling convensions에 대해서는 John Robbins의 msdn Bugslayer article http://www.microsoft.com/msj/0698/bugslayer0698.aspx 의 "Endians, Calling Conventions, and Symbols" 부분을 참조)와 prototype이 mismatch 되어 발생하거나 아니면, 3) 호출된 Function의 address가 잘못된 정보 -예를 들어, wild pointer와 같은- 가지고 호출하는 경우에 문제될 수 있다. 이런 경우, 문제가 발생한 시점으로부터 역으로 stack의 정보를 하나씩 verify하여 check해 보는 수밖에 없는 데 예를 들어, dds 나 dd command를 통해 raw stack 정보를 다음과 같이 출력하고, 0:055> dds esp 062df10c 753b2025 sqloledb!CErrorData::PostSqlError+0x12 062df110 00200061 062df114 00000000 062df118 005f0061 062df11c 06820318 062df120 062df101 062df124 06825f4d 062df128 753a9427 sqloledb!CDBConnection::PostSQLServerMessage+0x4d5 문제가 발생한 시점으로부터 이 전에 stack을 채운 정보를 Check 해야 하므로, 예를 들어, 상위의 raw stack을 위해서는 previous EBP가 정상적으로 출력한 Function Name인 sqloledb!CErrorData::PostSqlError의 assembly code를 다음과 같이 출력하여, stack 연산을 Check 하면, 0:055> kbL ChildEBP RetAddr Args to Child 062df108 753b2025 00200061 00000000 005f0061 MSVCRT!wcslen+0x4 062df124 753a9427 0074006f 005f0061 00000000 sqloledb!CErrorData::PostSqlError+0x12 0:055> u sqloledb!CErrorData::PostSqlError 753b2025 sqloledb!CErrorData::PostSqlError: 753b2013 55 push ebp 753b2014 8bec mov ebp,esp 753b2016 51 push ecx 753b2017 53 push ebx 753b2018 56 push esi 753b2019 8b3518553d75 mov esi,dword ptr [sqloledb!_imp__wcslen (753d5518)] 753b201f 57 push edi 753b2020 ff7524 push dword ptr [ebp+24h] 753b2023 ffd6 call esi 062df10c 753b2025 sqloledb!CErrorData__PostSqlError+0x12 <-- current esp 062df110 00200061 <-- push dword ptr [ebp+0x24] (this is our bad guy) 062df114 00000000 <-- push edi 062df118 005f0061 <-- push esi 062df11c 06820318 <-- push ebx 062df120 062df101 <-- push ecx 062df124 06825f4d <-- current ebp 062df128 753a9427 sqloledb!CDBConnection::PostSQLServerMessage+0x4d5 이와 같은 방법으로 문제가 발생한 위치의 stack에 잘못된 정보를 push한 instruction을 찾아서 Fix하도록 하는 작업이 필요할 것이다. 결국, Debugging은 Program의 logic과 그에 맞는 Register나 Memory heap상의 Data를 verify 하는 작업이 가장 중요한 작업이 될 수 있다.
|
카테고리
이글루링크
최근 등록된 덧글
그러세요
by 강세윤 at 12/15 오늘 많이 헤매다..알게 .. by youna at 12/14 글 잘 읽었습니다 . 전 .. by 위시 at 11/26 어렷다 by klhk at 11/09 dhjjgbem by kl at 11/09 17번부터 어떻게 접는지.. by tykim0131 at 10/28 ATL이나 MFC를 이용하.. by 김명신 at 09/24 복원되었군요.. 제 RSS.. by 강세윤 at 09/24 허걱, 하고 있는 것으로.. by 강세윤 at 09/15 RSS 주소 서비스는 안 .. by 정성태 at 09/15 이글루 파인더
| |||