○Position

 ▷위치를 나타내는 자료구조

 ▷하나의 object가 저장되어있음. (장소를 통해 object 접근)

 ▷ex) a cell of an array, a node of a linked list

 ▶메서드

  ▷object p.element(): position의 element(object)를 반환함.

   ▷C++에서 *p로 해석됨.

 

 

○Node List

 ▷데이터를 저장하는 Sequence of positions

 ▷position간의 앞/뒤 관계로 구성

 ▷Doubly Linked List와 거의 동일한 ADT

 

 ▶Method

  ▶iterators

   ▷begin(): 가장 앞의 position 반환.

   ▷end(): 가장 뒤의 position 뒤에 있는 가상의 position 반환.

  ▶Update methods

   ▷insertFront(e): 가장 앞에 해당 element를 가진 position 추가

   ▷insertBack(e): 가장 뒤에 해당 element를 가진 position 추가

   ▷removeFront(): 가장 앞의 position 제거

   ▷removeBack(): 가장 뒤의 position 제거

  ▶iterator-based update

   ▷insert(p, e): position p의 앞에 e를 가진 position 추가.

   ▷remove(p) : position p 제거.

  ▶Generic methods

   ▷size(): 

   ▷empty(): 

 

 ◎Doubly Linked List - Node List

  ▷거의 동일한 ADT이기 때문에 D.L.L 로 Node List를 만들 수 있다.

  ▷Insert(p,e)

  ▷remove(p)

 

  ▶성능

   ▷size, empty: O(n)

   ▷insert, remove: O(1)

   ▷element: O(1)

'컴퓨터 지식 > 자료구조' 카테고리의 다른 글

Sequence  (0) 2020.11.20
Iterator, Container  (0) 2020.11.06
Array Lists(Vector)  (0) 2020.11.02
Adapter  (0) 2020.10.28
Deque  (0) 2020.10.28

○Buffer Overflow

 ▷배열의 index로 기존 배열에 할당된 공간을 벗어나 접근하는 것.

 ▷보안상에서 큰 문제가 될 수 있다. (RET값을 바꾸어 다른 함수로 접근가능)

 

 ▶Buffer Overflow에 취약한 함수들

  ▷strcpy, strcat : 문자열 복사

  ▷gets / scanf, fscanf, sscanf의 %s : 문자열 입력

 

 ◎gets의 buffer overflow

  ▷gets 함수

  ▷예제

   ▷call_echo가 echo를 부름 (stack frame)

  ▷입력값

   ▷25글자부터 error 출력.

 

  ▷해석

   ▷char buf[4] -> 24byte 할당됨. (넉넉히 할당 - 컴파일러마다 다름)

   ▷24글자부터 Return Address에 영향을 미침. (24 char + 1 /nul)

    ▷24글자가 Error가 안일어나는 이유 : 운이 좋아서 RET가 바뀌어도 상관없는 위치로 바뀌었다.

    ▷-> RET가 바뀌어도 바로 Error을 일으키지 않음, 원하는 위치로 RET위치 변경 가능

 

○Code Injection Attack

 ▷exe 코드를 나타내는 byte를 포함하는 String을 입력.

 ▷RET를 exploit 코드쪽의 위치로 포함하는 위치로 바꿈.

 ▷gets를 사용하는 함수가 RET를 하면, exploit code로 jmp함.

 ▷->특정 코드를 실행하도록 유도가능.

 ▷ex) Internet Worm, IM wars ...

 

 

 ※Worm과 Virus

  ▷worm: 혼자 실행가능한 프로그램, 알아서 다른 컴퓨터로 번식시킴.

  ▷virus: 다른 프로그램에 첨가되는 코드. 독립적으로는 실행 불가.

 

 

 ▶취약점 해결

  ▶취약한 코드(함수)를 사용하지 않는다.

   ▷gets -> fgets

   ▷strcpy > strncpy

   ▷scanf -> fgets (문자열 읽을때) / %ns (n: 크기)

 

  ▶System-Level Protection

   ▶Randomized stack offsets

    ▷Stack이 할당될 때, 랜덤으로 공간을 추가로 할당

    ▷해커가 Address 예측이 힘들도록 함.

   ▶Nonexecutable code segements

    ▷Stack의 실행권한 제거

    ▷Stack에서 exe 코드를 실행할 수 없음.

 

  ▶Stack Canaries

   ▷버퍼에 Overflow를 감지하기 위한 특정 값을 배치함. (Canary)

   ▷함수에서 나가기 전에 Canary가 변경되었는지 확인 (변경 -> Overflow가 일어났음, 에러)

   ▷GCC 컴파일러에서 기본적으로 제공 (-fnostack-protector -> 사용하지 않음)

 

