'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


• 실습 환경

-> putty로 연결한 레드햇 리눅스 6.2

 

 sample.c 의 어셈블리어 코드 획득하기

putty로 연결한 레드햇 리눅스 커널창에 명령어를 입력합니다.

vi sample.c

 

vi sample.c 를 실행하면 빈화면이 나오는데 aa를 입력하여 INSERT 설정으로 변경 후 아래 코드를 입력합니다.

void main(){
	int c;
    c = function(1, 2);
}

int function(int a, int b){
	char buffer[0]'
    a = a + b;
    return a;
}

입력 한 후 Esc 클릭하고 :wq 를 입력하면 저장후 편집기를 빠져나옵니다.

 

gcc 명령어로 sample.c 파일을 sample.c 파일로 컴파일하고, sample.a 파일을 vi 편집기로 확인합니다.

gcc -S -o sample.a sample.c
vi sample.a

sample.c 파일의 어셈블리 코드입니다.

 

 쉘 기본 코드 분석

1 | pushl %ebp

- 최초의 프레임 포인터(ebp) 값을 스택에 저장

 ebp:스택의 바닥을 가리킴

- ebp 바로 전에는 ret가 저장된다

ret(return address)에는 함수 종료 시 점프할 주소 값을 저장

- ebp는 함수 시작 전의 기준점

- 스택에 저장된 ebp를 SFP(Saved Frame Pointer)라고도 함

2 |  movl %esp, %ebp

3 | subl $4, %esp

- esp에서 4바이트 만큼 뺀다

- 즉, 스택에 4바이트만큼의 용량을 할당

- 이는 int c 를 위한 공간 할당 작업

 

4 ~ 6 | 세 단계는 function(1, 2)에 대한 코드

4 | pushl $2

5 | pushl $1

6 | call function

 

7 | pushl %ebp : 현재 ebp 값을 스택에 저장

 

8 | movl %esp,%ebp

- function(1, 2)의 시작에서도 pushl %ebp 명령과 movl %esp,%ebp이 실행 됨

9 | subl $12,%esp

- char buffer[10]를 위한 공간 할당

- 스택에 12바이트만큼 용량을 할당

- 공간 할당은 4바이트 단위로 작업

10 | movl 12(%ebp), %eax

- ebp에 12바이트를 더한 주소 값의 내용(정수 2)을 eax 값에 복사

 

11 | addl %eax, 8(%ebp)

- ebp에 8바이트를 더한 주소 값의 내용인 정수 1과 eax에 저장되어 있는 정수2를 더한다

 

12 | movl 8(%ebp), %edx

- ebp에 8바이트 더한 주소 값의 내용(정수3)을 edx에 저장

 

13 | movl %edx,%eax

- edx에 저장된 정수 3을 eax로 복사

 

14 | jmp .L2

- L2로 점프

 

15 | leave

- 함수 종료

 

16 | ret

- function 함수를 마치고 function 함수에서 저장된 ebp 값을 제거 main 함수의 원래 ebp 값으로 EBP 레지스터 값 변경

 

17 | addl $8, %esp : esp에 8바이트를 더한다

 

18 | movl %eax, %eax

- eax 값을 eax로 복사(사실상 의미없음)

 

19 | movl %eax, -4(%ebp)

- ebp에서 4바이트를 뺀 주소 값(int c)에 eax 값을 복사

 

20 | leave

 

21 | ret

 

- 시스템을 공격할 때 셸 코드를 스택에 업로드해서 사용하는데, 코드는 스택에서 직접 실행될 수 있도록 기계어로 바꾸어 사용

Redhat 운영체제 설치방법입니다.


Redhat을 사용하기 위해 가상머신인 VMware가 설치 되어 있어야합니다. 블로그에 설치방법 따로 작성 해두었으니 참고바랍니다.

설치방법: https://security-student.tistory.com/32


Redhat

https://drive.google.com/drive/folders/1LwvD_Yp87g-zHVFdGVxBogZKheNHxWb2?usp=sharing 

 

system-redhat - Google Drive

이 폴더에 파일이 없습니다.이 폴더에 파일을 추가하려면 로그인하세요.

drive.google.com

 

 

 

redhat-6.2-i386.iso 클릭합니다.

다운로드 버튼을 클릭하여 redhat-6.2-i386.iso를 다운로드합니다.

 

Redhat 6.2 운영체제 설치

 

Powertools-redhat-6.2-i386.iso 클릭하여 다운로드후 VMware를 실행합니다.

 

Create a New Virtual Machine 클릭합니다.

 

Browse... 버튼을 클릭해 redhat-6.2-i386.iso 경로를 지정하면 Next 버튼이 활성화가 되고 Next 버튼을 클릭합니다.

 

가상 머신의 이름과, 다운로드 경로를 지정 후 Next 버튼을 클릭합니다.

Locarion 부분은 자동 지정되는데 해당 부분을 가렸습니다.

 

Next 클릭합니다.

 

Finish 클릭하면 Redhat이 VMware에서 실행이 됩니다.

 

VMware 화면을 클릭 후 text를 입력합니다. Ctrl + Alt 키보드를 누르면 마우스가 빠져 나옵니다.

 

잠시 기다리면 위 화면이 나타나게 되는데 키보드 Enter를 입력합니다

 

키보드 방향키 → 입력 후 Enter를 입력합니다

 

Enter를 입력합니다

 

Install Server System 설정 후 키보드 방향키 → 입력 후 Enter를 입력합니다.

 

Enter를 입력합니다.

 

키보드 방향키 → 입력 후 Enter를 입력합니다.

 

hostname 입력하고, 키보드 방향키 ↓ 입력 후 Enter를 입력합니다.

 

키보드 방향키 ↓ 입력 후 Enter를 입력합니다.

 

키보드 방향키 → 두 번 입력 후 Enter를 입력합니다.

 

방향기로 Asia/Seoul 를 찾아 방향키 → 입력 후 Enter를 입력합니다.

 

비밀번호 입력 후 ↓ 입력 후 Enter를 입력합니다.

 

아무것도 입력 하지 않아도되니 방향기 ↓로 4번 이동하여 Enter를 입력합니다.

 

입력하고 나면 AMD 계열인 CPU를 사용하는 컴퓨터는 오류가 뜨게 됩니다. (해결방법을 찾지 못했습니다.)

 

인텔 계열인 CPU는 아래와 같은 화면이 나타나게 됩니다.

OK를 클릭합니다.

 

Redhat 다운로드를 진행중 입니다.

 

시스템의 부팅 디스크를 생성하는 물음인데, No 를 클릭합니다.

 

Enter를 클릭하고 기다리면

아래와 같은 화면이 나타나게 됩니다.

 

linux-up 을 입력하여 Enter를 입력하고 잠시 기다리면

