티스토리 툴바


[RCE] jz님의 CrackMe 완전 분석

안녕하세요... 정말 간만에 제대로된 포스팅이네요...

이번에는 jumpzero(http://jz.pe.kr/) 님께서 만드신 CrackMe를 한번 전면으로 분석해보겠습니다...^^

우선, PE Scanner인 PEiD(http://www.peid.info/)로 실행 파일을 간단하게 분석해보았습니다.


시그너쳐(SIgnature)가 Microsoft Visual C++ 6.0 으로 나오는군요...^^

패킹은 하지 않으셨다고 하니, Visual C++ 6.0 실행 파일인 것은 거의 확실하겠습니다.

그리고 PE Tools 로 확인해본 결과, TLS(Thread Local Storage) 영역도 깨끗한 것을 확인할 수 있었습니다.

(즉, TLS Callback 등의 트릭은 사용되지 않았다는 것이겠죠...^^)


그럼 본격적인 분석 들어갑니다...

저는 Olly Debugger 를 주로 애용하므로, Olly 를 사용하여 분석하겠습니다.
*** 모든 분석 및 테스트는 Windows XP sp3 환경에서 진행되었습니다. ***




Launch(=발사하다) the Olly Debugger!!!


다음은 크랙미를 실행했을 때 최초로 실행되는 코드, 즉 진입점(Entry Point)의 코드입니다... (그림이 잘 안 보이시면 클릭 후 확대해서 봐주세요...^^)


컴파일러에 의해 생성된 것으로 보이는 코드가 진입점에 있네요... 거짓으로 위와 같은 코드를 넣었을 가능성을 배제할 수는 없지만, 일단 거짓 코드가 아니라고 가정하고, main() 함수(일반적으로 0x401000)부터 분석해보겠습니다. (귀차니즘...)


...식으로 분석 중이었는데 중간에 의욕상실로 걍 포기.

그래도 글 작성했던거 날리기는 싫어서 비공개로 해두던 것을 공개로 바꾸었습니다.
저작자 표시


Windows에서 특정 함수가 내부적으로 호출하는 함수를 알아야할 때가 있습니다. 특히 상용 보안 엔진 등을 개발해야할 때는 이러한 분석이 필수적일 때가 많죠. 조금 더 깊숙히 후킹하여 외부 솔루션과의 충돌을 미연에 피하고 싶을 때(물론 미봉책적인 방법이기는 합니다만...), 혹은 다른 악성코드, 공격 가능 드라이버들이 사전에 후킹/변조/경유할 만한 경로를 찾는다는 것은 보안 솔루션 개발시에 충분히 고려되어야 할 사항이기 때문입니다.

이러한 분석(내부 함수 호출 개요 분석)을 해주는 명령어가 WinDbg에 있습니다. WinDbg의 uf 명령어를 이용하면 특정 함수를 디스어셈블리 할 수 있습니다. 그 중에서도 -c 스위치를 사용하면 함수의 호출만 간략하게 볼 수 있는 유용한 기능을 사용할 수 있습니다. 이 명령어를 사용해서 NtOpenProcess, NtTerminateProcess, NtTerminateThread 함수를 간단하게 분석해보았습니다.

모든 출력 결과는 Windows XP sp3 에서 출력된 것임을 미리 밝혀둡니다.:

* NtOpenProcess:

lkd> uf -c nt!NtOpenProcess
nt!NtOpenProcess (805cd408)
  nt!NtOpenProcess+0xa (805cd412):
    call to nt!_SEH_prolog (8053db90)
  nt!NtOpenProcess+0x4e (805cd456):
    call to nt!ExRaiseDatatypeMisalignment (80616072)
  nt!NtOpenProcess+0x7c (805cd484):
    call to nt!ExRaiseDatatypeMisalignment (80616072)
  nt!NtOpenProcess+0x116 (805cd51e):
    call to nt!SeCreateAccessState (805f2dc4)
  nt!NtOpenProcess+0x132 (805cd53a):
    call to nt!SeSinglePrivilegeCheck (805f9cc0)
  nt!NtOpenProcess+0x17d (805cd585):
    call to nt!ObOpenObjectByName (805bd8f2)
  nt!NtOpenProcess+0x18b (805cd593):
    call to nt!SeDeleteAccessState (805f2b86)
  nt!NtOpenProcess+0x1e2 (805cd5ea):
    call to nt!PsLookupProcessThreadByCid (805d502e)
  nt!NtOpenProcess+0x1f4 (805cd5fc):
    call to nt!SeDeleteAccessState (805f2b86)
  nt!NtOpenProcess+0x202 (805cd60a):
    call to nt!PsLookupProcessByProcessId (805d50ea)
  nt!NtOpenProcess+0x224 (805cd62c):
    call to nt!ObOpenObjectByPointer (805bdc78)
  nt!NtOpenProcess+0x232 (805cd63a):
    call to nt!SeDeleteAccessState (805f2b86)
  nt!NtOpenProcess+0x23e (805cd646):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtOpenProcess+0x246 (805cd64e):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtOpenProcess+0x27e (805cd686):
    call to nt!_SEH_epilog (8053dbcb)

* NtTerminateProcess:

lkd> uf -c nt!NtTerminateProcess
nt!NtTerminateProcess (805d49aa)
  nt!NtTerminateProcess+0x4a (805d49f4):
    call to nt!ObReferenceObjectByHandle (805bd49e)
  nt!NtTerminateProcess+0x78 (805d4a22):
    call to nt!PspCatchCriticalBreak (805d3a50)
  nt!NtTerminateProcess+0x86 (805d4a30):
    call to nt!ExAcquireRundownProtection (8060e3da)
  nt!NtTerminateProcess+0x91 (805d4a3b):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtTerminateProcess+0xb9 (805d4a63):
    call to nt!PsGetNextProcessThread (805d9ae4)
  nt!NtTerminateProcess+0xd0 (805d4a7a):
    call to nt!PspTerminateThreadByPointer (805d4882)
  nt!NtTerminateProcess+0xd7 (805d4a81):
    call to nt!PsGetNextProcessThread (805d9ae4)
  nt!NtTerminateProcess+0xe5 (805d4a8f):
    call to nt!ExReleaseRundownProtection (8060e434)
  nt!NtTerminateProcess+0xf7 (805d4aa1):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtTerminateProcess+0x100 (805d4aaa):
    call to nt!PspTerminateThreadByPointer (805d4882)
  nt!NtTerminateProcess+0x113 (805d4abd):
    call to nt!DbgkClearProcessDebugObject (80644c54)
  nt!NtTerminateProcess+0x131 (805d4adb):
    call to nt!ObClearProcessHandleTable (805c49f6)
  nt!NtTerminateProcess+0x13c (805d4ae6):
    call to nt!ObfDereferenceObject (8052868e)

* NtTerminateThread:

lkd> uf -c nt!NtTerminateThread
nt!NtTerminateThread (805d4ba4)
  nt!NtTerminateThread+0x4e (805d4bf2):
    call to nt!ObReferenceObjectByHandle (805bd49e)
  nt!NtTerminateThread+0x62 (805d4c06):
    call to nt!ObfDereferenceObject (8052868e)
  nt!NtTerminateThread+0x6b (805d4c0f):
    call to nt!PspTerminateThreadByPointer (805d4882)
  nt!NtTerminateThread+0x76 (805d4c1a):
    call to nt!PspTerminateThreadByPointer (805d4882)
  nt!NtTerminateThread+0x7f (805d4c23):
    call to nt!ObfDereferenceObject (8052868e)
저작자 표시


다른 분께 상큼하게 선수를 뺏겨서 조낸 분석중 ... 밤 새야겠군

쿨럭
저작자 표시