'OS'에 해당되는 글 9건

  1. 2012.11.15 Copy On Write
  2. 2012.08.26 Stack frame
  3. 2012.08.20 setuid & setgid & sticky bit
  4. 2012.08.18 CPU register
OS/Concept2012. 11. 15. 21:34

Copy On Write



OS는 각 process 별로 가상 주소 공간을 할당합니다.

Task switching을 할 때 OS는 memory의 코드들을 바꿉니다.

Process들은 dll과 같이 서로 같은 코드가 올라가있는 영역이 있습니다.


중복된 코드들을 복사하는 것은 CPU의 자원을 낭비하도록 만듭니다.

그래서 kernel32.dll과 같이 대부분의 process가 공통적으로 사용하는 코드가 들어있는 영역은

Task switching 할 때 복사하지 않고 그대로 남겨둡니다.


그렇다면 kernel32.dll의 코드를 patch하면 다른 process에게도 영향을 미칠 수 있으리라 예상됩니다.

kernel32.dll에 patch를 해보겠습니다.

kernel32.dll 영역에 아무 공간이나 잡고 patch합니다.

patch한 곳의 주소값을 기억하셔야 합니다.


위에서 설명한 논리대로 작동한다면

이제 다른 process에서 해당 주소를 찾아가면 patch된 코드가 있어야 합니다.


다른 process에서 해당 주소를 찾아가 봅니다.


0x90으로 차 있습니다.

분명 kernel32.dll은 수많은 process에서 사용하고

Task switching 할 때 swapping을 하지 않는 공간입니다.

그런데도 다른 process에서의 patch가 적용되지 않았습니다.


이는 Copy On Write라는 기술 때문에 그렇습니다.

Copy on write는 swapping을 하지 않는 공간에 write event가 발생한 경우

Write event가 건드린 영역만 따로 swapping 하는 기술입니다.


Process A에서 특정 library 영역에 write event가 발생합니다.


OS에서는 write event가 발생한 영역만 따로 page로 복사해둡니다.

그리고 process A가 실행 될 때만 저장해둔 page를 swap-in 합니다.

Process A가 아닌 다른 process가 실행 될 때는 해당 page를 swap-out 합니다.


'OS > Concept' 카테고리의 다른 글

Stack frame  (0) 2012.08.26
CPU register  (0) 2012.08.18
Little endian  (0) 2012.08.16
Stack에 변수가 저장되는 방식  (0) 2012.08.16
Posted by slimV
OS/Concept2012. 8. 26. 15:50

Stack frame



Stack에서 주로 사용되는 세 개의 레지스터로는 EBP, ESP, EIP가 있습니다.

EBP는 Stack frame의 시작점을 가리키고

ESP는 Stack의 TOP을 가리키고

EIP는 다음에 실행할 명령의 offset을 가지고 있습니다.


다음 그림은 시스템에서 프로그램이 실행되고 함수가 호출될 때 stack의 변화를 나타낸 그림입니다.

main()이 실행되는 중에 func1()을 호출하면 func1()에게 stack을 할당합니다.

이때 func1의 실행이 끝나면 다시 main()으로 돌아와야 합니다.

그러기 위해 Return address를 stack에 넣어둡니다.

같은 방식으로 func1()에서 func2()를 호출합니다.


위와 같은 상황에서 Stack frame은 호출된 함수가 실행되는 동안

호출한 함수의 지역변수나 실행에 필요한 정보가 손실되지 않도록 stack에 저장하는 구조를 의미합니다.


Stack frame에 저장하는 정보는 다음과 같습니다.

- 함수의 실행이 종료된 후에 return 할 주소

- 지역 변수

- 자신을 호출한 함수의 Stack frame 위치

- Register와 같은 기계 상태

- 예외 처리 리스트 등


'OS > Concept' 카테고리의 다른 글

Copy On Write  (0) 2012.11.15
CPU register  (0) 2012.08.18
Little endian  (0) 2012.08.16
Stack에 변수가 저장되는 방식  (0) 2012.08.16
Posted by slimV
OS/Linux2012. 8. 20. 13:04

Linux에 존재하는 특별한 Permission에 대해 배워보겠습니다.

Linux에서 파일 및 디렉토리 목록을 보면 rwxrwxr--와 같이 permission 설정이 보입니다.

r은 읽기, w는 쓰기, x는 실행 권한을 뜻합니다.


위의 사진에서 gremlin에는 특이하게도 s가 붙어있습니다.

s는 setuid의 Symbolic입니다.


setuid가 설정된 파일을 실행하는 동안 잠깐 설정된 permission을 빌려올 수 있습니다.

실행이 종료된 후에는 다시 원래의 permission으로 돌아오게 됩니다.

