[ Project ] Pascal Programming/C 2015. 8. 26. 10:29

프로젝트 : Pascal 



프로젝트 설명 :


- 1             <- 왼쪽과 같이 위에 두 수를 더해 아래에 출력하는 프로그램이다.

  1 1           

  1 2 1         

  1 3 3 1       



소스코드 :


#include <stdio.h>

int main(void){

    int arr[10][10]={0,};// 2차원 배열은 통해 판을 만들고 0으로 초기화 하였다.

    int  i , j, num=1; // i = 행 , j = 열

    for(i = 0 ; i < 10 ; i ++ ){

        for(j = 0 ; j < num ; j ++ ){

            if( j == 1 ){ // 모든 줄의 첫번째 행에는 1을 넣는다.

                arr[j][i]=1;

            }

            else if( i == 2 ){ // 2번째 줄의 모든 열에는 1을 넣는다.

                arr[j][i]=1;

            }

            if(j>1&&i>2){ //위의 경우를 둘다 만족하지 않을 경우.

                arr[j][i]=arr[j-1][i-1]+arr[j][i-1];

            }

        }

        num++;

    }

    for( i = 0 ; i < 5 ; i ++ ){ // 출력을 위한 for 문

        for( j = 1 ; j < i+1 ; j ++ ){

            printf("%d ",arr[j][i]);

        }

        printf("\n");

    }

 

}

'Programming > C' 카테고리의 다른 글

Stack과 Queue  (0) 2015.08.26
Call-by-value 와 Call-by-reference  (0) 2015.08.26
2차원 배열  (0) 2015.08.26
동적 할당  (0) 2015.08.26
포인터 ( Pointer )  (0) 2015.06.14

커널 모드 : 유저모드로는 접근 할 수 없도록 되어있는 시스템역역(커널)에 접근하기 위해 동작되는 실행모드.

유저 모드 : 유저가 접근할 수 있는 OS 영역 내에서 동작되는 실행 모드. 


모드를 나누는 목적 : 보안성과 안전성의 확보


유저들이 마음대로 접근해도 되는 영역에 대해서 유저 모드로 접근이 되도록 하고 커널에 요청해서 처리할 문제가 있을때만 일시적으로 커널 모드로 전환해서 커널 내의 처리 요청을 처리하고 일을 마치면 다시 유저 모드로 

전환되어 실행이 된다.


유저 애플리케이션이 치명적인 운영체제 데이터에 접근하거나 수정하지 

못하게 막기 위해 운영체제는 두 가지 프로세서 접근모드를 사용한다.

유저 애플리케이션 코드는 유저 모드에서 실행되고, 운영체제 코드는 커널 모드에서 실행된다.

커널 모드는 모든 시스템 메모리와 모든 *CPU 인스트럭션에 접근이 허가된 프로세서의 실행 모드를 말한다.

프로세서는 운영체제 소프트웨어에 애플리케이션 소프트웨어가 가진 것보다 높은 특권 레벨을 제공함으로써 

오동장을 유발하는 애플리케이션이 시스템 전체의 안정성을 해치지 않게 보장할 수 있는 필수 기반을 운영체제 

설계자에게 제공한다.


* CPU instruction : CPU 명령어


[ 특징 ]


+ 유저모드 +

1. 사용자 애플리케이션 코드가 실행한다.

2. 시스템 데이터에 제한된 접근만이 허용되며 하드웨어를 직접 접근할 수 없다.

3. 유저 애플리케이션은 시스템 서비스 호출을 하면 유저 모드에서 커널 모드로 전환된다.

4. CPU는 유저 모드 특권 수준으로 코드를 실행한다.

5. 유저 모드에서 실행하는 스레드는 자신만의 유저 모드 스택을 가진다.


+ 커널모드 +

1. 시스템의 모든 메모리에 접근할 수 있고 모든 CPU 명령을 실행할 수 있다.

2. 운영체제 코드나 디바이스 드라이버와 같은 커널 모드 코드를 실행한다.

3. CPU는 커널 모드 특권 수준에서 코드를 실행한다.



