'NCS보안3기/시스템 해킹'에 해당되는 글 4건

  1. 2017.05.16 [System Hacking] Stack Buffer Overflow
  2. 2017.05.16 [System Hacking] 메모리
  3. 2017.05.16 [System Hacking] CPU와 레지스터
  4. 2017.05.15 [System Hacking] 운영체제

스택 버퍼 오버플로우 공격은 모든 경우에 가능하지 않고 프로그래머가 취약한 특정 함수를 사용해야 가능하다. 다음 예를 통해 스택 버퍼 오버플로우 공격을 실습해보자.


stack1.c 파일을 다음과 같이 작성을 하고 다음 명령으로 컴파일을 한다.

gcc -o stack1 stack1.c -m32 -fno-stack-protector 

그러면 위와 같이 stack1 실행파일이 생성된다.


먼저 stack1.c의 코드를 분석하면 다음과 같다.

1. modified 변수와 buffer 변수가 있다.

2. buffer의 크기는 64바이트이다.

3. 프로그램을 실행할 때 인자가 없으면 에러를 뱉어내고 종료한다.

4. modified 변수를 0으로 초기화한다.

5. 실행 시 받은 인자를 buffer에 복사한다.

6. modified의 값이 0x61626364이면 공격 성공

7. 그렇지 않으면 공격 실패


분석을 통해 알아낸 것은 modified 변수의 값은 절대 0x61626364 값을 가질 수 없는데 이 값을 가지고 분기를 한다는 사실과 buffer의 값을 프로그램 실행 시 입력을 받는 다는 것 그리고 buffer의 크기가 64바이트라는 것이다.

즉, buffer에 오버플로우를 일으켜 modified 변수를 변조시켜야 한다는 것이다.

다음 명령으로 공격을 해보자.

./stack1 `python -c 'print "A"*64 + "dcba"'`


공격이 성공한 것을 확인할 수 있다.


왜 이러한 현상이 발생하는지 그 원리를 살펴보도록 하자.

위 코드에서 strcpy로 buffer에 데이터를 저장한 뒤의 스택 상황은 위와 같다.

buffer에 64바이트 만큼 A가 채워지고 dcba가 modified 영역에 저장이 된다.

즉, 오버플로우가 발생해서 다른 변수에 영향을 주는 것이다.


이렇듯 strcpy와 같이 오버플로우에 취약한 함수를 사용하는 프로그램에 대해 버퍼 오버플로우 공격을 수행할 수 있다.

'NCS보안3기 > 시스템 해킹' 카테고리의 다른 글

[System Hacking] 메모리  (0) 2017.05.16
[System Hacking] CPU와 레지스터  (0) 2017.05.16
[System Hacking] 운영체제  (0) 2017.05.15
Posted by Imp3rio

- 스택


" 후입선출( LIFO : Last In First Out ) 방식에 의해 정보를 관리하는 데이터 구조. 스택에는 TOP이라고 불리는 스택의 끝부분에서 데이터의 삽입과 삭제가 발생한다. 즉, 스택에 데이터를 삽입하면 TOP 위치에 정보가 위치한다. 그리고 스택에서 정보를 읽어오려 하면 스택의 TOP 위치에 있는 정보가 반환된다. 따라서 스택에는 가장 나중에 삽입된 정보가 가장 먼저 읽히는 특징이 있다. "


컴퓨터 메모리상의 스택은 프로그램의 함수 내에서 정의되는데, 함수 종료와 동시에 사라지는 자동 변수가 저장되고 함수가 호출될 때 함수 내 로컬 변수 등이 저장되는 곳이다. 스택에 저장된 로컬 변수는 함수가 실행되는 동안만 존재하며 함수 실행이 종료되면 해당 변수들도 사라진다.


- 힙


" 프로그램의 실행 중 필요한 기억 장소를 할당하기 위해 운영체제에 예약되어 있는 기억 장소 영역. 프로그램 실행 중에 데이터를 저장하기 위해 기억 장소를 요청하면 운영체제는 힙에 존재하는 기억 장소를 프로그램에 할당한다. 프로그램에서는 기억 장치가 더 이상 필요 없으면 할당받았던 기억 장소를 운영체제에 반납하는데, 이때 운영체제에서는 반납된 기억 장소를 다시 힙에 돌려준다. 힙에 대한 기억 장소는 포인터를 통해 동적으로 할당되거나 반환되며 연결 리스트, 트리, 그래프처럼 동적인 특성이 있는 데이터 구조에서 널리 사용된다. "


힙은 프로그램이 실행될 때까지 미리 알 수 없는 가변적인 양의 데이터를 저장하기 위해, 프로그램의 프로세스가 사용할 수 있도록 예약되어 있는 메인 메모리의 영역이다. 


