보안세상

winlogon.exe란 무엇인가? 본문

내 생각

winlogon.exe란 무엇인가?

똔민 2015. 7. 3. 19:15
반응형

윈도우 로그 관리자로써 


윈도우 비스타 이전 : Winlogon.exe가 Lsass.exe와 Services.exe 를 실행시킴

윈도우 비스타 이후 : Winlogon.exe와 Wininit.exe가 함께 실행되고, Wininit.exe가 Lsass.exe와 Services.exe를 실행시킴


Lsass.exe ( Local Security Authority Subsystem Service )는 부팅시 보안 인증을 담당하고 LSA 라고도 부른다.

Services.exe ( Service Control Manager )는 서비스를 관리하고, SCM 이라고도 부른다.

Winlogon 은 또한 유저 로그인 동작을 수행하는 GINA ( Graphical Identification and Authentication )를 호출하고

로그온, 로그오프 관련 작업에 관여한다.

대기할 때 항시 SAS(Secure Attention Sequence : Alt + Ctrl + Del)키 입력을 감시하다가

SAS키 입력이 들어오면 GINA를 불러와 사용자가 로그온 작업을 할 수 있도록한다.

그리고 컴퓨터 잠금과 해제, 스마트카드,PIN 같은 추가적인 자격 증명 제공한다.

이와 관련된 DLL은

%SystemRoot%\System32\authui.dll (여길 수정하면 로그온 테마 변경 가능)

%SystemRoot%\System32\SmartcardCredentialProvider.dll 이다.

이를 GINA와 연결하여 Winlogon.exe과 상호 작용하면서 로그인,인증 UI를 관리한다.

그리고 Winlogon은 자격 증명 제공 오류로 부터 자신을 보호하기 위하여 Logonui.exe(자격 증명 제공자)를 이용한다.

이것은 네트워크 제공자 로드, 로그온 인터페이스 노출, Winlogon 종료 방지 등의 기능을 한다.

비스타 이전 까지는 Winlogon이 종료되면 시스템 크래쉬가 발생했지만,

이후로는 Wininit.exe 가 지켜줘서 로그오프만 된다.

또한 Winlogon은 고유한 SID를 할당하여 데스크톱 인스턴스(키보드, 화면, 마우스)에 배정하게 되고

이를 로그온 프로세스 토큰에 포함하여 보안을 담당하는 Lsass에 전달한 후 인증을 통과하면

할당했던 SID를 로그온 프로세스 토큰에 포함해 로그인 인증용도로 사용한다.

쉽게 말해 컴퓨터 잠금,로그온,오프에 관여한다.


좀 더 깊게 들어가 Winlogon.exe를 이용해 악성코드가 유포되고 있는 리버싱(올리디버거)환경에서 분석해보면


1)주요 타켓

(시스템폴더)\ winlogon.exe

(윈도우)\explorer.exe

윈도우7-wininit.exe

 

2)최종적인 목표는 hlp.dat라는 악성코드를 실행

 

 3) EP부터 트레이스 하면 처음 PUSHAD를 통해서 현재 레지스트리 상태를 모두 저장하고 다음과 같은 일련의 과정을 거쳐서 kernel32.dll의 주소를 얻어온다.

   (ㄱ)  0101E258   .  64:8B1D 30000>MOV     EBX, DWORD PTR FS:[30]

    //PEB 주소값

    0101E25F   .  8B43 0C       MOV     EAX, DWORD PTR DS:[EBX+C]

    // Ptr32 _PEB_LDR_DATA 주소값

    0101E262   .  8B40 14       MOV     EAX, DWORD PTR DS:[EAX+14]

    // InMemoryOrderModuleList 의 주소값

    0101E265   .  8B00          MOV     EAX, DWORD PTR DS:[EAX]

    // 첫번째 LIST : 181F20

    0101E267   .  8B00          MOV     EAX, DWORD PTR DS:[EAX]

    // 두번째 LIST : 181FC8

    0101E269   .  8B40 10       MOV     EAX, DWORD PTR DS:[EAX+10]

    // 두번째 LIST : 181FC8 + 0x10 = kernel32.dll의 베이스 주소

 

(ㄴ)  FS:[0x30] Pointer to PEB

(ㄷ)  PEB : 0x00c Ldr              : Ptr32 _PEB_LDR_DATA

(ㄹ)  +0x00c Ldr              : Ptr32 _PEB_LDR_DATA

      +0x000 Length           : Uint4B

      +0x004 Initialized      : UChar

      +0x008 SsHandle         : Ptr32 Void

      +0x00c InLoadOrderModuleList : _LIST_ENTRY //메모리에 로드된 모듈순서



+0x000 Flink            : Ptr32 _LIST_ENTRY

+0x004 Blink            : Ptr32 _LIST_ENTRY

+0x014 InMemoryOrderModuleList : _LIST_ENTRY// 메모리에 위치한 모듈 순서

       +0x000 Flink            : Ptr32 _LIST_ENTRY

       +0x004 Blink            : Ptr32 _LIST_ENTRY

  +0x01c InInitializationOrderModuleList : _LIST_ENTRY //초기화된 모듈 순서

            +0x000 Flink            : Ptr32 _LIST_ENTRY

  +0x004 Blink            : Ptr32 _LIST_ENTRY

  +0x024 EntryInProgress  : Ptr32 Void

 

(ㅁ)보통, 검색을 하면 InInitializationOrderModuleList->Flink ntdll.dll, 
한번 더 InInitializationOrderModuleList->Flink를 하면 kernel32.dll이 나오게 된다는 내용이 많지만,

현재 악성코드는 InMemoryOrderModuleList를 이용해서 kernel32.dll의 주소를 얻었다.

                   InMemoryOrderModuleList   _LIST_ENTRY 가 가르키는 구조체

 


4)해당 악성코드는 kernel32.dll의 익스포트주소를 하드코딩해서 사용하는데 해당 주소가 지금 현재 사용하는 윈도우 버전과 맞지 않기 때문에 수동으로 찾아서 입력해 줘야 한다.

잘못된 익스포트 함수 주소를 참조(EAX 수정 9A81 -> 9AE1)

악성코드는 7C809a81을 참조하지만 현재 kernel32.dll VirtualAlloc 7C809AE1이므로 해당 값(EAX)을 수정해 주면 계속적으로 트레이스가 가능하다.

해당 CALL(0x0101E282)을 트레이스하면 메모리를 할당하고 그 위치인 0x00850000 번지를 리턴 받게 된다.

 

5)hlp.dat 파일을 Open 후 ReadFile로 파일의 내용을 할당 받은 공간에 저장 후에 RETN주소를 스택에저장하고 RETN 한다 따라서 hlp.dat는 PE구조가 아닌 바이너리라고 볼 수 있다.

          RETN 명령으로 hlp.dat가 할당된 곳으로 점프

 이때 악성코드는 원래의 파일을 복구시켜주기 위해서 다음과 같은 레지스트리를 사용하여 hlp.dat 로 넘어갈 때 함께 가지고 간다.

     ESI – 복원될 위치 

     EDI – 원본 코드의 위치

     ECX – 복원할 코드의 사이즈



6) hlp.dat가 Patched된 정상파일의 원복 기능을 수행할 것으로 추측된다.


7)winlogon.exe란 삭제 하는 개념이 아닌 치료하는 개념으로 접근 해야한다.


반응형
Comments