출처 : http://karasix.tistory.com/115


▶ 메모리 보호란?


컴퓨터 메모리의 사용을 제어하는 방법이며, 모든 운영 체제에서 중요한 쟁점 사항 중 하나이다.

운영 체제에서 실행하고 있는 프로세스가 자신에게 할당되지 않은 영역의 메모리에 접근하는 것을 막는 것이 

메모리 보호의 주된 목적이다. 이를 통해 프로세스 내의 버그가 다른 프로세스의 동작에 영향을 미치는 것을

예방하며, 악성 소프트웨어가 허가되지 않은 접근권한을 갖고, 시스템에 영향을 끼치는 것을 막아준다.



Ⅰ. ASLR 


Address Space Layout Randomization 의 약자로, 

메모리 상의 공격을 방어하기 위해서, 주소 공간 배치를 난수화 시키는 기법

( 스택, 힙, 라이브러리 등의 데이터 영역 주소등을 난수화 시킨 주소로 프로세스 주소 공간에 배치하는 것. )

*PIE 가 걸려있지 않을땐 binary 영역이 정적이므로 binary 영역을 이용해 우회할 수있다. 주로 *ROP를 사용한다. 


* PIE : Position Independent Executable 의 약자로, 바이너리에 적용되는 ASLR을 일컫는다.

PIE는 바이너리 영역이 배치된 주소를 알아낼 수 있는 메모리 릭 취약점이 존재할 경우 이를 알아온 후 ROP로 익스플로잇이 가능하다.


* ROP : Return Oriented Programming 의 약자로, 취약한 프로그램 내부에 있는 기계어 코드 섹션 

          ( *Gadget ) 들을 이용하여, BOF 공격 시 특정 명령을 실행시키는 방법을 말한다. 

          이러한 ROP는 메모리 보호기법들을 우회할 수 있기 때문에 Fedora core 13( kernel 2.6.33.3-85 )에서 

          BOF 공격이 가능하다.

L ROP는 RTL, Chaning RTL calls, GOT overwrite의 3가지 특징적인 기술을 사용한다.


*Gadget : Gadget은 함수 끝에 기술되어 있는 ret 명령어를 포함한 상위 몇가지 명령어들의 집합이며, 

             이를 이용하여 단 한번의 실패없어 한번에 공격을 성공 할 수 있다.



Ⅱ. Stack Canary


gcc 4.1 버전 이후부터는 Stack Overflow를 방지하기 위해 SSP (stack-smashing protector) 기능이 내장되어 있다.

SSP는 함수 진입 시 스택에 Return address 와 frame pointer 정보를 저장할 때, 이 정보를 보호하기 위해 

( Canary라고 부르는 ) 특정한 값을 기록해두고 함수에서 반환할 때 기록된 값이 변경되지 않았는지 검사한다.

만약 악의적인 사용자가 buffer overflow 등의 공격을 통해 스택 내의 정보를 덮어쓰려면, 

canary 값을 먼저 덮어써야 하기 때문에, canary 값만 보면 공격이 일어났는지 볼 수 있다.

Canary 는 Window 에서의 메모리 기법인 Stack Cookie 와 같은 개념으로,  Buffer 와 RET 사이에서 스택의 BOF를 모니터링 하는 역할을 담당한다.



Ⅲ NX ( DEP )


Non-eXecutable 의 약자로, 메모리 상의 보호를 위해 Stack 과 Heap 에서 코드가 실행되는 것을 막는 기법.

write 권한과 execute 권한을 동시에 갖지 않도록 메모리 페이지의 권한을 설정합니다.

공격자가 BOF 공격을 일으키면 옛날엔 그 메모리에 쉘코드를 넣고 Return Address를 쉘코드를

가르키게 하는 것이 가능했는데, DEP 가 적용된 상태에서는 실행 권한이 없으므로, 

쉘코드가 있어도 프로그램에 대한 예외 처리가 발생되고 종료된다.



'Operating System > Linux' 카테고리의 다른 글

리눅스 명령어  (0) 2015.08.26