Stack Corruption

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 SehYoon | 2008/05/02 16:29 | Windows debugging | 트랙백 | 덧글(0)
트랙백 주소 : http://byung.egloos.com/tb/4331202
☞ 내 이글루에 이 글과 관련된 글 쓰기 (트랙백 보내기) [도움말]

:         :

:

비공개 덧글

< 이전페이지 다음페이지 >