아래와 같은 화면이 나타나게 됩니다.

 

root를 입력합니다.

 

초기에 지정한 비밀번호도 입력하면

 

로그인이 성공적으로 되는 것을 확인할 수 있습니다.

 

Redhat을 원격으로 로그인 할 수있는 putty를 설치 하셔야 하며 블로그에 설치방법 따로 작성 해두었으니 참고바랍니다.

설치방법: https://security-student.tistory.com/33

 

새로운 사용자 계정을 생성하기 위해 아래와 같은 명령어를 입력하고, 비밀번호를 설정합니다.

useradd -m 계정명
passwd 계정명

 

putty에서 원격 접속을 하기위해 Redhat에서 ifconifg 명령어를 입력하여 ip를 확인합니다.

 

Rehat의 ip와 Other(Telnet) 설정하고 Opean을 입력합니다.

 

연결된 것을 확인 할 수 있고, 새로 생성한 사용자 계정으로 로그인합니다.

 

성공적으로 연결된 것을 확인할 수 있습니다.

'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


산술 연산 명령: 기본적인 정수 계산

• ADD(Add)

- 제1피연산자와 제2피연산자 값을 더한 결과 값을 제1피 연산자에 저장

형식 ADD [제1피연산자] [제2피연산자]
사용 예 ADD AL 4
AL이 원래 3이었다면, 명령 실행 후 AL은 7이 됨

 

 SUB(Subtract)

- 제1피연산자에서 제2피연산자 값을 뺀 결과 값을 제1피연산자에 저장

형식 SUB [제1피연산자] [제2피연산자]
사용 예 SUB AL 4
AL이 원래 7이었다면, 명령 실행 후 AL은 3이 됨

 

• CMP(Compare)

- 데이터의 두 값 비교 시 사용. ‘cmp a, b’의 경우 a에서 b를 뺀 값이 0이면 참

- 제 1피연산자 - 제 2피연산자 결과가 0이면 T, 1이면 F

형식 CMP [제1피연산자] [제2피연산자]
사용 예 CMP AL 4
AL이 원래 7이었다면, 명령 실행 후에는 3이 되고 0이 아니므로 거짓이 됨

 

• 기타 산술 연산 명령

명령 설명
ADC ADd with Carry 캐리를 포함한 덧셈 수행
SBB SuBtraction with Borrow 캐리를 포함한 뺄셈 수행
DEC DECrement 피연산자 내용을 1 감소 시킴
NEG Change Sign 피연산자 2의 보수로 부호를 반전
INC INCrement 피연산자 내용을 1 증가 시킴
AAA ASCII Adjust for Add 덧셈 결과의 AL 값을 UNPACK 10진수로 보정
DAA Decimal Adjust for Add 덧셈 결과의 AL 값을 PACK 10진수로 보정
AAS ASCII Adjust For Subtact 뺄셈 결과의 AL 값을 UNPACK 10진수로 보정
DAS Decimal Adjust for Subtract 뺼셈 결과의 AL 값을 PACK 10진수로 보정
MUL MUltipLy (Unsigned) AX와 피연산자의 곱셈 결과를 AX 또는 DX:AX에 저장
IMUL Integer MULtiply (Signed) 부호화된 곱셈 수행
AAM ASCII Adjust for Multiply 곱셈 결과의 AX 값을 UNPACK 10진수로 보정
DIV DIVide (Unsigned) AX 또는 DX:AX 내용을 피연산자로 나누고, 몫은 AL 또는 AX에 저장한 다음 나머지는 AH 또는 DX에 저장
IDIV Integer DIVide (Signed) 부호화된 나눗셈 수행
AAD ASCII Adjust for Divide 나눗셈 결과 AX 값을 UNPACK 10진수로 보정
CBW Convert Byte to Word AL의 바이트 데이터를 부호 비트를 포함해 AX 워드로 확장
CWD Convert Word to Double word AX 워드 데이터를 부호를 포함해 DX:AX의 더블 워드로 변환

 

데이터 전송 명령

- 메모리, 범용 레지스터, 세그먼트 레지스터로 참조되는 주소에 존재하는 데이터 전송

 

• MOV(Move): 데이터 이동할 때 사용

- BP의 현재 값이 0x10000004라면, BP+8은 0x1000000C

- 0x1000000C 번지에 저장되어 있는 값이 1024므로 AX에는 1024가 입력

형식 MOV [제1피연산자] [제2피연산자]
사용 예 MOV AX [BP+8]
BP의 주소에 8 더한 주소에 있는 데이터 값을 AX에 대입함

MOV 명령을 실행할 때 스택 동작

 

• PUSH(Push): 스택에 데이터를 삽입할 때 사용

- 아래 그림과 같이 스택은 커지고, 스택 포인터(Stack Pointer)는 데이터 크기만큼 감소

형식 PUSH [제1피연산자]

PUSH 명령을 실행할 때 스택 동작

• POP(Pop): 스택에서 데이터 삭제할 때 사용. 스택에서 삭제된 명령은 함수의 반환 값으로 받아 사용도 가능

- 아래 그림과 같이 스택 포인터는 삭제하는 데이터 크기만큼 증가

형식 POP [제1피연산자]

POP 명령을 실행할 때 스택 동작

 

• LEA(Load effective address to register)

- 데이터의 값을 이동할 때 사용

- MOV 명령과 LEA 명령에서 제1피연산자는 데이터 이동의 목적지인 것은 같지만, 제2피연산자에 대한 추가 연산의 처리 방식은 다름

- 제2피연산자에‘BP+4’가 있을 경우 MOV 명령은 ‘BP+4’를 하나의 주소 값으로 처리

- LEA 명령은 ‘BP’만 주소 값으로 인식하고 ‘+4’는BP 주소 값에 대한 추가 연산으로 처리

- MOV는 BP+4가 주소가 되지만, LEA는 주소가 BP가 되고 BP에 들어있는 값에 +4가 됨

형식 LEA [제1피연산자] [제2피연산자]
사용 예 LEA AX [BP+4]
BP의 현재 값이 0x10000004라면, MOV 명령처럼 BP+4인 0x10000008의 주소 값을 가져오는 것이 아닌 0x10000004의 주소에 있는 값에 4를 더해 AX에 대입

LEA 명령을 실행할 때 스택 동작

- 0×10000004 번지에 저장되어 있는 값은 46 0×10000008은 AX가 가리키는 번지

 

• 기타 데이터 전송 명령

