본문 바로가기

전체 글95

3장. 하드웨어 레벨의 지식 - 링 제로 (Ring Zero) 인텔 x86 계열의 마이크로 프로세서는 접근 제얼르 위해서 링(Ring)이라는 개념을 사용한다. 링은 링 0(Ring Zero)부터 링 3까지 총 네 가지 레벨이 있으며, 링 0가 가장 권한이 높고 링 3가 가장 권한이 낮은 것을 의미한다. 내부적으로 각각의 링은 숫자로 저장된다. 실제로 마이크로 칩에 물리적인 링이 존재하는 것은 아니다. 윈도우 운영체제의 모든 커널 코드는 링 0로 동작한다. 따라서 커널 안에서 동작하는 루트킷 또한 링 0로 동작하는 것이다. 커널 안에서 동작하지 않는 유저 모드 프로그램들은 링 3 프로그램이라고 부른다. 윈도우와 리눅스를 포함해서 많은 운영체제들이 링 1, 2는 이용하지 않고 링 0과 링 3만을 이용한다. (윈도우 아키텍처에서는 링 1, 2를 사용하지 않는다.) 링 0.. 2014. 1. 17.
2장. 커널 조작 - 재부팅시 자동 시작 루트킷 드라이버는 시스템이 부팅되는 시점에 로드되어야 한다. 이 문제에 대해 곰곰이 생각해 보면, 시스템이 부팅되는 시점에 로드되는 소프트웨어가 상당히 다양하고 많다는 사실을 깨닫게 될 것이다. 다음은 시스템에 부팅되는 시점에 루트킷을 로드할 수 있는 다양한 방법이다. Run 키를 이용 (오래된 신뢰할 수 있는 방법) Run 키를 이용하면 임의의 프로그램을 부팅 시점에 실행시킬 수 있다. Run 키에 의해 실행된 프로그램은 자신에게 삽입된 루트킷 파일을 생성해서 그것을 로드한다. 로드된 루트킷은 탐지되지 않기 위해 자신을 위한 Run 키의 값을 감출 수 있다. 모든 바이러스 스캐너는 Run 키를 검사하기 때문에 이 방법은 상당히 위험한 방법이다. 하지만 루트킷이 일단 로드되면 키 값은 보이지 않게 된다... 2014. 1. 15.
2장. 커널 조작 - 파일 핸들 생성 및 심볼릭 링크 추가 파일 핸들 생성 유저 모드 프로그램이 커널 드라이버를 사용하려면 유저 모드 프로그램은 해당 드라이버의 핸들을 구해야 한다. 이것은 드라이버가 이름 있는 디바이스로서 등록된 경우에만 가능하다. 일단 드라이버가 이름 있는 디바이스로 등록했다면 유저 모드 프로그램은 파일의 경우와 동일한 방법으로 디바이스 이름을 이용해 핸들을 수할 수 있다. 이는 유닉스에서 모든 것이 파일로 취급되는 것과 상당히 유사하다. 다음은 커널 모드 드라이버가 디바이스를 등록하는 과정을 보여주고 있다. const WCHAR deviceNameBuffer[] = L"\\Device\\MyDevice"; PDEVICE_OBJECT g_RootkitDevice;// 디바이스 오브젝트에 대한 전역 포인터 변수 NTSTATUS DriverEnt.. 2014. 1. 10.
2장. 커널 조작 - 디바이스 드라이버 기본 개념 루트킷은 유저 모드(User Mode)와 커널 모드(Kernel Mode) 요소를 모두 쉽게 포함할 수 있다. 유저 모드에서는 네트워킹, 원격 제어와 같은 대부분의 기능을 담당하고, 커널 모드에서는 은닉 기능과 하드웨어 접근에 관련된 기능을 담당한다. 대부분의 루트킷은 커널 레벨에서의 조작을 필요로 한다. 유저모드와 커널모드 요소를 모두 포함하고 있는 루트킷 유저 모드 프로그램은 커널 레벨 드라이버와 다양한 방법으로 서로 통신할 수 있다. 그 중에서 가장 일반적인 방법이 I/O Control(IOCTL) 명령을 이용하는 것이다. IOCTL 명령은 유저 애플리케이션과 커널 드라이버간의 통신을 위해서 프로그래머가 정의하는 명령이다. 유저 모드와 커널 모드 요소를 모두 포함하는 루트킷을 만들기 위해서는 이후에.. 2014. 1. 10.