- 연산장치( 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

이전 포스팅에서 데이터를 추출하는 실습을 했다.

이번에 할 실습은 변조된 vhd를 복구시키는 실습이다.



  - [FAT32_2_1] 파일은 압수한 USB의 vhd 파일이다.



  1. 위의 이미지는 VBR영역과 FAT영역 일부가 손상되었다.

  2. 파일시스템이 정상적으로 동작할 수 있도록 손상된 데이터를 복구하시요.

  3. 정상적으로 작동하는지 가상디스크에 장착하여 확인하시요. 




* 실습파일( LINK )


다운로드 한 실습파일을 압축풀면 FAT32_2_1 파일이 만들어진다.

해당 파일을 FTK Imager로 열어보면 다음과 같이 나타난다.


파티션이 하나 있지만 어떠한 데이터도 존재하지 않는 것을 알 수 있다.

해당 파일을 HxD 에디터를 이용해 열어보면 다음과 같다.

빨간 박스로 표시된 부분을 보면 FAT32로 파티션 되어있는 것을 알 수 있다.

하지만 FTK Imager로 열었을 때 해당 파티션에서 데이터를 확인할 수 없었다.

FAT32의 VBR을 찾아가 보면 다음과 같다.

표시된 부분이 변조되어 있다.

순서대로 Byte per Sector, SP, RS, Hidden, Total Partition Size, FAT Size이다.

Hidden, Total Partition Size 부분은 알 수가 있다.

VBR의 위치가 128이기 때문에 Hidden은 80 00 00 00이다.

그리고 Total Partition Size 정보는 MBR에 나와 있다.

SP의 경우 기본적으로 512 바이트를 사용하며, 2048 바이트를 사용하기도 한다.

이를 토대로 수정한 VBR은 다음과 같다.

현재 확인할 수 없는 것들은 SP, RS, 그리고 FAT Size이다.

SP의 값을 찾기 위해 FSINFO 부분을 가면 다음과 같다.

표시된 부분은 남은 클러스터의 수와 다음에 할당할 클러스터에 대한 정보이다.

남은 클러스터의 수를 보면 D8 C0 07 00으로 이 값을 계산하면 508,120이다.

그리고 파티션의 총 크기는 앞서 본 것처럼 00 81 1F 00이며 이 값은 2,064,640이다.

즉, 508,120 을 4배하면 대략 총 크기와 비슷하다는 것을 확인할 수 있다.

이 말은 SP가 4임을 알 수 있다.( Sector 단위는 64바이트이기 때문이다. )


다음에 확인할 것은 Root Directory인데,  RS를 모르기 때문에 Root Directory를 찾아갈 수가 없다.

우선 FAT 테이블을 확인하기 위해 FAT의 시그니처 8F FF FF 0F 를 찾아가 보자.

12459 섹터에 FAT 테이블이 존재한다. VBR에서 FAT이 2개있음을 확인했다. 해당 섹터 이후에 FAT 테이블이 존재하는 지 확인해보자.

해당 시그니처는 더 이상 없는 것을 확인할 수 있다. 따라서 12459 섹터에 있는 FAT 테이블은 2 번째 테이블임을 추측할 수 있다. 즉, 위 어딘가에 FAT 1이 있음을 알 수 있다.


문제에서 USB의 vhd라는 힌트를 줬기 때문에 USB 문자열을 찾아보자.

그러면 위와 같이 16512 섹터가 탐색이 되며, 구조를 보면 Directory Entry의 구조를 갖고 있다.

이를 통해 FAT Size를 구할 수 있는데 계산은 다음과 같이 한다.

16,512( Directory Entry ) - 12,459( FAT 2 ) = 4,053

이제 FAT 1의 위치를 다음과 같이 구할 수 있다.

12,459 - 4,053 = 8406


해당 위치로 가보면 다음과 같은 화면을 볼 수 있다.

FAT 1의 데이터가 모두 변조되어 있음을 알 수 있다.

FAT 2의 데이터를 복사해 FAT 1에 붙여 넣자.

위와 같이 수정을 하고 VBR을 수정한다.

RS와 FAT Size를 수정해야 하는데, FAT Size는 4,053임을 알았다.

RS는 다음과 같이 구할 수 있다.

8,406( FAT 1 ) - 128 = 8,278

4,053과 8,278 을 16진수로 바꾸면 각각 0xFD5, 0x2056이다.

이 값들을 리틀엔디언으로 수정하면 다음과 같다.

이제 파일을 저장한 뒤 FTK Imager로 열어보면 다음과 같은 화면을 확인할 수 있다.


Posted by Imp3rio