명령 설명
XCHG Exchange Register /
Memory with Register
첫 번째 피연산자와 두 번째 피연산자를 바꿈
IN Input from AL / AX to Fixed
port
피연산자로 지시한 포트로 AX에 데이터를 입력
OUT Output from AL / AX to
Fixed port
피연산자가 지시한 포트로 AX의 데이터 출력
XLAT Translate byte to AL BX:AL이 지시한 테이블 내용을 AL로 로드
LES Load Pointer to ES LEA 명령과 유사한 방식으로 다른 ES 데이터의 주소 내용을 참조할 때 사용
LAHF Load AH with Flags 플래그 내용을 AH의 특정 비트로 로드
SAHF Store AH into Flags AH의 특정 비트를 플래그 레지스터로 전송
PUSHF Push Flags 플래그 레지스터 내용을 스택에 삽입
POPF Pop Flags 스택에 저장된 플래그 레지스터 값 삭제

 

논리 명령

- 연산부호가 논리연산을 지정하는 명령으로 자리옮김, 논리 합(OR), 논리곱(AND), 기호 변환 등이 있다

 

• AND(And): 대응되는 비트가 둘 다 1일 때만 결과가 1 이고, 그 이외는 모두 0

형식 AND [제1피연산자] [제2피연산자]
사용 예 AND AX 10h
AX 값이 0x08h일 때, 이를 2진수로 표현하면 1000이 됨
0x10h는 1010이므로 명령을 수행한 후 AX 값은 1000이 됨

 

• OR(Or): 대응되는 비트 중 하나만 1이어도 결과가 1이고, 둘 다 0인 경우에만 0

형식 OR [제1피연산자] [제2피연산자]
사용 예 OR AX 10h
AX 값이 0x08h일 때, 이를 2진수로 표현하면 1000이 됨
0x10h는 1010이므로 명령을 수행한 후 AX 값은 1010이 됨

 

• XOR(Exclusive Or): 대응되는 비트 중에서 한 비트가 1이고 다른 비트가 0이면 1, 두 개의 비트가 모두 0 또는 1일 때 0

형식 XOR [제1피연산자] [제2피연산자]
사용 예 XOR AX 10h
AX 값이 0x08h일 때, 이를 2진수로 표현하면 1000이 
0x10h는 1010이므로 명령을 수행한 후 AX 값은 0010이 

 

• NOT(Invert): 피연산자의 1의 보수를 구하는 작동 코드로, 각 비트를 반전

형식 NOT [제1피연산자]
사용 예 NOT AX
AX 값이 0x08h라면 이를 이진수로 표현하면 1000이 
명령을 수행한 뒤에 AX 값은 0111이 

 

• Test(And function to flags, no result): 데이터의 두 값 비교할 때 사용, 데이터의 변경 없이 단순 비교

형식 TEST [제1피연산자] [제2피연산자]
사용 예 TEST AL 10h
두 데이터가 같으면 ZF(Zero flag)
세트 같지 않으면 ZF는 클리어

 

•  기타 논리 명령

명령 설명
SHL / SAL Shift Left / Shift Arithmetic Left 왼쪽으로 피연산자만큼 자리옮김(이동)
SHR / SAR Shift Right / Shift Arithmetic Right 오른쪽으로 피연산자만큼 자리옮김(이동)
ROL Rotate Left 왼쪽으로 피연산자만큼 회전 이동
ROR Rotate Right 오른쪽으로 피연산자만큼 회전 이동
RCL Rotate through Carry Left 자리 올림(Carry)을 포함 왼쪽으로 피연산자만큼 회전 이동
RCP Rotate through Carry Right 자리 올림(Carry)을 포함 오른쪽으로 피연산자만큼 회전 이동

 

스트링 명령

- 바이트로 구성된 스트링(strings of bytes)을 메모리 내에서 전송

 

• REP(Repeat)

- ADD나 MOVS와 같은 작동 코드의 앞에 위치

- CX가 0이 될 때까지 뒤에 오는 스트링 명령 반복

 

• MOVS(Move String)

- 바이트나 워드, 더블워드 옮기는 명령 - MOVSB, MOVSW, MOVSD

형식 MOVSB
사용 예                       LEA                      SI,                       String_1
                      LEA                      DI,                       String_2
                      MOV                       CX,                      384
REP               MOVSB
LEA SI, String_1 : String 1의 주소 값을 SI (Source Index)에 저장
LEA DI, String_2 : String 2의 주소 값을 DI (Destination Index)에 저장
MOV CX, 384 : CX에 384를 저장
REP MOVSB : SI에서 DI까지 CX가 0이 될 때까지 1바이트씩 복사

 

• 기타 스트링 명령

명령 설명
CMPS CoMPare String DS:SI와 ES:DI 내용을 비교한 결과에 따라 플래그 설정
SCAS SCAn String AL 또는 AX와 ES:DI가 지시한 메모리 내용을 비교한 결과에 따라 플래그 설정
LODS LOaD String SI 내용을 AL 또는 AX로 로드
STOS STOre String AL 또는 AX를 ES:DI가 지시하는 메모리에 저장

 

제어 전송 명령

- 점프(분기, Jump), 조건 점프(조건 분기, Conditional jump), 루프(Loop), 호출(Call)과 리턴(Return) 연산 등으로 프로그램의 흐름 제어

 

 JMP(Unconditional Jump)

- 대표적인 점프 명령 프로그램을 실행할 주소 또는 라벨로 이동

형식 JMP                                         [제1피연산자]
사용 예 JMP                                               100h
주소로 직접 지정한 100h번지로 점프함
 String:                       MOV                  CX,                      384
                                    ...
                                  JMP                  String
라벨로 JMP를 지정하는 경우

 

 조건부 점프 명령

명령 점프 조건 설명
JC Carry Flag Set CF = 1 CF 값이 1이면 점프
JNC Not Carry Flag Set CF = 0 CF 값이 0이면 점프
JE / JZ Equal / Zero ZF = 1 결과가 0이면 점프
JA / JNBE above / Not below Not Equal CF = 0 and ZF = 0 결과가 크면 점프 (부호화되지 않은 수)
JAE / JNB above Or Equal / Not below CF = 0 결과가 크거나 같으면 점프 (부호화되지 않은 수)
JB / JNAE below / Not above Nor below CF = 1 결과가 작으면 점프 (부호화되지 않은 수)
JL / JNGE Less / Not Greater Nor Equal SF != OF 결과가 작으면 점프 (부호화된 수)
JBE / JNA below Or Equal / Not above (CF or ZF) = 1 결과가 작거나 같으면 점프 (부호화되지 않은 수)
JG / JNLE Greater / Not Less Nor Equal ZF = 0 and SF = OF 결과가 크면 점프 (부호화되지 않은 수)
JGE / JNL Greater Or Equal / Not Less SF = OF 결과가 크거나 같으면 점프 (부호화된 수)
JLE / JNG Less Or Eqal / Not Greater ZF = 1 or SF != OF 결과가 작거나 같으면 점프 (부호화되지 않은 수)
JNE / JNZ Not Equal / Not Zero ZF = 0 결과가 0이 아니면 점프
JNO Not Overflow OF = 0 오버플로가 아니면 점프
JNP / JPO Not Parity / Parity Odd PF = 0 PF가 1이면 점프
JNS Not sign SF = 0 SF가 1이면 점프
JO Overflow OF = 1 오버플로 발생 시 점프
JP / JPE Parity / Parity Even PF = 1 PF가 1이면 점프
JS Sign SF = 1 SF가 1이면 점프
JCXZ CX Zero CX = 0 CX가 0이면 점프