- 데이터 세그먼트


초기화된 데이터 세그먼트라고도 불리며, 초기화된 외부 변수나 static 변수 등이 저장되는 영역이다. 


- BSS 세그먼트


초기화되지 않은 데이터 세그먼트라고도 불리며, 프로그램이 실행될 때 0이나 NULL 포인터로 초기화되는 영역이다. 


- 텍스트 세그먼트


CPU에 의해 실행되는 머신 코드가 있는 영역으로, EIP가 다음에 실행하는 명령을 가리키고 있다.

'NCS보안3기 > 시스템 해킹' 카테고리의 다른 글

[System Hacking] Stack Buffer Overflow  (0) 2017.05.16
[System Hacking] CPU와 레지스터  (0) 2017.05.16
[System Hacking] 운영체제  (0) 2017.05.15
Posted by Imp3rio


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

연산장치는 CPU의 핵심 부분 중 하나로, 산술과 논리 연산을 수행하는 연산 회로 집합으로 구성된다.


   구성요소

 기능

 내부

 장치

 가산기

 덧셈 연산 수행

 보수기

 뺄셈 연산 수행, 1의 보수나 2의 보수 방식 이용

 시프터

 비트를 오른쪽이나 왼쪽으로 이동하여 나눗셈과 곱셈 연산 수행

 관련

 레지

 스터

 누산기

 연산의 중간 결과 저장

 데이터 레지스터

 연산에 사용할 데이터 저장

 상태 레지스터

 연산 실행결과로 나타나는 양수와 음수, 자리올림, 오버플로우의 상태 기억


- 제어장치( Control Unit )

제어장치는 입력, 출력, 기억, 연산 장치를 제어하고 감시하며, 주기억 장치에 저장된 명령을 차례로 해독하여 연산 장치로 보내 처리되도록 지시한다.


  구성요소

 기능

 내부

 장치

 명령 해독기

 명령 레지스터에 있는 명령을 해독하여 부호기로 전송

 부호기

 명령 해독기가 전송한 명령을 신호로 만들어 각 장치로 전송

 주소 해독기

 명령 레지스터에 있는 주소를 해독하여 메모리의 실제 주소로 변환한 후, 

 이를 데이터 레지스터에 저장

 관련

 레지

 스터

 프로그램 카운터

 다음에 실행할 명령의 주소 저장

 명령 레지스터

 현재 실행 중인 명령 저장

 메모리 주소 레지스터

 주기억 장치의 번지 저장

 메모리 버퍼 레지스터

 메모리 주소 레지스터에 저장된 주소의 실제 내용 저장


- 레지스터

레지스터는 처리 중인 데이터나 처리 결과를 임시 보관하는 CPU 내의 기억 장치로, 대개 연산 장치나 제어 장치에 함께 포함되어 있다.



- 레지스터 종류

1. 범용 레지스터

범용 레지스터는 연산 장치가 수행한 계산 결과의 임시 저장, 산술 및 논리 연산, 주소 색인 등의 여러 목적으로 사용될 수 있는 레지스터이며, EAX, EBX, ECX, EDX 등이 있다.


> EAX

입출력과 대부분 산술 연산에 사용된다.

다른 레지스터보다 EAX를 사용하면 더 효율적인 기계코드를 생성하는 명령어도 있다.


> EBX

DS 세그먼트에 대한 포인터를 주로 저장하며, ESI나 EDI와 결합하여 인덱스에 사용된다.

메모리의 주소 지정을 확장하기 위해 인덱스로 사용될 수 있는 유일한 범용 레지스터다.


> ECX

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


> EDX

입출력 연산에 사용하며 큰 수의 곱셈과 나눗셈 연산에서 EAX와 함께 사용된다.



2. 세그먼트 레지스터

세그먼트는 프로그램에 정의된 메모리상의 특정 영역으로, 코드, 데이터, 스택 등을 포함하며, 메모리의 대부분에 위치할 수 있다.


> CS( Code Segment )

코드 세그먼트는 실행될 기계 명령을 포함한다.

코드 세그먼트의 시작 주소를 가리키며, 일반 프로그래밍에서는 이 레지스터를 직접 참조할 필요가 없다.


> DS( Data Segment )

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

데이터 세그먼트의 시작 주소를 가리키는데, 프로그램은 참조하려는 데이터의 오프셋을 DS 레지스터에 저장된 주소 값에 더해 데이터 세그먼트 내에 위치해 있는 데이터의 주소를 참조한다.


> SS( Stack Segment )

프로그램이 실행될 때, 실행 과정에서 필요한 데이터나 연산 결과 등을 임시로 저장하거나 삭제할 때 사용된다.


