Ring 0, 커널 레벨에서의 루트킷

오랜만에 찾아 뵙습니다. 그동안 두 개의 프로젝트를 수행하면서 중간고사도 치르고 하느라 한 달이 훌쩍 지나가버렸네요. 그러는동안 블로그에도 소원해졌구요. 친구가 블로그가 너무 조용하다고 핀잔을 줄 정도였습니다. 하하하 ^^;

제가 그동안 참여한 프로젝트 중의 하나가 루트킷 탐지 프로그램을 만드는 것이었습니다. 세 개의 팀을 나누어서 각각 유저 레벨, 커널 레벨, MBR의 루트킷을 공부했지요. 제가 맡은 부분은 커널 레벨에서의 루트킷, 그 중의 SSDT 후킹과 탐지였습니다.

시간이 촉박해서 문서화를 대충 했기 때문에 새로 작성해야 할 것 같은데, 이 곳에다 차근차근 올려볼려구요. 우선, 커널 레벨에서의 루트킷에 대해 아주 살짝 정말로 아주 살짝 살펴 보겠습니다.

사용자 삽입 이미지[그림 1] Rootkit and Scanner in Ring 0

[그림 1]처럼 커널 레벨에서의 루트킷은 스캐너와 같은 레벨에서 실행됩니다. 유저 레벨에서의 루트킷이 커널 레벨에서 동작하는 스캐너에 의해 쉽게 탐지되는 반면, 이 커널 레벨에서의루트킷이야말로 스캐너의 천적이라고 할 수 있습니다. 이 곳에서는 루트킷과 스캐너는 누가 먼저 자리를 잡느냐에 따라 승패가 결정되기 때문이죠. 왜냐하면 스캐너 역시 커널 레벨에서 같은 방법으로 루트킷을 찾기 때문입니다.

커널 레벨에서의 루트킷의 또 하나의 장점은 시스템에 전역적으로 후킹이 가능하다는 점입니다. 윈도우즈에서 동작하는 프로그램들은
Native API를 사용하는데, 커널 레벨에서 이 Native API로의 입구를 내가 만든 함수로 바꾸어 버린다면 그 API로
접근하려던 프로그램들에 대해 조작을 할 수 있기 때문이죠. 루트킷의 기본 기능인 은닉 또한 마찬가지로 가능합니다.

사용자 삽입 이미지[그림 2] V3 Lite hooks functions in kernel, too.

반대로 스캐너 역시 커널 레벨에서 전역적인 후킹을 하여 악성 코드를 탐지합니다. [그림 2]가 이 사실을 보여주죠. 중국의 한 천재(세상에는 똑똑한 사람이 너무 많아요 ㅜㅜ)가 만든 IceSword 라는 루트킷 탐지툴입니다. 이 툴로 검사해보면 안랩의 백신인 V3 Lite 역시 시스템을 후킹한 것을 확인할 수 있습니다. V3 Lite는 아래와 같이 13개의 시스템 함수들을 후킹하고 있습니다.

  • 0x19 NtClose
  • 0x29 NtCreateKey
  • 0x3F NtDeleteKey
  • 0x41 NtDeleteValueKey
  • 0x47 NtEnumerateKey
  • 0x49 NtEnumerateValueKey
  • 0x4F NtFlushKey
  • 0x62 NtLoadKey
  • 0x77 NtOpenKey
  • 0xA0 NtQueryKey
  • 0xB1 NtQueryValueKey
  • 0xF7 NtSetValueKey
  • 0x107 NtUnloadKey

이 키들 중에서 하나만 어떤 기능을 하는지 보죠.

NTSTATUS 
ZwOpenKey(OUT PHANDLE  KeyHandle,
     IN ACCESS_MASK  DesiredAccess,  
     IN POBJECT_ATTRIBUTES  ObjectAttributes);
NtOpenKey()에 접근하기 위해서는 ZwOpenKey()를 거쳐야 합니다. Nt로 시작하는 함수가 커널 레벨의 시스템 함수들이고, Zw로 시작하는 함수가 유저 레벨에서 커널 레벨로 통하는 길목입니다. 이 함수는 존재하는 레지스트리 키를 열어보는 기능을 합니다. V3 Lite는 대체적으로 레지스트리와 관련된 시스템 함수들을 후킹하는군요.

이 함수들로 가는 입구를 자신의 어떤 함수로 바꾼 다음 V3 Lite는 어떤 작업을 할 것입니다. 만약 악성코드가 이 시스템 함수를 거쳐야 한다면, 반드시 V3 Lite에게 그 사실이 알려지겠지요. 왜냐하면 그 길목을 V3 Lite가 떡 하고 감시하고 있을테니까요.