- above, below : 부호 없는 두 수의 크기 관계

- greater, less : 부호 있는 두 수의 크기 관계

 

• CALL(Call)

- JMP처럼 함수 호출할 때 사용, 제1피연산자에 라벨을 지정

 

• RET(Return from CALL)

- 함수에서 호출한 곳으로 돌아갈 때 사용하는 명령 ‘POP EIP’와 같은 의미

(1)                               CALL                               SUBR

(4)                                ADD                                  AX,                               10
                                     ....
(2) SUBR :                   INC                                   AX
                                     ....
(3)                                RET

- AX에는 09 값이 저장되어 있다 가정

- (1) SUBR 함수 호출하면, (2) SUBR 라벨이 있는 곳에서 RET까지 실행

- INC AX가 있으므로 AX는 10이 됨

- (3) RET 명령이 실행되면 CALL 다음 라인인 (4) ADD AX, 10’ 실행, AX는 20

 

• LOOP(Loop CX times)

- 문장들의 블록을 지정된 횟수만큼 반복

- CX는 자동적으로 카운터로 사용되며 루프 반복할 때마다 감소

 

형식 LOOP                                            [제1피연산자]
사용 예                                    MOV                  AX,                      0
주소로 직접 지정한 100h번지로 점프함
                                   MOV                  CX,                      6
 
          L1:                    INC                  AX
                                   LOOP              L1
제1피연산자는 라벨이 됨
위 예시에서 L1이 CX 숫자만큼 다섯 번 회전하므로 결과적으로 AX는 5가 됨

 

• INT(Interrupt)

- 인터럽트가 호출되면 CS:IP(Code Segment : Instruction Pointer)와 플래그를 스택에 저장

- 그 인터럽트에 관련된 서브 루틴이 실행

형식 INT [제1피연산자]

 

프로세스 제어 명령

• STC(Set Carry): 명령은 피연산자 없이 사용, EFLAGS 레지스터의 CF 값을 세트

 

• NOP(No Operation): 아무 의미 없는 명령, 일종의 빈 칸을 채우려고 사용

 

 기타 프로세스 제어 명령

명령 설명
CLC CLear Carry 캐리 플래그 클리어
CMC CoMplement Carry 캐리 플래그 반전
HLT HaLT 정지
CLD CLear Direction 디렉션 플래그 클리어
CLI CLear Interrupt 인터럽트 플래그 클리어
STD SeT Direction 디렉션 플래그 세트
STI SeT Interrupt 인터럽트 인에이블 플래그를 세트
WAIT WAIT 프로세스 일시 정지 상태
ESC ESCape to External Device 종료 명령

 

'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


어셈블리어의 구조

- Intel 문법과 AT&T 문법이 있음

- 윈도우에서는 Intel 문법 사용

- 리눅스에서는 AT&T 문법 사용

- Intel 문법에서는 목적지 (destination)가 먼저 오고 원본(source)이 뒤에 오지만, AT&T에서는 반대

- Intel 문법에서 어셈블리어의 명령 형식은 다음과 같음

Label:
라벨
MOV
작동 코드
AX
제 1피연산자
BX
제 2피연산자
; comment
설명

 

• 데이터 타입

- 바이트(Byte) : 1바이트(8비트) 데이터 항목

- 워드(Word) : 2바이트(16비트) 데이터 항목

- 더블워드(Doubleword) : 4바이트(32비트) 데이터 항목

 

어셈블리어의 데이터 타입과 리틀 엔디언 방식

- CPU 종류, 운영체제 종류에 따라 빅 에디언 또는 리틀 에디언 사용이 다름

 

• 리틀 엔디언 방식

- 2개의 번지로 나누어 저장해야 하는 16비트 데이터(워드)의 경우 하위 바이트는 하위 번지에 상위 바이트는 상위 번지에 저장

- 예) hex 값 0x34F3을 1500번지에 저장하려면 하위값 0xF3은 1500번지에, 상위 값 0x34는 1501번지에 저장

주소 1500번지 1501번지
저장된 데이터 F3 34

 

 빅 엔디언 방식

- 일반적인 방식 - 예) hex 값 0x34F3을 1500번지에 저장하려면 0x34은 1500번지에, 0xF3는 1501번지에 저장

 

어셈블리어의 주소 지정 방식

• 레지스터 주소 지정

- 레지스터의 주소 값을 직접 지정 복사

- 처리 속도 가장 빠름

MOV DX, BX

 

• 직접 메모리 주소 지정

- 가장 일반적인 주소 지정 방식

- 보통 피연산자 하나가 메모리 위치를 참조하고, 다른 하나는 레지스터를 참조

- DS:[8088h]와 DS:[1234h]는 각각 ‘세그멘트:오프셋’형식의 메모리에 직접 접근하는 방식

MOV AL, DS:[8088h]
MOV DS:[1234h], DL

 

• 레지스터 간접 주소 지정

- ‘세그멘트:오프셋’형식을 사용, 세그먼트를 명시적으로 적지 않음

MOV AL, [BX]
MOV AL, [BP]

 

- 다음과 같이 기본이 아닌 세그먼트를 강제로 지정할 수도 있음

MOV AL, CS:[BX]
MOV AL, DS:[BP]

 

• 인덱스 주소 지정

- 레지스터 간접 지정 방식에 변위가 더해진 메모리 주소 지정 방식

- 예) 20h만큼 더해 메모리를 참조한 명령

 

- 다음과 같이 바꿔서 표현할 수 있음

MOV AL, 20h [BX]
MOV AL, 20h [BP]

 

• 베이스 인덱스 주소 지정

- 실제 주소 생성 위해 베이스 레지스터(BX 또는 BP)와 인덱스 레지스터(DI 또는 SI)를 결합

- 2차원 배열의 주소 지정에 사용

MOV AL, [BX+SI]
MOV AL, [BP+SI]

 

- 다음과 같이 바꿔서 표현할 수 있음

MOV AL, [BX] [SI]
MOV AL, [BP] [SI]

 

• 변위를 갖는 베이스 인덱스 주소 지정

- 베이스-인덱스의 변형으로 실제 주소 생성 위해 베이스 레지스터, 인덱스 레지스터, 변위 결합

MOV AL, [BX+SI+20h]
MOV AL, [BP+SI+20h]

- 다음과 같이 바꿔서 표현할 수 있음