> ES, FS, GS

메모리 주소 지정을 다루는 스트링 연산에 사용되고, EDI 레지스터와 함께 사용된다.



3. 포인터 레지스터

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


> EBP

스택 세그먼트에서 현재 호출되어 사용되는 함수의 시작 주소 값을 저장한다.

함수로 전달되는 지역변수 등을 참조할 때 기준이 되며, ESP 레지스터와 함께 사용되어 스택 프레임을 형성한다.


> ESP

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

스택은 상위 주소에서 하위 주소로 이동하며 데이터를 저장하므로 스택이 확장되면 스택 포인터도 상위 주소에서 하위주소로 값이 변경된다.


> EIP

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

현재 실행 중인 코드 세그먼트에 속한 현재 명령을 가리킨다.



4. 인덱스 레지스터

인덱스 레지스터는 데이터를 복사할 때 출발지와 목적지 주소를 각각 가리키는 레지스터로 사용된다.


> ESI & EDI

주로 메모리의 한 영역에서 다른 영역으로 데이터를 연속적으로 복사할 때 사용된다.


5. 플래그 레지스터

크기가 32비트로, 컴퓨터의 다양한 상태를 나타내는 비트를 포함한다.


> 상태 플래그

상태플래그는 산술 명령 결과를 반영한다.

- CF : 산술 연산 결과로 자리올림이나 자리내림이 발생할 때 세트된다.

- ZF : 산술 연산 결과가 0이면 세트된다.

- OF : 부호가 있는 수의 오버플로우가 발생하거나 MSB가 변경되었을 때 세트된다.

- PF : 산술 연산 결과가 짝수면 세트된다.

- AF : 8비트 피연산자를 사용한 산술 연산에서 비트 3에서 비트 4로 자리올림이 발생하면 세트된다.

- SF : 산술 및 논리 연산의 결과로 음수가 생기면 세트된다.


> 제어 플래그

DF는 스트링 명령을 제어한다. 

DF가 1이면 스트링 명령은 자동 감소된다. 

DF가 0이면 스트링 명령은 자동 증가된다.


> 시스템 플래그

시스템 플래그는 운영체제나 장치 드라이버를 제어한다.

'NCS보안3기 > 시스템 해킹' 카테고리의 다른 글

[System Hacking] Stack Buffer Overflow  (0) 2017.05.16
[System Hacking] 메모리  (0) 2017.05.16
[System Hacking] 운영체제  (0) 2017.05.15
Posted by Imp3rio

시스템 해킹을 위한 기초 지식은 다음과 같다.

1. 운영체제

2. CPU와 레지스터

3. 메모리

4. 어셈블리어

5. 스택



1. 운영체제


- 개념

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


- 기능

> 사용자 명령 인터페이스

사용자와 시스템의 대화 수단.

셸, GUI( Graphic User Intercafe )


> 서브 시스템 관리자

# 메모리관리자

프로그램의 메모리 요청에 대해 적합성을 점검하고, 적합한 경우 메모리를 할당한다.

또한 할당된 메모리를 다른 프로그램이 접근하지 못하게 괸라하고 보호하며, 프로그램 종료 시에는 할당된 메모리를 회수한다.


# 프로세서 관리자

명령어들이 체계적이고 효율적으로 실행되도록 작업 스케줄링하고 사용자의 작업 요청을 수용하거나 거부한다.


# 장치 관리자

프린터, 디스크 드라이버, 모뎀, 모니터 등, 시스템 내의 모든 장치를 프로그램에 할당하거나 회수한다.


# 파일 관리자

시스템 내의 데이터, 응용 프로그램 등의 모든 파일에 사용자별로 파일 접근 권한을 부여하고, 접근 권한에 따라 파일을 할당하고 해제한다.


# 네트워크 관리자

네트워크에서 접근 가능한 CPU, 메모리, 프린터 등과 같은 자원을 관리한다.



2. 윈도우


- 커널

커널은 운영체제의 중심에 위치하며, 운영체제에서 어떤 작업을 시작하더라도 커널의 동작에 의해 제어된다. 즉, 커널은 인터럽트 처리, 프로세스 관리, 메모리 관리, 파일 시스템 관리, 프로그래밍 인터페이스 제공 등 운영체제의 기본 기능을 제공하는 핵심이라 할 수 있다.


- 커널 구조


