Be myself :: 5. 보호

달력

32024  이전 다음

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31

5. 보호

컴퓨터구조&OS/OS 2014. 5. 5. 21:23

1 개요

CPU는 때때로 커널과 함께 명령어들을 체크해 문제가 일어나지 않도록 검사한다. 합당한 명령어만 실행시키고 그렇지 않으면 커널이나 유저프로그램 자신이 이 에러를 다시 조정하도록 한다. 이 때, 체크하는 것으로는 다음과 같은 것이 있다.
1.프로그램 또는 프로세스가 세그먼트 외의 메모리 위치를 지정하지 못하게 하는 Limit Check
2.읽기, 쓰기 등의 속성에 맞게 접근되었는지 확인하는 type검사
3.접근 가능한 곳에 접근하는지 확인하는 특권레벨 체크,
4.명령어 세트 체크

위의 4가지를 검사하는데, 우리는 특권레벨과 관련된 내용을 공부할 것이다.

2 특권레벨

특권레벨과 관련된 용어를 설명하고, 특권레벨이 낮은 계층에서 레벨이 높은 계층으로 접근하는 방법들과 그 때의 스택의 변화를 알아볼 것이다.

2-1 용어 설명

-CPL(Current Privilege Level)
: CPL은 현재 실행되고 있는 특권레벨이다. CS, SS셀렉터 레지스터의 0,1번째 비트에 있는 수이다.

-DPL(Description Privilege Level)
: 디스크립터에 기재된 DPL값이고 2비트로 표현된다. 디스크립터를 통한 세그먼트 영역으로의 모든 접근에서 항상 CPL과 DPL의 관계가 체크된다.

-RPL(Requested Privilege Level)
: 콜게이트(낮은 특권레벨에서 높은 특권레벨의 루틴을 사용할 수 있게 하는 관문)를 통해 레벨이 낮은 프로세스가 높은 프로세스에 접근하는 일이 생기는데, 이를 악용할 소지를 없애기 위해 어느 레벨에서 요청했는지 적어놓는 역할을 한다.

-콜게이트
: 다른 세그먼트 디스크립터와 함께 GDT테이블에 디스크립터로써 포함되며, 또 하나의 세그먼트 정의라 셍각하여도 좋다. 유저 프로그램은 코드 셀렉터의 사용법과 마찬가지로 이 디스크립터를 셀렉터로 설정하여 Jmp나 Call명령을 내린다.

<콜게이트 디스크립터>

 

2-2 특권계층 변경

특권계층이 변경되는 상황을 알아 보겠다.
예외가 발생했을 때. (0으로 나눈다던지, Limit크기를 넘어 가는 접근을 한다던지 등)
하드웨어 인터럽트가 발생 했을 때
소프트웨어 인터럽트가 발생 했을 때(int 0x80 명령어로 트랩 게이트이용)
콜게이트 이용—Jmp, Call

이 중, 1번과 2번은 프로그래머의 의지와는 상관 없이 레벨변경이 일어나는 상황이므로, 우리가 관심을 가져야 할 부분은 3번과 4번이다. 3번의 경우, eax, ebx, ecx등의 레지스터를 이용해 인수를 정하고, int 0x80명령어로 인터럽트하는 수순으로 이루어 진다. 보통 셸코드 작성시 많이 사용하는 방법이다.

콜게이트를 이용해 계층을 변경하는 방식으론 Jmp와 Call이 있는데 원칙적으론, Jmp명령을 사용하여 계층변경은 불가능하지만 콜게이트를 이용해 가능하게 된 것이고, Call 명령은 낮은 특권계층에서 높은 특권계층으로의 접근을, RET는 높은 계층에서 낮은 계층으로의 전환을 담당한다.

Call 명령을 통해 계층변환이 이루어 지는 방식은 레벨3에서 call 명령으로 레벨0 루틴을 불러 내면 CS셀렉터의 0,1의 비트에 00 이 들어가고, 이때의 CPL은 0이다. 루틴이 끝난 후 RET로 레벨3으로 돌아가게 되는데 이때는 CS셀렉터의 0,1비트에 11(십진수 3)이 들어가고 CPL은 3이된다.

 

2-3 특권레벨 변동시 스택의 변화

일단 설명을 먼저 한 후 그림을 통해 정리하드록 하겠다.

<Call 명령이 내려졌을 때>

CPU는 이 태스크의 TSS영역에 있는 SS0와 ESP0값을 참조하여 커널모드 스택에 현재 유저태스크가 사용하고 있는 SS,ESP,CS,EIP를 차례로 PUSH한다. 그리고 SS와 ESP레지스터에 SS0와 ESP0의 값을 넣는다
콜게이트에 지정된 커널모드의 루틴주소로 점프하고 실행
RET명령시 스택에 저장된 EIP, ESP등을 pop하여 원레 레지스터 값으로 복원한다.
*인자가 있을 시 콜게이트 디스크립터에 입력된 인자의 갯수 만큼을 준수한다.

<인터럽트 예외가 발생 했을 때>

이 때는 EFLAGS가 ESP와 CS사이에 추가된 것만 빼면 콜게이트와 다를 것이 없다. 단지 특권계층 0 에서 인터럽트가 발생하면 ESP와 SS는 PUSH될 필요가 없다는 것만 주의하면 된다.

'컴퓨터구조&OS > OS' 카테고리의 다른 글

7. 페이징  (0) 2014.05.05
6. 유저모드 Task switching  (0) 2014.05.05
4. Task switching  (0) 2014.05.05
3. 인터럽트 처리  (0) 2014.05.05
2. Protected 모드로의 전환  (0) 2014.05.05
Posted by flack3r
|