MOV AL, [BX] [SI] [20h]
MOV AL, [BP] [SI] [20h]

 

'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


• 인텔 CPU 모델별 관련 정보

• 80×86 시스템 CPU의 구조
- 연산장치, 제어장치, 레지스터

 

• 연산장치 (ALU:Arithmetic and Logic Unit)

- 연산 장치는 CPU(중앙 처리 장치)의 핵심 부분 중 하나

- 산술과 논리 연산을 수행하는 연산 회로 집합으로 구성

구성 요소 기능
내부 장치 가산기(Adder) 덧셈 연산 수행
보수기(Complementer) 뺄셈 연산 수행
1의 보수나 2의 보수 방식 이용
시프터(Shifter) 비트를 오른쪽이나 왼쪽으로 이동하여 나 눗셈과 곱셈 연산 수행
관련 레지스터 누산기(Accumulator) 연산의 중간 결과 저장
데이터 레지스터 (Data Register) 연산에 사용할 데이터 저장
상태 레지스터 (Status Register) 연산 실행 결과로 나타나는 양수와 음수, 자리올림, 오버 플로우의 상태 기억

 

• 제어 장치(Control Unit)

- 제어 장치(Control Unit)는 입력, 출력, 기억, 연산 장치를 제어하고 감시

- 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시

 

구성 요소 기능
내부 장치 명령 해독기(Instruction Decoder) 명령 레지스터에 있는 명령을 해독하여 부호기로 전송
부호기(Decoder) 명령 해독기가 전송한 명령을 신호로 만들어 각 장치 전송
주소 해독기(Address Decoder) 명령 레지스터에 있는 주소를 해독하여 메모리의 실제주소 로 변환한 후, 이를 데이터 레지스터에 저장
관련 레지 스터 프로그램 카운터(Program Counter) 다음에 실행할 명령의 주소 저장
명령 레지스터(Instruction Register) 현재 실행 중인 명령 저장
메모리 주소 레지스터(Memory Address Register) 주기억 장치의 번지 저장
메모리 버퍼 레지스터
(Memory Buffer Register)
메모리 주소 레지스터에 저장된 주소의 실제 내용 저장

 

• 레지스터

- 처리 중인 데이터나 처리 결과를 임시 보관하는 CPU 내의 기억 장치

- 연산 장치나 제어 장치에 함께 포함되어 있음

- 우리가 중요한 내용을 잊지 않게 메모하듯, 프로그램도 레지스터를 이용해서 메모함

- 32비트 운영체제에서는 기본적으로 레지스터가 32비트로, 16비트나 8비트로 나누어 사용하기도 함

 

- 범용 레지스터 - 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용

- 세그먼트 레지스터 - 프로그램에 정의된 메모리상의 특정 영역으로 코드, 데이터, 스택 등을 포함

- 포인터 레지스터 - 프로그램 실행 과정에서 사용되는 주요 메모리 주소값 저장

- 인덱스 레지스터 - 메모리의 한 영역(Souce)에서 다른 영역(Destination)으로 데이터를 연속적으로 복사할 때 사용

- 플래그 레지스터 - 32비트로, 컴퓨터의 다양한 상태를 나타내는 비트 포함

범주 80386 레지스터 이름 용도
범용 레지스터 32bit
(General Register)
EAX 누산기
(Accmulator)
산술 및 논리 연산에 사용하고 함수의 결과(return)값 저장
EBX 베이스 레지스터
(Base Register)
특정 메모리 주소 저장
(주소 지정을 확대하기 위한 인덱스로 사용)
ECX 카운트 레지스터
(Count Register)
반복적으로 실행되는 특정 명령에 사용
(루프의 반복 횟수나 좌우 방향 시프트 비트 수 기억)
EDX 데이터 레지스터
(Data Register)
일반 자료 저장(입출력 동작에 사용)

 

범주 80386 레지스터 이름 용도
세그먼트 레지스터16bit
(Segment Register)
CS 코드 세그먼트 레지스터
(Code Segment Register)
실행될 기계 명령어가 저장된 메모리 주소 지정
DS 데이터 세그먼트 레지스터
(Data Segment Register)
프로그램에서 정의된 데이터, 상수, 작업 영역의 메모리 주소 지정
SS 스택 세그먼트 레지스터
(Stack Segment Register)
프로그램이 임시로 저장해야 하는 데이터나 사용자의 피호출 서브 루틴(called subroutine)이 사용할 데이터와 주소 저장
ES, FS, GS 엑스트라 세그먼트 레지스터
(Extra Segment Register)

문자 연산과 추가 메모리 지정을 위해 사용되는 여분의 레지스터

 

범주 80386 레지스터 이름 용도
포인터 레지스터 32bit
(Pointer Register)
EBP 베이스 포인터 (Base Pointer) SS 레지스터와 함께 사용되어 스택 내 의 변수 값을 읽는 데 사용
ESP 스택 포인터 (Stack Pointer) SS 레지스터와 함께 사용되며 스택의 가장 끝 주소를 가리킴
EIP 명령 포인터 (Instruction Pointer) 다음 명령어의 오프셋(Offset, 상대 위 치 주소)을 저장하며 CS 레지스터와 합 쳐져 다음에 수행될 명령의 주소 형성
인덱스 레지스터 32bit
(Index Register)
EDI 목적지 인덱스 (Destination Index) 목적지 주소에 대한 값 저장
ESI 출발지 인덱스 (Source Index) 출발지 주소에 대한 값 저장
플래그 레지스터 32bit EFLAGS 플래그 레지스터 (Flag Register) 연산 결과 및 시스템 상태와 관련된 여러 가지 플래그 값 저장
 

범용 레지스터

- 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 목적으로 사용

- EAX, EBX, ECX, EDX등이 있음

- EAX, EBX, ECX, EDX는 32비트 레지스터로 앞의 E는 ‘확장된(Extended)’을 의미

- 이 레지스터의 오른쪽 16비트를 각각 AX, BX, CX, DX라 부르고, 이 부분은 다시 둘로 나뉨

- 예를 들어, AX는 왼쪽 8비트 상위(high) 부분을 AH, 오른쪽 8비트 하위(low) 부분을 AL이라 함

• EAX 레지스터(Accmulator)

- 누산기, 입출력과 대부분 산술 연산에 사용 - 곱셉, 나눗셈, 변환 명령은 EAX 사용

- Win32 API 함수들은 모두 리턴 값을 EAX에 저장 후 리턴

 

• EBX 레지스터(Base Register)

- DS 세그먼트에 대한 포인터를 주로 저장

- BX는 메모리 주소 지정을 확장하기 위한 인덱스로 사용하는 유일한 범용 레지스터

- ESI나 EDI와 결합하여 인덱스에 사용

 

• ECX 레지스터(Count Register)

