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

  • HackThisSite Realistic :: Fischer’s Animal Products

    문제 :: http://www.hackthissite.org/playlevel/4/ 올린사람 : SaveTheWhales 헬로우. 컴퓨터와 웹사이트를 해킹하는 방법을 알아보다가 친구로부터 당신을 소개받았어요. 당신이 저를 도와줄 지 궁금한데요. 단지 재킷과 지갑 등을 팔기 위해 하루에 수 백만 마리의 동물을 죽이는 가게가 있거든요. 그 웹사이트에 찾아가봤는데 그들은 고객의 이메일 리스트를 가지고 있는 것 같아요. 당신이 해킹을 해서 그 이메일 리스트를 제게 보내줄 수 있나요?…

  • 까막눈의 보안소식. 2010년 7월 5주차

    Security researcher demonstrates ATM hacking http://news.cnet.com/8301-1009_3-20012019-83.html 올해 Blackhat USA 에서 대박 발표가 있었다고 합니다. Barnaby Jack 의 “Jackpotting Automated Teller Machines Redux” 라는 제목의 발표죠. 이미 소식 빠른 분들은 다들 아시죠? 원래 작년 Blackhat 에서 발표하려다가 올해까지 연기된 발표입니다. 전세계적으로 많이 쓰이는 ATM 이 보안상 얼마나 취약한지를 보여준 발표였는데, ATM 에서 돈이 인출되는 시연까지 보여주었네요….

  • PADOCON 2010 hand-ray 리버싱 풀이 2nd

    이번에는 두 번째 문제입니다. 이전 문제와 달리 약간의 프로그래밍 경험과 리버싱 경험이 필요했었구요. 핸드레이 리버싱인 만큼 컴퓨터를 비롯한 전자식 도구를 사용하지 않고 손(필기)으로 풀이하는 게 이 문제를 즐기는 포인트입니다. 한 마디로 요약하면, “삽질”을 해야 한다는 얘기죠? 문제 다음 프로그램에서 입력값이 j3m4I7w:_oYu?yjue 일때 출력값은 무엇인가? 일부로 주석을 지웠는지 모르겠지만, 같이 풀던 후배가 살짝 당황했던 문제입니다. 이…

  • OllyDbg로 쉽게 디버깅하기 – Back to User 모드

    OllyDbg는 Back to User 모드라는 기능을 지원하고 있습니다. 소스가 만 줄짜리인 프로그램을 처음부터 끝까지 맨땅에 헤딩하듯이 분석하기란 너무나 고달프기에, 이 Back to User 모드를 사용합니다. 이 기능을 사용하면 처음부터 분석할 필요 없이 디버깅을 하고 싶은 부분만 쉽게 찾아갈 수 있습니다. Back to User 모드 예를 들여서 설명하죠. Lenas Reversing for Newbies 강좌의 4번 째 문제…

  • Brute Forcing with DLL Injection

    Articles에 문서를 업데이트 했습니다. 작년 10월, 2009 하반기 KUCIS 영남권 정보보호 세미나에서 발표했던 주제입니다. DLL Injection 기법을 이용한 무차별 대입 공격으로 패스워드를 찾아 보았습니다. 소스를 포함하여 문서를 정리할까 했는데, 악용될 소지가 있어서 발표했던 자료만 공개합니다. 당시에 발표했던 내용보다 조금 보완된 부분이 있습니다. 3개월째인 오늘까지도 이 방법을 어디에 써 먹을 수 있을지 못 찾고 있습니다. 간혹…

  • IsDebuggerPresent 그리고 패치

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

0 Comments

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

답글 남기기

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