setuid는 실행되는 파일의 소유자의 permission을 잠깐 가져오는 것이고

setgid는 실행되는 파일의 소유그룹의 permission을 잠깐 가져오는 것입니다.


위의 permission 외에도 sticky-bit라는 특별한 permission도 존재합니다.

이는 other의 쓰기 권한에 대한 특별한 permission입니다.

Symblolic은 t 입니다.


명령어


chmod [permission] [file path]

4000 : setuid

2000 : setgid

1000 : sticky-bit


'OS > Linux' 카테고리의 다른 글

LD_PRELOAD  (0) 2012.08.18
Symbolic/Hard link  (0) 2012.08.17
i-node  (0) 2012.08.17
Posted by slimV
OS/Concept2012. 8. 18. 20:25

CPU register



CPU에서 사용되는 Register 종류

▷ General-Purpose Register

▷ Segment Register

▷ EFLAGS Register

▷ EIP Register


General-Purpose Register


논리, 산술 연산에 사용되는 operand나 주소 계산을 위한 operand, memory pointer에 사용됩니다.

▷ EAX (Extended Accumulator Register) : 산술연산, 함수 return 값 저장

▷ EBX (Extended Base Register) : DS Segment의 Data를 가리키는 역할, 주소지정 확대

▷ ECX (Extended Counter Register) : Loop의 반복 횟수, bit shift 수 저장

▷ EDX (Extended Data Register) : 입출력 동작

▷ ESI (Extended Source Register) : Memory 복사에서 출발지 index

▷ EDI (Extended Destination Register) : Memory 복사에서 목적지 index

▷ ESP (Extended Stack Register) : Stack pointer, Stack의 TOP을 가리킴

▷ EBP (Extended Base Register) : Stack 내부의 변수 값을 읽을때 사용, Stack frame의 시작점


Segment Register


Memory에서 segment를 확인하는 pointer입니다.

▷ CS : Code segment의 시작 주소 저장

▷ SS : Stack segment의 시작 주소 저장

▷ DS : Data segment의 시작 주소 저장

▷ ES : 여분의 Data segment용, 문자열 처리 명령시 목적지 data 저장

▷ FS/GS : 여분의 segment용, IA32 프로세서에서만 사용 가능


EFLAGS Register


상태 플래그, 제어 플래그, 시스템 플래그 그룹으로 구성되어 있으며, 1, 3, 5, 15, 22 ~ 31 bit는 예약되어 있습니다.


상태 플래그 (Status Flags)

산술연산(ADD, SUB, MUL, DIV)을 하는 명령의 결과를 가리킵니다.

▷ CF (bit 0) Carry Flag : 부호 없는 정수끼리의 산술연산 후 오버플로우 확인

- 0 : 오버플로우 발생 안한 경우

- 1 : 오버플로우 발생

▷ PF (bit 2) Parity Flag

▷ AF (bit 4) Adjust Flag

▷ ZF (bit 6) Zero Flag : 산술연산 또는 비교동작의 결과 표시

- 0 : 결과가 0 이 아닌 경우

- 1 : 결과가 0 인 경우

▷ SF (bit 7) Sign Flag

▷ OF (bit 11) Overflow Flag : 부호 있는 수 끼리의 산술연산 후 오버플로우 확인

- 0 : 오버플로우 발생 안한 경우

- 1 : 오버플로우 발생 (너무 큰 정수 또는 너무 작은 음수인 경우)


제어 플래그 (Control Flags)

▷ DF (bit 10) Direction Flag


시스템 플래그 (System Flags)

▷ TF (bit 8) Trap Flag

▷ IF (bit 9) Interrupt enable Flag

▷ IOPL (bit 12, 13) I/O Privilege Level field

▷ NT (bit 14) Nested task Flag

▷ RF (bit 16) Resume Flag

▷ VM (bit 17) Virtual-8086 Mode flag

▷ AC (bit 18) Alignment Check flag

▷ VIF (bit 19) Virtual Interrupt Flag

▷ VIP (bit 20) Virtual Interrupt Pending flag

▷ ID (bit 21) Identification flag


EIP Register


현재 프로세서가 실행하고 있는 명령 바로 다음에 실행할 명령어의 offset을 저장합니다.

소프트웨어에 의해 조작될 수 없으며, CALL, JMP, RET와 같은 control-transfer 명령에 의해서만 영향을 받습니다.


'OS > Concept' 카테고리의 다른 글

Copy On Write  (0) 2012.11.15
Stack frame  (0) 2012.08.26
Little endian  (0) 2012.08.16
Stack에 변수가 저장되는 방식  (0) 2012.08.16
Posted by slimV