'ITPE > 자료구조' 카테고리의 다른 글

8-puzzle (A*)  (0) 2021.04.08
B tree  (0) 2021.04.07

 

 

 

I. B-Tree의 개념

. B-Tree의 정의

   - 하나의 노드가 가질 수 있는 자식 노드의 최대 숫자가 2보다 큰 이진트리의 확장형 트리구조

. B-Tree의 개념도 및 설명

구 분 항 목 설 명
개념도
구조 Root node 최소 2개의 자식노드 보유, 최소 한 개의 값 보유
Internal node 최대 m개의 자식노드 보유(차수가 m일 경우)
Leaf node 최하위 노드는 동일레벨로 구현
특징 자식노드 수 리프, 루트를 제외한 노드는 최소 m/2개의 자료 보유
균등 탐색 속도 최악의 경우가 존재하지 않아 시간복잡도는 O(logN)으로 일정
효율성 자식노드를 많이 보유하여 트리의 높이가 줄어들어 효율성 확보
정렬상태 각 노드에 입력된 자료는 정렬된 상태로 존재
유형 B+ Tree 인덱스 세트(index set)와 순차세트(sequence set)로 구성된 트리
B* Tree 리프, 루트를 제외한 노드가 최소한 2/3가 채워지도록 제한한 트리

- 중복된 자료는 입력 불가하며, 데이터 추가 및 삭제시 항상 Leaf노드에서 수행

 

 

 

 

 

II. B-Tree의 삽입 연산 설명 및 삽입과정 설명

 . B-tree의 삽입 연산 설명

구 분 항 목 설 명
기본연산 Insert 새로운 값은 항상 Leaf노드에 삽입
하향 탐색 새로운 값 추가시, 하향탐색하며 꽉찬 노드는 분할하며 진행
분할연산
(Split)
분할노드가
Root인 경우
Left child, Right child 생성후, 중앙값은 Root, 나머지 값들은 자식노드에 분할하여 배치
분할노드가
Root가 아닌경우
- 왼쪽 노드는 이미 있는 노드이므로, 오른쪽 노드만 생성
- 이후, 중앙값을 부모에 삽입하고, 왼쪽과 오른쪽 노드로 분할 배치

- 분할해야할 경우를 Overflow라고 하며, 분할결과 부모노드도 Overflow발생시 분할 반복수행

 

 . 1, 2, 3, 4, 5, 6 순서대로 삽입되는 과정 설명

- Overflow 발생시 분할하여 부모노드에 배치

 

 

 

 

III. B-Tree의 삭제 연산 설명 및 삭제과정 설명

. B-tree의 삭제 연산 설명

구 분 항 목 설 명
삭제 원칙 자료수 보장 삭제후 자료수가 M/2 이상이 되도록 보장해야하는 원칙
Borrow node - 형제노드가 M/2보다 많은 자료를 가지고 있을경우 빌려오기 수행
- 부모노드에서 빌려오고, 형제노드에서 부모노드로 이동
Bind node 형제노드에게서 빌려오기 불가시, 병합 수행
삭제 연산 내부노드 삭제 - 대체키를 찾아 Swap 연산 수행
- 대체키는 Left subtree중 가장 큰값이나, Right subtree중 가장 작은값을 이용
- 이후 대체된 값을 Leaf에서 삭제 수행
Leaf노드 삭제 자료 삭제후, Balance를 위해 borrow bind 연산 수행

- M/2보다 자료가 적을 경우를 underflow라고 하며, 이럴경우 balance 유지를 위한 연산 수행 필요

 

. 3, 4, 5 순서대로 삭제되는 과정 설명

- 해당 과정에서는 SwapRight Subtree의 최소값을 이용

 

 

 

'ITPE > 자료구조' 카테고리의 다른 글

8-puzzle (A*)  (0) 2021.04.08
MST(Minimum Spanning Tree)  (0) 2021.04.08

 

 

 

[정의] 힙 데이터 영역에서 발생하는 버퍼 오버플로의 한 종류로, 동적 메모리 할당 연결(malloc 메타 데이터 같은)을 겹쳐쓰고 프로그램 함수 포인터를 겹쳐쓰기 위해 결과로 나온 포인터를 교환하는 기법.

 

[개념] 프로그램이 실행되면, 실행에 필요한 정보들이 메모리 영역에 올라가는데 크게는 코드 영역, 데이터 영역, 스택 영역, 힙 영역 으로 구분.
- 코드영역 : 프로그램의 코드가 올라가는 영역, 여기서코드란, 컴파일된 기계어코드
- 데이터영역: 전역변수와 정적변수등이 할당되는영역. 초기화된 데이터는 data 영역에 저장. 초기화 되지 않은 데이터는 bss 영역에 저장
- 스택영역 : 지역변수와 매개변수가 저장되는 영역
- 힙영역 : 빈공간, 필요에 의해 메모리를 할당 및 해제(컴파일러가 예측 할 수 없는, 프로그래머가 관리하는 영역)


[스택 대신 힙영역 사용이유]
- 동적할당, 컴파일시기에 크기를 알수없는 데이터, 컴파일할때는크기를 알지 못하다가, 프로그램이 실행되었을때 크기가 결정되는 경우에 사용


[원리] Heap 영역의 낮은 주소에 있는 버퍼가 넘쳐서 다른 버퍼를 침범하여 발생

 

 

 


[예시] 


1) 두 개의 heap 메모리인 input과 secret을 할당한 뒤, secret 파일을 읽어서 두 번째로 할당했던 secret 영역에 저장
2) 그 후 input 영역에 입력 값을 받고 출력시켜주는 간단한 코드
3) 취약점은 read 함수, input으로 할당한 메모리 크기는 40 바이트이지만
read 함수를 통해 최대 100 바이트까지 입력할 수 있어 Heap Overflow 가 발생
4) Heap Overflow를 이용해서 secret 에 할당된 메모리 영역의 직전까지 데이터를 채워주면,
문자열이 연결되어 printf 함수가 secret 메모리의 값까지 출력 됨.
5) 40 바이트 만큼 할당 한다면 input 에 할당된 메모리와 secret 에 할당된 메모리의 거리차이는 40 바이트
6) 40 바이트를 할당한다고 해서 딱 40 바이트만 할당되는 것은 아니고
메모리의 할당과 해제를 관리하기 위한 정보들이 함께 들어가기 때문에 실제 할당되는 사이즈는 조금 늘어나게 됨.
그래서 문자열의 길이를 조금 늘려주면 Heap Overflow 를 이용한 Leak 이 가능
7) 만약 뒤쪽에 함수 포인터가 존재한다면 그 부분을 조작하여 프로그램의 실행 흐름을 변조도 가능

 

 

 

'ITPE > 보안' 카테고리의 다른 글

Buffer Overflow 공격  (0) 2021.04.01
IP Spoofing  (0) 2021.04.01
Slack Space 분석  (0) 2021.03.30
DNSSEC  (0) 2021.03.28
IPSec(IP Security)  (0) 2021.03.28

+ Recent posts