인터넷 Banking을 하려고 하는데 무슨 이유에서인지 IE가 계속 멈춰버리 더군요. 멀까 하고 덤프를 만들었는데 재미있는 Stack을 발견했습니다. 이 Stack을 가지고 한번 분석을 해보았죠.
0:029> !ntsdexts.locks
CritSec ntdll!LdrpLoaderLock+0 at 7c9ab178
LockCount 7
RecursionCount 1
OwningThread a10
EntryCount 5b
ContentionCount 5b
*** Locked
*** ERROR: Symbol file could not be found. Defaulted to export symbols for Flash9f.ocx -
CritSec Flash9f!pcre_stack_free+48f4 at 302b7d50
LockCount 0
RecursionCount 1
OwningThread 7c0
EntryCount 0
ContentionCount 0
*** Locked
locks Command를 이용해서 CS 정보를 었었습니다. LockCount가 무려 7 !!! 7개의 Thread 가 Waiting 상태군요!!7c9ab178 CS의 OwningThread인 a10을 봐봐야 겠군요 이 녀석이 어떤 이유에서 멈춰 있는듯합니다.
29 Id: 9e0.a10 Suspend: 1 Teb: 7ff94000 Unfrozen
# ChildEBP RetAddr Args to Child
00 08d6fac8 7c93df3c 7c8025db 00000480 00000000 ntdll!KiFastSystemCallRet (FPO: [0,0,0])
01 08d6facc 7c8025db 00000480 00000000 08d6fb00 ntdll!NtWaitForSingleObject+0xc (FPO: [3,0,0])
02 08d6fb30 7c802542 00000480 00002710 00000000 kernel32!WaitForSingleObjectEx+0xa8 (FPO: [Non-Fpo])
03 08d6fb44 0aad7c5c 00000480 00002710 00000000 kernel32!WaitForSingleObject+0×12 (FPO: [Non-Fpo])
*** ERROR: Symbol file could not be found. Defaulted to export symbols for mdnsNSP.dll -
WARNING: Frame IP not in any known module. Following frames may be wrong.
04 08d6fbc8 160851bf 16080000 00000002 00000000 0xaad7c5c
05 08d6fc08 16085279 16080000 7c93118a 16080000 mdnsNSP!NSPStartup+0×254f
06 08d6fc30 7c94b175 1608525c 16080000 00000002 mdnsNSP!NSPStartup+0×2609
07 08d6fca4 7c94afee 08d6fd30 08d6fd30 657a6aa0 ntdll!LdrpInitializeThread+0xc0 (FPO: [Non-Fpo])
08 08d6fd1c 7c93e437 08d6fd30 7c930000 00000000 ntdll!_LdrpInitialize+0×219 (FPO: [Non-Fpo])
09 00000000 00000000 00000000 00000000 00000000 ntdll!KiUserApcDispatcher+0×7
ntdll!KiUserApcDispatcher과 ntdll!LdrpInitializeThread를 볼때 Thread 생성중 InMemoryOrderLinks에 존재하는 DLL Entry를 실행하고 있다는 것을 알 수 있습니다. 하지만 문제를 발생시킨 부분이 깨져보이는군요. Manual Stack Trace를 해보아야 겠군요. ( 어떨결에 잘못보면 mdnsNSP에서 문제가 발생한 것으로 오인할 수 있으니 주의 하시길… )
0:029> !teb
TEB at 7ff94000
ExceptionList: 08d6fb20
StackBase: 08d70000
StackLimit: 08d62000
SubSystemTib: 00000000
FiberData: 00001e00
ArbitraryUserPointer: 00000000
Self: 7ff94000
EnvironmentPointer: 00000000
ClientId: 000009e0 . 00000a10
RpcHandle: 00000000
Tls Storage: 00000000
PEB Address: 7ffd5000
LastErrorValue: 0
LastStatusValue: c0000046
Count Owned Locks: 0
HardErrorMode: 0
0:029> dps 08d62000 08d70000
…
08d6fb18 08d6fae0
08d6fb1c 00006bb7
08d6fb20 08d6fbf8
08d6fb24 7c839ac0 kernel32!_except_handler3
08d6fb28 7c802608 kernel32!`string’+0xd0
08d6fb2c 00000000
08d6fb30 08d6fb44
08d6fb34 7c802542 kernel32!WaitForSingleObject+0×12
08d6fb38 00000480
08d6fb3c 00002710
08d6fb40 00000000
08d6fb44 08d6fbc8
08d6fb48 0aad7c5c
08d6fb4c 00000480
08d6fb50 00002710
08d6fb54 00000000
08d6fb58 7c800000 kernel32!_imp___wcsnicmp <PERF> (kernel32+0×0)
08d6fb5c 0aad791b
08d6fb60 0ab00000
08d6fb64 00000006
08d6fb68 08d6fb74
08d6fb6c 0000000c
08d6fb70 7c943405 ntdll!RtlDecodePointer
08d6fb74 7c800000 kernel32!_imp___wcsnicmp <PERF> (kernel32+0×0)
08d6fb78 1609b9ac mdnsNSP!NSPStartup+0×18d3c
08d6fb7c 00000000
08d6fb80 0aad80cb
08d6fb84 7c800000 kernel32!_imp___wcsnicmp <PERF> (kernel32+0×0)
08d6fb88 1609b9ac mdnsNSP!NSPStartup+0×18d3c
08d6fb8c 00000000
08d6fb90 7c8097d0 kernel32!TlsGetValue
08d6fb94 16080000 mdnsNSP
08d6fb98 1608956f mdnsNSP!NSPStartup+0×68ff
08d6fb9c 7c800000 kernel32!_imp___wcsnicmp <PERF> (kernel32+0×0)
08d6fba0 1609b9ac mdnsNSP!NSPStartup+0×18d3c
08d6fba4 032c6708
08d6fba8 16085126 mdnsNSP!NSPStartup+0×24b6
08d6fbac 565f744f
08d6fbb0 00000031
08d6fbb4 032c6708
08d6fbb8 00000000
08d6fbbc 00000002
08d6fbc0 16080000 mdnsNSP
08d6fbc4 00000000
08d6fbc8 08d6fc08
08d6fbcc 160851bf mdnsNSP!NSPStartup+0×254f
08d6fbd0 16080000 mdnsNSP
08d6fbd4 00000002
08d6fbd8 00000000
08d6fbdc 4765a141
08d6fbe0 00000000
08d6fbe4 08d6fc24
08d6fbe8 7ffd5000
08d6fbec 00000001
08d6fbf0 08d6fbdc
08d6fbf4 76f11178 WLDAP32!_DllMainCRTStartup+0×52
08d6fbf8 08d6fc94
08d6fbfc 16083400 mdnsNSP!NSPStartup+0×790
08d6fc00 59ba9289
08d6fc04 00000000
08d6fc08 08d6fc30
08d6fc0c 16085279 mdnsNSP!NSPStartup+0×2609
08d6fc10 16080000 mdnsNSP
08d6fc14 7c93118a ntdll!LdrpCallInitRoutine+0×14
08d6fc18 16080000 mdnsNSP
08d6fc1c 00000002
08d6fc20 00000000
08d6fc24 7ffd5000
08d6fc28 00000000
08d6fc2c 00255a98
08d6fc30 08d6fca4
08d6fc34 7c94b175 ntdll!LdrpInitializeThread+0xc0
08d6fc38 1608525c mdnsNSP!NSPStartup+0×25ec
08d6fc3c 16080000 mdnsNSP
08d6fc40 00000002
08d6fc44 00000000
08d6fc48 7ff94000
08d6fc4c 7ffd5000
08d6fc50 00000000
08d6fc54 00000014
08d6fc58 00000001
08d6fc5c 00000000
08d6fc60 001da9c8
08d6fc64 00000000
08d6fc68 00000000
08d6fc6c 00000000
08d6fc70 00000000
08d6fc74 00000000
08d6fc78 00000000
08d6fc7c 00000000
08d6fc80 7ffd5000
08d6fc84 1608525c mdnsNSP!NSPStartup+0×25ec
08d6fc88 00255a98
08d6fc8c 08d6fc48
08d6fc90 00000000
…
Windbg에서 보여주고 있는 부분은 0xaad7c5c 부분입니다만 실제로 mdnsNSP!NSPStartup+0×254f 영역에서 호출한 함수는 mdnsNSP!NSPStartup+0×231d 이 부분 입니다. 그렇다면 이 Function이 호출된 것은 Stack 상에 어디에 나타 날까 ?
0:029> ub mdnsNSP!NSPStartup+0x254f
*** ERROR: Symbol file could not be found. Defaulted to export symbols for mdnsNSP.dll -
mdnsNSP!NSPStartup+0x2538:
160851a8 ffd0 call eax
160851aa 8945e4 mov dword ptr [ebp-1Ch],eax
160851ad 837de400 cmp dword ptr [ebp-1Ch],0
160851b1 0f8496000000 je mdnsNSP!NSPStartup+0×25dd (1608524d)
160851b7 57 push edi
160851b8 56 push esi
160851b9 53 push ebx
160851ba e8cefdffff call mdnsNSP!NSPStartup+0×231d (16084f8d)
0:029> uf mdnsNSP!NSPStartup+0×231d
mdnsNSP!NSPStartup+0×231d:
16084f8d 55 push ebp
16084f8e 8bec mov ebp,esp
16084f90 51 push ecx
16084f91 8b450c mov eax,dword ptr [ebp+0Ch]
16084f94 83f801 cmp eax,1
16084f97 53 push ebx
16084f98 56 push esi
…생략
mdnsNSP!NSPStartup+0×24e5:
16085155 57 push edi
16085156 e83c470000 call mdnsNSP!NSPStartup+0×6c27 (16089897)
1608515b 59 pop ecx
mdnsNSP!NSPStartup+0×24ec:
1608515c 33c0 xor eax,eax
1608515e 40 inc eax
mdnsNSP!NSPStartup+0×24ef:
1608515f 5f pop edi
16085160 5e pop esi
16085161 5b pop ebx
16085162 c9 leave
16085163 c20c00 ret 0Ch
mdnsNSP!NSPStartup+0×231d 함수가 메모리 상에 실제 위치하는 영역은 16084f8d 부터 16085163 부분 이군요 그럼 이 부분 Stack상에 어디에 표시되어 있을까 ?
...
08d6fb90 7c8097d0 kernel32!TlsGetValue
08d6fb94 16080000 mdnsNSP
08d6fb98 1608956f mdnsNSP!NSPStartup+0×68ff
08d6fb9c 7c800000 kernel32!_imp___wcsnicmp <PERF> (kernel32+0×0)
08d6fba0 1609b9ac mdnsNSP!NSPStartup+0×18d3c
08d6fba4 032c6708
08d6fba8 16085126 mdnsNSP!NSPStartup+0×24b6
…
Stack상에 그 영역의 값을 가지는 것이 보이는군요. 그럼 다시 mdnsNSP!NSPStartup+0×24b6 위치에서 호출되진 함수를 보죠.
0:029> ub mdnsNSP!NSPStartup+0x24b6
mdnsNSP!NSPStartup+0x249a:
1608510a 3bf7 cmp esi,edi
1608510c 59 pop ecx
1608510d 59 pop ecx
1608510e 0f84a9feffff je mdnsNSP!NSPStartup+0x234d (16084fbd)
16085114 56 push esi
16085115 ff3538fc0916 push dword ptr [mdnsNSP!NSPStartup+0x1cfc8 (1609fc38)]
1608511b ff350c090a16 push dword ptr [mdnsNSP!NSPStartup+0x1dc9c (160a090c)]
16085121 e8fa430000 call mdnsNSP!NSPStartup+0×68b0 (16089520)
0:029> uf mdnsNSP!NSPStartup+0×68b0
mdnsNSP!NSPStartup+0×68b0:
16089520 56 push esi
16089521 ff353cfc0916 push dword ptr [mdnsNSP!NSPStartup+0x1cfcc (1609fc3c)]
16089527 8b35ecb00916 mov esi,dword ptr [mdnsNSP!NSPStartup+0x1847c (1609b0ec)]
1608952d ffd6 call esi
1608952f 85c0 test eax,eax
16089531 7421 je mdnsNSP!NSPStartup+0×68e4 (16089554)
mdnsNSP!NSPStartup+0×68c3:
16089533 a138fc0916 mov eax,dword ptr [mdnsNSP!NSPStartup+0x1cfc8 (1609fc38)]
16089538 83f8ff cmp eax,0FFFFFFFFh
1608953b 7417 je mdnsNSP!NSPStartup+0×68e4 (16089554)
mdnsNSP!NSPStartup+0×68cd:
1608953d 50 push eax
1608953e ff353cfc0916 push dword ptr [mdnsNSP!NSPStartup+0x1cfcc (1609fc3c)]
16089544 ffd6 call esi
16089546 ffd0 call eax
16089548 85c0 test eax,eax
1608954a 7408 je mdnsNSP!NSPStartup+0×68e4 (16089554)
mdnsNSP!NSPStartup+0×68dc:
1608954c 8b80fc010000 mov eax,dword ptr [eax+1FCh]
16089552 eb1b jmp mdnsNSP!NSPStartup+0×68ff (1608956f)
mdnsNSP!NSPStartup+0×68e4:
16089554 689cb90916 push offset mdnsNSP!NSPStartup+0×18d2c (1609b99c)
16089559 ff15d0b00916 call dword ptr [mdnsNSP!NSPStartup+0x18460 (1609b0d0)]
1608955f 85c0 test eax,eax
16089561 741a je mdnsNSP!NSPStartup+0×690d (1608957d)
mdnsNSP!NSPStartup+0×68f3:
16089563 68acb90916 push offset mdnsNSP!NSPStartup+0×18d3c (1609b9ac)
16089568 50 push eax
16089569 ff1558b00916 call dword ptr [mdnsNSP!NSPStartup+0x183e8 (1609b058)]
mdnsNSP!NSPStartup+0×68ff:
1608956f 85c0 test eax,eax
16089571 740a je mdnsNSP!NSPStartup+0×690d (1608957d)
mdnsNSP!NSPStartup+0×6903:
16089573 ff742408 push dword ptr [esp+8]
16089577 ffd0 call eax
16089579 89442408 mov dword ptr [esp+8],eax
mdnsNSP!NSPStartup+0×690d:
1608957d 8b442408 mov eax,dword ptr [esp+8]
16089581 5e pop esi
16089582 c3 ret
같은 방법으로 mdnsNSP!NSPStartup+0×68b0 Function내에 Address를 나타내는 Return Address를 Raw Stack에서 발견할 수 있죠. ( mdnsNSP!NSPStartup+0×68ff 값을요 … ) mdnsNSP!NSPStartup+0×68ff값을 Return Address로 가지는 함수 Call을 찾아 보면 정말 문제를 일으킨 원인이 대략적으로 보여지겠죠.
0:029> dd 1609b058
1609b058 0aad8085 0aad7ee5 7c809f81 7c8097f6
1609b068 7c809a1d 7c8099bf 7c80981e 7c812a99
1609b078 7c93ff0d 7c949b80 7c9400a4 7c8097b8
1609b088 7c812fad 7c812b6e 7c80ac51 7c801e1a
1609b098 7c80de85 7c863e6a 7c8449fd 7c813123
1609b0a8 7c810f88 7c812c46 7c809b74 7c861c00
1609b0b8 7c809ae1 7c95aba5 7c80cd27 7c812fc9
1609b0c8 7c810ee1 7c833490 7c80b731 7c81cafa
0:029> dps 1609b048
1609b048 7c80a0ed kernel32!WaitForMultipleObjects
1609b04c 7c83089d kernel32!CreateEventA
1609b050 7c80a164 kernel32!WideCharToMultiByte
1609b054 7c814f7a kernel32!GetSystemDirectoryA
1609b058 0aad8085
1609b05c 0aad7ee5
1609b060 7c809f81 kernel32!InitializeCriticalSection
1609b064 7c8097f6 kernel32!InterlockedIncrement
1609b068 7c809a1d kernel32!LocalAlloc
1609b06c 7c8099bf kernel32!LocalFree
1609b070 7c80981e kernel32!InterlockedExchange
1609b074 7c812a99 kernel32!RaiseException
1609b078 7c93ff0d ntdll!RtlFreeHeap
1609b07c 7c949b80 ntdll!RtlReAllocateHeap
1609b080 7c9400a4 ntdll!RtlAllocateHeap
1609b084 7c8097b8 kernel32!GetCurrentThreadId
1609b088 7c812fad kernel32!GetCommandLineA
1609b08c 7c812b6e kernel32!GetVersionExA
1609b090 7c80ac51 kernel32!GetProcessHeap
1609b094 7c801e1a kernel32!TerminateProcess
1609b098 7c80de85 kernel32!GetCurrentProcess
1609b09c 7c863e6a kernel32!UnhandledExceptionFilter
1609b0a0 7c8449fd kernel32!SetUnhandledExceptionFilter
1609b0a4 7c813123 kernel32!IsDebuggerPresent
1609b0a8 7c810f88 kernel32!HeapDestroy
1609b0ac 7c812c46 kernel32!HeapCreate
1609b0b0 7c809b74 kernel32!VirtualFree
1609b0b4 7c861c00 kernel32!FatalAppExitA
1609b0b8 7c809ae1 kernel32!VirtualAlloc
1609b0bc 7c95aba5 ntdll!RtlUnwind
1609b0c0 7c80cd27 kernel32!LockResource
1609b0c4 7c812fc9 kernel32!GetStdHandle
0:029> lmv m mdnsNSP
start end module name
16080000 160a5000 mdnsNSP (export symbols) mdnsNSP.dll
Loaded symbol image file: mdnsNSP.dll
Image path: C:\Program Files\Bonjour\mdnsNSP.dll
Image name: mdnsNSP.dll
Timestamp: Fri Aug 15 07:54:04 2008 (48A4B78C)
CheckSum: 0002A010
ImageSize: 00025000
File version: 1.0.5.11
Product version: 1.0.5.11
File flags: 0 (Mask 17)
File OS: 4 Unknown Win32
File type: 2.0 Dll
File date: 00000000.00000000
Translations: 0409.04b0
CompanyName: Apple Inc.
ProductName: Bonjour
InternalName: mdnsNSP.dll
OriginalFilename: mdnsNSP.dll
ProductVersion: 1,0,5,11
FileVersion: 1,0,5,11
FileDescription: Bonjour Namespace Provider
LegalCopyright: Copyright (C) 2003-2008 Apple Inc.
대략적으로 7c로 지작하는 주소들이 쭉있는것으로 봐서 mdnsNSP의 Import된 Function 임을 추정할 수 있습니다. 그런데 이상한점은 실제로 Call되어지는 함수는 어떤모듈에 의해서 Hooking 되어 졌군요.
0aa90000 0aac0000 Foo.dll ( 실제 이름은 Foo가 아닙니다. )
Timestamp: Thu Jan 01 09:00:01 1970 (00000001)
Checksum: 00000000
0aad8085의 위치는 Foo.dll의 영역이군요. 원인이된 부분은 바로 Foo.dll의 Hooking Function중 하나겠군요 !!! ( 그런데 아쉽게 Unload 되어 졌군요. 무슨 이유에서인지 Waiting 상태에서 Unload된것으로 보여지는군요. ) 만약 Waiting이 풀렸더라도 Exception….
최근 답글