본문 바로가기
정보보안/Malware

[Reversing] 윈도우 커널 모드와 사용자 모드

by Murl0c 2021. 6. 1.
반응형

커널 모드와 사용자 모드

윈도우는 두 가지의 프로세서 권한 수준을 이용하는데, 커널 모드와 사용자 모드를 사용한다. 커널 모드에서 동작하는 운영체제와 하드웨어 드라이버를 제외하면 거의 모든 코드는 사용자 모드에서 동작한다. 사용자 모드에서 각 프로세스는 개별 메모리, 보안 권한과 자원을 소유하고 있다. 사용자 모드 프로그램이 유효하지 않은 명령이나 종료를 수행하면 윈도우는 프로그램의 모든 자원을 반환하고 종료시킨다.

사용자 모드에서 하드웨어 조작이나 커널 내의 상태를 변경하려면 윈도우 API를 사용해야 한다. 커널 구조를 변경하는 윈도우 API 함수를 호출할 때 커널로 호출을 하게 된다. 디스어셈블리에서 SYSENTER, SYSCALL, INT 0x2E 명령어가 보이면 커널 호출이 진행 중이라는 의미다. 사용자 모드에서 커널 모드로 직접 점프가 불가능하므로 이 명령어는 커널에서 동작하는 사전 정의 함수가 있는 검색 테이블을 이용한다.

커널에서 실행 중인 모든 프로세스는 자원과 메모리를 공유 하고 보안 확인을 덜 한다. 커널에서 동작하는 코드가 유효하지 않은 명령를 실행한다면 운영체제는 실행을 중단하고 블루 스크린을 출력한다.

안티바이러스 소프트웨어나 방화벽 같은 대다수의 보안 프로그램은 커널 모드에서 동작해 시스템에서 동작 중인 모든 애플리케이션 행위에 접근할 수 있다. 커널 모드에서 실행되는 악성코드는 보안 프로그램을 방해하거나 방화벽을 우회하기 더욱 용이하다. 운영체제의 감사 기능이 커널에 적용되지 않으며 이런 이유로 거의 모든 루트킷은 커널에서 동작하는 코드를 사용한다.

커널 코드는 개발과 디버깅 동안 시스템을 크래시하는 경우가 많기 때문에 개발이 어렵기 때문에 정교한 악성코드만이 커널에서 동작한다.

 

출처 : https://docs.microsoft.com/ko-kr/windows-hardware/drivers/gettingstarted/user-mode-and-kernel-mode

네이티브 API

네이티브(Native) API는 악성코드 제작자 사이에서 흔히 이용하는 하위 수준의 윈도우 상호작용 인터페이스다. 네이티브 API에서 함수를 호출해 일반 윈도우 API를 우회한다. 마이크로소프트는 사용자 애플리케이션이 필요한 기능을 수행하기 위한 다단계 프로세스를 고안했다.

사용자 애플리케이션

↓ 보안 프로그램

Kernel32.dll

Ntdll.dll

↓ 사용자 모드

……………………………………………………

↓ 커널 모드

Ntoskrnl.exe

커널 데이터 구조

 

사용자 애플리케이션은 kernel32.dll과 사용자 공간과 커널 사이의 상호작용을 관리하는 특별한 DLL인 ntdll.dll을 호출하는 다른 DLL 같은 사용자 API에 접근할 수 있다. 프로세서는 커널 모드로 전환해 커널 내의 함수를 실행하게 되는데, 보통 ntoskrnl.exe에 위치한다. 커널과 사용자 API 사의 분리를 통해 기존 애플리케이션에 영향을 주지 않고 커널을 변경할 수 있게 한다.

ntdll 함수는 커널에서 사용한 것과 같이 API와 구조체를 사용한다. 이 함수는 네이티브 API를 구성한다. 네이티브 API를 직접 호출하면 때로 활동을 은닉할 수 있다. 위의 그림과 같이 보안 프로그램을 우회하기 위해 가상의 악성코드가 네이티브 API(ntdll)에 직접 접근한다. 윈도우 함수 ReadFile과 WriteFile을 호출하는 대신 악성코드는 NtReadFile과 NtWriteFile 함수를 호출한다. 이 함수는 ntdll.dll에 있고 어설픈 보안 프로그램은 감시하지 않는다.

시스템, 프로세스, 스레드, 핸들, 기타 항목에 관한 정보 수집에 사용하는 일련의 네이티브 API 호출이 있다. 이는 NtQuerySystemInformation, NtQueryInformationProcess, NtQueryInformationThread, NtQueryInformationFile, NtQueryInformationKey를 포함한다. 이 호출은 Win32 호출보다 훨씬 더 세부적인 정보를 제공하며, 일부는 파일, 프로세스, 스레드 등과 같은 아주 세부적인 항목도 설정할 수 있게 해준다.

악성코드 제작자가 즐겨 사용하는 또 다른 네이티브 API 함수는 NtContinue다. 이 함수는 예외 처리 반환에 사용하는데, 예외 처리 후 프로그램의 메인 스레드로 돌아옴을 의미한다. 하지만 돌아오는 위치는 예외 처리 문맥에 명시돼 있으며, 변경할 수 있다. 악성코드는 이 함수를 이용해 분석가를 혼란시키고 프로그램 디버깅을 더 어렵게 할 목적으로 복잡한 방식으로 실행을 변경한다.

*ntdll.dll의 익스포트 테이블의 일부 인스턴스의 경우 동일한 함수가 Nt 접두사 또는 Zw 접두사를 가질 수 있다. 이 함수는 동일한 방식으로 동작하고 보통 정확히 동일한 코드를 호출한다.

네이티브 애플리케이션은 Win32 서브시스템을 사용하지 않고 네이티브 API만을 호출하는 애플리케이션이다. 이런 애플리케이션은 악성코드에서는 드물지만 악의적이지 않은 소프트웨어는 거의 없다는 점을 감안할 때 네이티브 애플리케이션은 악의적일 가능성이 높다. 프로그램이 네티이브 애플리케이션이라면 PE 헤더에서 서브시스템을 보고 알 수 있다.

 

아래 위키백과 참조 시 더 많은 정보를 확인할 수 있다.

https://ko.wikipedia.org/wiki/%EB%84%A4%EC%9D%B4%ED%8B%B0%EB%B8%8C_API

반응형