○Return Oriented Programming Attacks

 ▷ret 근처의 어셈블리 코드 조각들(gadgets)를 이용해서 원하는 결과를 도출해낸다.

 ▷Stack Randomization, nonexecutable stack을 통해 Code injection이 불가능해진 경우 사용

 ▷Stack Canary가 적용된 경우, 할 수 없다. (ret값을 건드리기 때문)

 

 ▶gadget

  ▷ret(0x03)으로 끝나는 명령들

  ▷실행 가능한 고정된 코드 위치

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

RAM  (0) 2020.11.12
Union  (0) 2020.11.10
Memory Layout  (0) 2020.11.05
Assembly - Floating Point  (0) 2020.11.03
Assembly - Structure  (0) 2020.11.03

○Memory Layout (x86-64 Linux)

 ▶Stack

  ▷Runtime stack

 

 ▶Heap

  ▷필요할 때 동적으로 할당되는 공간

 

 ▶Data

  ▷정적으로 할당된 데이터들

 

 ▶Text / Shared Libraries

  ▷실행가능한 기계 명령어들

  ▷Read-only

 

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Union  (0) 2020.11.10
Buffer Overflow  (0) 2020.11.05
Assembly - Floating Point  (0) 2020.11.03
Assembly - Structure  (0) 2020.11.03
Assembly - Array  (0) 2020.10.29

○Assembly - Floating Point

 ▷소수 표현을 위해  별도의 레지스터(XMM Registers) 사용

 ▷XMM 하나는 16바이트를 차지하고, 각 공간을 나눠쓸 수 있음.

 ▶SIMD (Single Instruction Multi Data)

  ▷한번의 명령으로 여러개의 데이터 연산

 

 ▶매개변수, 리턴값

  ▷매개변수들은 %xmm0, %xmm1... 들을 통해 전달됨.

  ▷return값은 %xmm0에 저장됨.

  ▷모든 XMM registers는 Caller-saved임. (호출전에 저장해야함)

 

 ▶명령

  ▷XMM과 XMM사이, XMM과 일반 레지스터 사이의 명령이 다름.

  ▷명령이 매우 많음. (다양한 포멧)

  ▷비교: ucomiss, ucomisd (CF, ZF, PF)

  ▷상수를 바로 사용 불가능함. (0: xorpd %xmm0, %xmm0 / 다른 것들은 메모리에서 불러옴)

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Buffer Overflow  (0) 2020.11.05
Memory Layout  (0) 2020.11.05
Assembly - Structure  (0) 2020.11.03
Assembly - Array  (0) 2020.10.29
Assembly - Procedure  (0) 2020.10.28

○Assembly - Structure

 ▷Structure: 서로 다른 Type을 가진 변수들의 집합

 ▷연속된 메모리 공간을 차지함.

 ▷변수가 선언된 순서대로 메모리를 차지.

 ▷각 변수가 차지하는 크기가 일정하지 않음. -> 컴파일러가 offset을 계산해야함.

 

 ▶Memory Alignment

  ▶기본 데이터 타입이 K 바이트가 필요하다면, Address는 K의 배수여야 한다.

   ▷1 byte: char, ...

   ▷2 bytes: short, ...

   ▷4 bytes: int, float, ...

   ▷8 bytes: double, long, char*, ..

   ▷16 bytes: long double(GCC on linux)

 

  ▷메모리는 데이터를 4/8바이트를 블록으로 묶어 가져온다.

  ▷Align되어있지 않다면, 4/8바이트의 데이터를 위해 2개의 블록을 가져와야할 수 있다. -> 속도 저하

  ▷변수의 선언 순서에 따라 차지하는 크기가 다를 수 있다. -> 큰 크기의 데이터부터 넣는게 가장 크기가 작다.

 

  ▷Structure에서 가장 큰 Alignment Requirement가 K라면, Structure의 시작 주소는 K의 배수여야 한다.

   ▷Structure의 배열에서도 각 원소에 대해 적용된다.

 

 ▶Memory Accessing

  ▷멤버 변수의 위치를 계산해서 접근

  ▷구조체 배열인경우, 배열 위치 + 구조체크기*index + 멤버 변수 위치로 계산

 

'컴퓨터 지식 > 시스템' 카테고리의 다른 글

Memory Layout  (0) 2020.11.05
Assembly - Floating Point  (0) 2020.11.03
Assembly - Array  (0) 2020.10.29
Assembly - Procedure  (0) 2020.10.28
Assembly-Control  (0) 2020.10.13

+ Recent posts