커널모드는 기본적으로 사용자가 접근할 수 없는 영역으로, 프로그램의 실행과 관련한 기본관리 시스템이 여기에 존재한다. 윈도우는 프로그램을 만들고 실행하는 모든 과정이 사용자 모드에서만 가능하도록 설계되었으나, 완벽하게 구현되지는 않았다. 예를 들면 윈도우에서는 마이크로 커널이 HAL을 무시하고 하드웨어와 통신할 수 있는 가능성이 있으며, 이는 윈도우가 링 구조를 완전히 적용한 운영체제가 아니라는 것을 보여준다. 그리고 이런 점이 보안의 허점을 만들어낸다.


- 윈도우 시스템의 구조

> HAL( Hardware Abstraction Layer )

윈도우에서는 리눅스/유닉스에서와 달리 새로 개발된 하드웨어를 시스템에 장착해도 드라이버 개발자가 새로운 장치에 대한 모든 것을 알 필요가 없다. 드라이버 개발자와 하드웨어 개발자는 윈도우에서 제시한 기본 표준만 따르면 되는데 그 표준이 HAL이다.


> 마이크로 커널( micro kernel )

본래 커널은 프로세스의 스케줄링이나 메모리 관리, 데이터의 입출력, 하드웨어 제어 같은 일을 했다. 그러나 윈도우에서는 이를 여러 관리자에게 분담시키고 커널은 하드웨어와의 통신만 제어하는 최소한의 커널이 되었다. 


> 입출력 관리자

시스템의 입출력을 제어한다.

장치 드라이버 사이에서 메시지를 전달한다. 또한 응용 프로그램이 하드웨어와 곧바로 통신할 수 있는 통로를 제공한다.


> 객체 관리자

윈도우는 파일, 포트, 프로세스, 스레드 등의 모든 것이 객체로 정의된다. 

객체 관리자는 이런 각 개체들에 대한 정보를 제공한다.


> 보안 참조 관리자

각 데이터나 시스템 자원의 제어를 허가하거나 거부함으로써 시스템의 강제 보안 설정을 책임진다.


> 프로세스 관리자

스레드를 생성하고 요청에 따라 처리한다.


> 로컬 프로시저 호출 관리자

각 프로세스는 서로의 메모리 공간을 침범하지 못하므로 프로세스 간 통신이 필요한 경우에 이를 대신해 줄 수 있는 장치가 필요하다. 그 장치가 로컬 프로시저 호출 관리자다.


> 가상 메모리 관리자

응용 프로그램의 요청에 따라 RAM의 메모리를 할당하고, 가상 메모리의 페이징을 제어한다.


> 그래픽 장치 관리자

화면에 선이나 곡선을 그리거나 폰트 등을 관리한다.


> 기타 관리자

캐시 관리자, PNP 관리자, 전원 관리자 등이 있다.



윈도우는 여러 응용 프로그램을 실행하기 위해 몇 가지 서브 시스템을 동작하는데, 가장 기본 서브 시스템으로 Win32가 있다. 이는 32비트 응용 프로그램이 동작할 수 있게 도와주고, 기본 윈도우 사용자 인터페이스를 제공한다. 즉, 비디오 디스플레이, 키보드, 마우스 등을 지원한다.

이외에 보안 서브 시스템과 유닉스 운영체제에 기반을 둔 일련의 표준 운영체제 인터페이스로 POSIX가 있다. 보안 시스템은 사용자가 로그인할 때 데이터를 보호하고, 운영체제가 이를 제어할 수 있도록 만든다.



3. 리눅스/유닉스


- 커널

> 모놀리식 커널

거대한 커널이 모든 기능을 수행하도록 만들어졌으며, 안정적이지만 문제가 발생할 경우 부분 수정이 어렵다.


> 마이크로 커널

여러 개의 모듈이 모여 하나의 커널을 이룬다.

개별 모듈의 업로드와 언로드가 가능하다.

각 모듈의 권한이 동일하여 잘못 된 모듈을 업로드할 경우 커널 전체가 망가질 수 있다.


- 구조

> 프로세스 제어

프로세스 간 통신, 스케줄링, 메모리 관리를 구현한다.


> 장치 드라이버

하드웨어와 소프트웨어를 연결해주는 인터페이스를 제공한다.


> 파일 서브 시스템

하드 디스크와 같은 저장 공간에 유닉스의 파일을 저장하고 읽는 역할을 한다.


> 셸

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


- 셸 기능

* 자체의 내장 명령어 제공

* 입력/출력/오류의 방향 변경

* 와일드카드

* 파이프라인

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

* 서브 셸 생성

* 백그라운드 처리

* 셸 스크립트 작성

'NCS보안3기 > 시스템 해킹' 카테고리의 다른 글

[System Hacking] Stack Buffer Overflow  (0) 2017.05.16
[System Hacking] 메모리  (0) 2017.05.16
[System Hacking] CPU와 레지스터  (0) 2017.05.16
Posted by Imp3rio