- 루프가 반복되는 횟수를 제어하는 값. 왼쪽이나 오른쪽으로 이동되는 비트 수 등을 포함

 

• EDX 레지스터(Data Register)

- 입출력 연산에 사용

- 큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용

 

세그먼트 레지스터

- 프로그램에 정의된 메모리상의 특정 영역으로 코드, 데이터, 스택 등을 포함

- 세그먼트: 메모리를 구성하는 하나의 단위

- 세그먼트 레지스터는 각 세그먼트의 주소를 지정

- CS, DS, SS 레지스터가 기본 구성

- ES, FS, GS 레지스터는 여분 (거의 사용되지 않음)

 

• CS 레지스터

- 실행될 기계 명령을 포함하는 코드 세그먼트의 시작 주소를 가리킴

 

• DS 레지스터

- 프로그램에 정의된 데이터, 상수, 작업 영역을 포함

- 데이터 세그먼트의 시작 주소를 가리킴

- 데이터의 오프셋을 DS 레지스터에 저장된 주소 값에 더해 데이터 세그먼트 내에 위치해 있는 데이터의 주소를 참조

 

• SS 레지스터

- 실행 과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제할 때 사용

- 스택 세그먼트의 시작 주소를 가리킴

 

포인터 레지스터

- 프로그램 실행 과정에서 사용되는 주요 메모리 주소값 저장

 

• EBP 레지스터(Extended Base Pointer Register)

- 스택 세그먼트에서 현재 호출해서 사용하는 함수의 시작 주소 값 저장

- 함수로 전달되는 지역변수 등을 참조할 때 기준이 되며 ESP 레지스터와 함께 사용되어 스택 프레임(Stack frame)을 형성 - 실제 메모리상의 주소를 참조할 때 SS(Stack Segment) 레지스터와 함께 사용

 

• ESP 레지스터(Extended Stack Pointer Register)

- 현재 스택 영역에서 가장 하위 주소를 저장

- EBP와 마찬가지로 실제 메모리상의 주소를 참조할 때SS(Stack Segment) 레지스터와 함께 사용

 

• EIP 레지스터(Extended Instruction Pointer Register)

- 다음에 실행될 명령의 오프셋을 포함

- 현재 실행 중인 코드 세그먼트에 속한 현재 명령 가리킴

- CS(Code Segment) 레지스터와 함께 사용

 

인덱스 레지스터

• ESI & EDI

- 메모리의 한 영역(Source, 출발지)에서 다른 영역(Destination, 목적지)으로 데이터를 연속적으로 복사할 때 사용

- 예로들면 문자열을 복사하는 strcpy함수에서 Source의 문자열을 Destination 으로 복사할 때 두 메모리 주소를 저장하는 데 ESI와 EDI레지스터 사용

 

플래그 레지스터

- 32비트 크기

- 컴퓨터의 다양한 상태를 나타내는 비트들을 포함

- 상태 플래그, 제어 플래그, 시스템 플래그로 구성

 상태 플래그: 산술 명령(ADD, SUB, MUL, DIV) 결과를 반영

- CF(Carry Flag, 비트 0) : 산술 연산 결과로 자리내림 발생할 때 세트(1)

- ZF(Zero Flag, 비트 6) : 산술 연산 결과 0이면 세트(1), 이외에는 클리어(0)

- OF(Overflow Flag, 비트 11) : 부호가 있는 수의 오버플로우가 발생하거나 MSB(Most Significant Bit)가 변경되었을 때 세트

- PF(Parity Flag / 비트 2) : 산술 연산 결과가 짝수이면 세트(1)

- AF(Adjust Flag / 비트 4) : 8비트 피연산자를 사용한 산술 연산에서 비트 3을 비트 4로 자리올림하면 세트(1)

- SF(Sign Flag / 비트 7) : 산술 및 논리 연산 결과가 음수이면 세트(1) 

 

 제어 플래그(Control Flag): 스트링 명령(MOVS,CMPS, SCAS, LODS, STOS)을 제어

- DF 1이면 스트링 명령 자동 감소, 0이면 자동 증가 즉, 1이면 스트링을 높은 주소에서 낮은 주소로 처리, 0이면 스트링을 낮은 주소에서 높은 주소로 처리

 

시스템 플래그(System Flag)

- TF(Trap Flag, 비트 8) : 디버깅 시 Single Step Mode 모드를 활성화하면 세트

- IF(Interrupt enable Flag, 비트 9) : 프로세서의 인터럽트처리 여부를 제어

- IOPL(I/O Privilege Level, 비트 12/13) : 현재 실행되는 프로그램이나 Task의 입출력 특권 레벨 지시

- NT(Nested Task flag, 비트 14) : 인터럽트 되거나 호출된 태스크를 제어

- RF(Resume Flag, 비트 16) : 프로세서의 디버그 예외 반응을 제어, 세트 되어 있으면 디버그 오류를 무시하고 다음 명령어 수행

- VM(Virtual 8086 Mode flag, 비트 17) : V86 모드를 활성화하면 세트

- AC(Alignment Check, 비트 18) : 메모리 참조 시 정렬 기능을 활성화하면 세트

- VIF(Virtual Interrupt Flag, 비트 19), VIP(Virtual Interrupt Pending, 비트 20) : 가상 모드 확장과 관련해 사용

- ID(IDentification, 비트 21) : CPUID 명령의 지원 유무를 결정

'한빛아카데미 - 시스템 해킹과 보안' 교재에 관한 내용입니다.


• 운영체제 개념

- 사용자가 컴퓨터 시스템을 손쉽게 사용하도록 하고, 시스템 자원(기억 장치, CPU, 입출력 장치, 정보, 네트워크 등)을 효율적으로 관리할 수 있도록 하는 프로그램 집합

 

운영체제의 역할

 운영체제의 기능

- 일반 PC는 단일 사용자 운영체제 구성 모델을 기반으로 하여 메모리 관리자, 프로세서 관리자, 장치 관리자, 파일 관리자 등 서브 시스템 관리자로 구성

단일 사용자 운영체제 구성 모델

 사용자 명령 인터페이스

- 사용자와 시스템 간의 대화 수단(DOS, GUI)

 

서브 시스템 관리자

 메모리 관리자

- 프로그램의 메모리 요청의 적합성 점검

- 적합한 경우 할당된 메모리를 다른 프로그램이 접근하지 못하게 관리

- 보호 프로그램 종료 시 할당된 메모리를 회수

 

 프로세서 관리자

- 명령어들이 체계적이고 효율적으로 실행되도록 작업 스케줄링 - 사용자의 작업 요청 수용 또는 거부

 

 장치 관리자

- 프린터, 디스크 드라이버, 모뎀, 모니터 등, 시스템 내의 모든 장치(Device)를 프로그램에 할당 또는 회수

 

 파일 관리자

