본문 바로가기

Programming

x86 privilege level

DPL(Descriptor Privilege Level) -> 해당 세그먼트 디스크립터가 가지는 특권레벨(0~3)

CPL(Current Privilege Level) -> CS 세그먼트 디스크립터 상에 있는 DPL 2비트


생각해보니 x86 은 ARM 처럼 CPU 자체나 컨트롤 레지스터에 모드비트같은게 없다.

CR0 에 있는것은 Real/Protected 모드스위치일뿐 특권비트는 아니다.


사실상 커널모드/유저모드는 CPL 에 의해 결정되는데, 생각해보니 이게 결국 메모리에있다.

모든 명령어는 기본적으로 CS 레지스터의 세그먼트 디스크립터에 영향을 받는데

여기서 해당 명령어가 특권모드로 수행되느냐, 유저모드로 수행되느냐가 결정되는 것이다.


그리고 데이터, 스택 등 명령어가 참조하는 나머지 데이터들은 , DS, ES, SS 등의 세그먼트

디스크립터랑 연결된다.  이들 각각도 DPL 을 가지고 있는데 이때, 수행되는 명령의 CS 특권레벨이

참조하는 메모리의 DS, ES, SS 등의 특권레벨보다 낮으면 General Protection fault 가 일어난다.


이게바로  User 권한의 코드가 Kernel 을 건드릴수 없게 하는 원리라고 하는데,

생각해보니 어차피 Paging 에 의해서 Kernel 메모리에 접근할 수가 없다면

이게 의미가 있는건가? -_-;


생각해보니 CPL0 든 CPL3 이든 동일 프로세스는 동일 CR3 레지스터를 가지므로

사실 유저코드상에서 커널메모리를 READ 할때 페이징면에서만 보면 안될게 없다 -_-

따라서 세그먼팅에 의해서 구별을 해야한다.

역시 의미가 있는거였어...


가 아니고 커널메모리 접근은 페이징에 의해서 막힌다(페이지엔트리 플래그에 비트가 있음) 커널메모리 접근이 CPL 에 의해 막히는게 아니라 특권명령의 수행이 CPL 에 의해서 제어되는것이다...


'Programming' 카테고리의 다른 글

shellcodetest.c  (0) 2013.03.19
Windows7 SSDT Hooking  (6) 2013.03.06
OpenSSL Server Example  (0) 2013.02.05
linux/windows SSL client example  (0) 2013.02.04
QEMU Detection  (0) 2013.01.28