루트킷도 이런 방식을 사용합니다. 스캐너와는 반대의 입장에서 감시하고 작업을 수행한다는 것이 다를 뿐이죠.

참고문헌

ZwOpenKey Function :: http://msdn.microsoft.com/en-us/library/ms804360.aspx

Similar Posts

  • DEFCON 2009 :: Binary L33tness 100, EDB로 풀어보자.

    지난 6~8일에 있었던 데프콘 CTF 예선 문제입니다. 위 그림처럼 실행하면 암호를 묻고 틀린다면, 욕을 하는 기분 나쁜 녀석입니다. 기분도 나빠졌으니 까짓꺼 한 번 깨줘야겠죠? 준비 사항 리눅스 계열의 OS. libnet1 패키지 Evans Debugger 이 파일은 ELF 포맷으로 되어 있습니다. ELF란 유닉스, 리눅스 등의 실행 파일의 구조인데 ,이에 대해 설명하려면 끝이 없으니 자세한 내용을 알고 싶으시면…

  • IsDebuggerPresent 그리고 패치

    Anti-Reversing 기법 중에서 가장 기초적인 방법은 IsDebuggerPresent[^1] 함수를 사용하는 것입니다. IsDebuggerPresent 함수는 호출된 프로세스가 유저 모드 디버거에 의해 호출되었는지를 확인하는 Windows API입니다. windows.h 헤더파일을 인클루드하면 바로 호출할 수 있고, Windows 2000부터 지원된다고 MSDN에 설명되어 있습니다. 함수 원형은 아래와 같습니다. 파라미터는 필요 없고, 현재 프로세스가 유저 모드 디버거에 의해 호출된 것이면 0이 아닌 값을 반환합니다. 그런데…

  • Windows Debugging Intrenals: A to Z

    Articles에 문서를 업데이트 했습니다. Windows 의 내부 매커니즘이 어떻게 유저 모드 디버깅을 제공하는지에 대하여 설명한 Alex Ionescu 의 3부작 시리즈를 번역하였습니다. Alex Ionescu 는 ReactOS 의 커널 개발자이면서 『Windows Internals』 의 저자입니다. 이 문서는 Dbgk 라는 NT 커널(ntoskrnl)의 객체와 디버그 이벤트를 주고받는 방법에 대해서 Win32 (kernel32) 관점부터 DbgUi 객체와 NT 시스템 라이브러리(ntdll)까지 설명합니다. 문서를 이해하기…

  • SPYKIDS OWNZ YOUR SYSTEM, 제로보드4 속수무책으로 당하다.

    Zone-h.kr에서는 국내의 해킹된 사이트를 알려줍니다. 그런데 오늘따라 유난히 많은 사이트들이 해킹되었습니다. 최근에 잠잠하던 거랑 비교해서 이례적인데요. 현재 시각 11시 6분… 22개의 해킹된 사이트 중 20개의 사이트가 브라질의 SPYKIDS라는 팀에 의해 해킹되었습니다. 이들 사이트는 제로보드4를 사용중입니다. 아무래도 SPYKIDS 팀은 제로보드4를 집중적으로 노린 것 같네요. 이미 예전부터 제로보드4는 보안상 취약점이 많은 것으로 알려졌는데 아직 많은 사이트들이 이…

  • HackThisSite Realistic :: Chicago American Nazi Party

    문제 :: http://www.hackthissite.org/playlevel/2/ 올린사람 : DestroyFascism 메시지 : 난 당신이 매우 감탄할 만한 해킹 기술을 지녔다고 알고 있어요. 음, 이 인종차별 모임은 무식한 인종차별 사생아의 대중 집회를 운영하기 위해 웹사이트를 사용하고 있습니다. 우리는 그런 안하무인격의 일이 일어나는 것을 용납할 수 없습니다. 만약 당신이 그들의 관리자 페이지에 접근하여 메인 페이지에 메시지를 남길 수 있다면, 우리는 영원히…

0 Comments

  1. 아니 내가 윈도우를 잘 몰라 ㅠㅠ
    특히 운영체제가 어케 돌아가는지는 거의 몰라 ㅎㅎ;;
    걍 리눅스랑 비슷하지 않을까 라고 추측만 할뿐 ㅎㄷㄷ;;

답글 남기기

이메일 주소는 공개되지 않습니다. 필수 필드는 *로 표시됩니다