- 사용자별로 파일 접근(Access) 권한을 부여 접근 권한에 따라 파일을 할당(Open)하고 해제(Close)

 

 네트워크 관리자

- CPU, 메모리, 프린터, 디스크 드라이버, 모뎀, 모니터 같은 자원을 관리

 

 Window의 역사

윈도우 발전 과정

 

 과거 MS 계열 운영체제

MS DOS 2.0, Windows NT

 

Windows Server 2012

 

 Window의 구조

- 커널은 인터럽트 (Interrupt) 처리, 프로세스 관리, 메모리 관리, 파일 시스템 관리, 프로그래밍 인터페이스 제공 등 운영체제의 기본 기능을 제공

 

- 윈도우 커널 구조

윈도우 링 구조
윈도우 시스템 구조

 

• 커널 모드

- 기본적으로 사용자가 접근할 수 없는 영역

- 프로그램을 실행하는 기본 관리 시스템

 

• HAL(Hardware Abstraction Layer)

- 컴퓨터 하드웨어와 소프트웨어 사이의 추상화 계층

- 하드웨어 부품에 따라 해야 할 복잡한 과정을 일관성 있고, 간략한 인터페이스로 제공하기 위해 같은 류의 하드웨어를 공통 명령어 집합으로 묶음

- 소프트웨어와 하드웨어 사이에서 소프트웨어가 PC의 시스템 메모리, CPU, 또는 기타 하드웨어 장치에 직접적으로 접근하는 것을 막음

- 소프트웨어는 HAL을 통해 하드웨어의 종류에 관계없이 컴퓨터 자원을 사용하여 일관된 작업을 수행

 

• 마이크로 커널 - 커널은 프로세스의 스케쥴링이나 메모리 관리, 데이터 입출력, 하드웨어 제어 등을 수행 - 그러나 윈도우는 이 작업들을 여러 관리자에게 분담시키고, 마이크로 커널은 하드웨어와 하는 통신만 제어하는 최소한의 커널 - 소스코드 측면에서 10,000줄 이하의 코드를 지니는 경향이 있음

 

• 사용자 모드

- 사용자 모드에는 다양한 응용 프로그램이 있을 수 있고, 이러한 응용 프로그램을 실행하는 서브 시스템이 있음 이러한 서브시스템을 컨테이너(Container)라고도 함

- 윈도우 10부터 윈도우 리눅스 서브시스템(WSL, Windows Subsystem for Linux) 적용

- 윈도우에서 리눅스 OS 설치 및 실행 가능

 

• 윈도우 관리자의 역할

- 입출력 관리자(I/O Manager) : 시스템의 입출력을 제어

- 객체 관리자(Object Manager) : 파일, 포트, 프로세스, 스레드 등의 객체들에 대한 정보를 제공

- 보안 참조 관리자(Security Reference Monitor Manager) : 각 데이터나 시스템 자원의 제어를 허가 하거나 거부함

- 프로세스 관리자(Process Manager) : 스레드를 생성하고 요청에 따라 처리

- 로컬 프로시저 호출 관리자(Local Procedure Call Manager) : 프로세스 간 장치

- 가상 메모리 관리자(Virtual Memory Manager) : RAM의 메모리를 할당하고, 가상 메모리의 페이징 (Paging)을 제어

- 그래픽 장치 관리자(Graphics Device Interface Manager) : 화면에 선이나 곡선을 그리거나 폰트 등을 관리

- 기타 관리자 : 캐시(Cache) 관리자, PNP(Plug and Play) 관리자, 전원 관리자 등이 있다.

 

• 윈도우 부팅 순서 (윈도우 XP, 윈도우 서버200/2003)

1 | POST(Power On Self Test)의 실행

- BIOS(Basic Input/Output system)에서 POST(Power On Self Test) 실행

- 컴퓨터 전원 인가 시 BIOS가 주변장치에 이상은 없는지 검사

 

2 | 기본 부팅 관련 설정사항 로드

- BIOS는 CMOS에 설정되어 있는 시스템 설정사항 및 부팅과 관련된 여러 가지 정보를 읽어 시스템에 적용

- CMOS(Complementary Metal-Oxide Semiconductor)

- CMOS는 비휘발성이기에 메인보드의 BIOS는 각종 설정 작업을 할 때 CMOS에 저장된 정보를 불러올 수 있음

 

3 | MBR(Master Boot Record, 마스터 부트 레코드) 로드

- MBR은 저장 매체의 첫 번째 섹터에 위치하는 512바이트의 영역으로, 부팅 매체에 대한 기본 파일 시스템 정보

- 부팅 가능한 파티션을 찾아 부팅 프로그램을 담고 있는 부트 섹터(Boot Sector) 호출

- ‘Missing operating system’은 운영체제가 설치되지 않았거나 CMOS에서 부팅 매체를 잘못 설정했을 때 확인

 

4 | NTLDR(NT Loader) 실행

- 하드 디스크의 부팅 파티션에 있는 프로그램으로, 윈도우 가 부팅될 수 있도록 파일 시스템을 실행하고 boot.ini 파일의 내용을 읽어 가능한 부팅 옵션을 보여줌

- 윈도우 비스타 이상 버전부터는 boot.ini를 포함하지 않고 별도의 시동 로더 사용

- 시스템에 설치된 하드웨어 검사(CPU 유형, 버스 유형, 비디오 보드 유형, 키보드와 마우스 종류, 컴퓨터에 장착되어 있는 직렬 포트와 병렬 포트, 플로피 드라이브)

- NTDETECT가 문제 없이 구동하면 레지스트리에 하드웨어 키 생성( HKEY_LOCAL_MACHINE, 재부팅마다 레지스트리에 해당 부분을 만들고 항상 현재 하드웨어 구성 반영)

 

5 | NTDETECT.com 실행

 

6 | ntoskrnl.exe(NT OS Kernel) 실행 HAL.DLL(Hardware Abstraction Layer) 로드 단계

- 커널 로드 : 시스템 설정을 로드하고, 이것을 HKEY_LOCAL_MACHINE\ System\CurrentControlset\Services에 저장

- 커널 초기화 : 드라이브에 대한 현재의 제어 설정을 검사하고 작업을 시작

- 서비스 로드 : 세션 관리자 서브 시스템(smss.exe)과 Win32 서브 시스템을 로드

- 서브 시스템 시작 : 윈도우 서브 시스템이 초기화, Win32 서브 시스템은로그인을 처리하고 Winlogon.exe를 시작

 

• 리눅스/유닉스의 역사

- 데니스 리치(Dennis Ritchie)는 파견지에서 돌아온 뒤 켄 톰슨(Ken Thomson)과 함께PDP- 7을 만들기 시작하며 멀틱스의 여러 개념 구현

1 | 파일 시스템 구성

2 | 사용자가 명령을 내려 바로 실행하는 명령어 인터프리터(command interpreter)

3 | 각 명령이 새로운 프로세스를 형성해서 실행하도록 하는 개념 모두 포함

 

PDP-7

- 버클리대학교 AT&T 연구소는 유닉스 소스 코드를 400달러에 구입

- 버클리대학교의 학생 빌 조이(Bill Joy)와 척 핼리(Chuck Haley)는 소스 코드를 수정하여 발전

- BSD(Berkeley Software Distribution)라는 이름을 붙여 당시50달러 가격으로 판매

- 리눅스 시초는 1983년부터 리처드 스톨만이 개발한 GNU 운영체제

- 리눅스 정식 버전은 1991년 10월에 발표 ‘Copy Left’ 원칙에 의해 배포했고, 해커를 포함한 여러 사람들에 의해 발전

- POSIX(Portable Operating System Interface)

- 이식 가능 운영 체제 인터페이스

- 서로 다른 UNIX OS의 공통 API를 정리하여 이식성이 높은 유닉스 응용 프로그램을 개발하기 위한 목적으로 IEEE가 책정한 애플리케이션 인터페이스 규격

 

• 유닉스의 표준 인터페이스 POSIX

- POSIX.1(핵심부, 운영체제 인터페이스)

- POSIX.2(셸과 툴, 사용자 명령 등)

- POSIX.3(표준 규격의 적합성 검증법)

- POSIX.4(실시간 POSIX 확장)

- POSIX.5(Ada 언어)

- POSIX.6(보안 기능) 등

 

유닉스 시스템 발전 과정

 

리눅스/유닉스의 구조

• 유닉스 링 구조

- 하드웨어, 커널, 셸, 응용 프로그램으로 구성

유닉스 링 구조

- 윈도우보다 훨씬 단순한 구조

- 크게 파일 서브 시스템, 장치 드라이버, 프로세스 제어로 나뉘며, 커널의 파일 크기 또한 윈도우의 1/3 정도

유닉스 시스템 구조

- 프로세스 제어: 전체 프로세스 간 통신, 스케줄링, 메모리 관리 구현

- 장치 드라이버: 윈도우에서 처럼 하드웨어와 소프트웨어를 연결해주는 인터페이스 제공

- 파일 서브 시스템: 하드 디스크와 같은 저장 공간에 유닉스의 파일을 저장하고 읽는 역할

 

• 셸(Shell)

- 응용 프로그램에서 명령을 받아 커널에 전송하는 역할, 사용자의 키보드 입력 인식 해당 프로그램을 수행

- 본 셸(Bourne Shell), 콘 셸(Korn Shell), C 셸(C Shell)

 

• 셸의 주요 기능

- 자체의 내장 명령어 제공

- 입력/출력/오류의 방향 변경(redirection)

- 와일드카드(wildcard)

- 파이프라인

- 조건부/무조건부 명령 열 작성

- 서브 셸 생성

- 백그라운드 처리(Background processing)

- 셸 스크립트(프로그램) 작성

 

• 리눅스/유닉스의 파일 시스템

- 일반 파일 : 데이터 파일이나 실행

- 디렉터리 : 유닉스에서는 디렉터리도 파일에 해당, 디렉터리가 담고 있는 여러 파일과 하위 디렉터리 정보가 담겨 있음

- 특수 파일 : 프린터나 터미널, 테이프 드라이버 같은 물리적인 장치를 특수 파일을 통해 접근, 특수 파일은 /dev(device)에 있음

- 파이프 파일 : | 문자를 말하며, 2개의 명령을 연결 시 사용, 임시 파일이 생성 되었다가 명령 수행을 마치면 사라지는 것으로, 이 파일을 파이프 파일이라고 함

유닉스의 디렉터리 구조

 

디렉터리 내용
/bin 기본적으로 실행 가능한 파일을 담고 있음
echo, mv, copy, pwd, who 등
/etc 시스템의 환경 설정 및 주요 설정 파일을 담고 있음
passwd, hosts, xined.conf 등
/tmp 프로그램 실행 및 설치 시 생성되는 임시 파일을 담고 있음
이 디렉터리에 파일을 저장하면 재부팅 시 임의로 삭제될 수 있음
/lib 기본 프로그램의 모듈을 담고 있음
/boot 커널을 위한 프로그램 파일을 담고 있으며, 부팅할 때 읽혀 수행 됨
/dev 프린터나 터미널 같은 물리적인 장치를 다루기 위한 특수 파일을 담고 있음
/home 각 사용자의 작업 디렉터리를 담고 있음
각 계정으로 로그인할 때 이 디렉터리 밑에 자신의 작업 디렉터리가 시작 디렉터리가 됨
/usr 사용자가 직접 쓰는 파일을 담고 있다. 다른 디렉터리에 있는 파일이 똑같이 위치하고 있는 것이 많은데, 이는 링크되어 있는 것
/usr/lib C언어나 포트란의 라이브러리를 담고 있음
/usr/include C언어에 사용되는 헤더 파일을 담고 있음


• 리눅스/유닉스의 부팅 순서

- 1단계 : POST(Power On Self Test) 수행

 

- 2단계 : 기본 부팅 관련 설정사항 로드

 

- 3단계 : MBR(Master Boot Record, 마스터 부트 레코드) 로드

 

- 4단계 : 부트 로더(Boot Loader) 실행

1 | LILO(Linux Loader)와 GRUB(GRand Unified Bootloader, GNU 프로젝트의 부트 로더) 사용

2 | LILO는 /etc/lilo.conf에 설정사항 저장

3 | GRUB은 /etc/grub.conf (=/boot/grub/grub.conf)에 설정사항 저장

4 | 부트 로더를 실행하면 OS 커널 이미지를 메모리에 로드

 

▪ 5단계 : 실행 레벨에 따른 서비스 실행

- inittab 파일은 부팅할 기본 모드를 선택하여 그에 따른 환경을 제공하는 분기점

- initttab 파일 : 실행 레벨(Run Level), 기본이 실행 레벨 7

실행 레벨 0  시스템을 종료할 때 사용
실행 레벨 1 단일 사용자 모드(Single User Mode)로, 기본적으로 관리자 권한의 셸을 얻는다. 그러나 대부분 데몬이 실행되지 않으므로 기능은 제약되어 있다.
실행 레벨 2 NFS(Network File System)를 지원하지 않는 다중 사용자 모드
실행 레벨 3 일반 셸 기반의 인터페이스를 가진 다중 사용자 모드
실행 레벨 4 기본적으로 사용되지 않지만 사용자가 임의로 정의하여 사용할 수 있음
실행 레벨 5 기본은 실행 레벨 3과 같으나 GUI 환경을 지원
실행 레벨 6 재부팅
1

+ Recent posts