Software/소프트웨어보안

컴퓨터의 구조 및 소프트웨어 실행 원리, C언어와 어셈블리어, Stack

와븨 2022. 10. 21. 23:11

컴퓨터의 구조 및 소프트웨어 실행 원리

1. 언어별 실행환경의 차이

- Low-level programs은 메모리를 직접 다룸

- Advantage: 효과적이고, 정확한 제어가 가능

- Disadvantage: 데이터의 추상화원칙을 위배 가능

  • 메모리의 임의 접근
  • 포인터 및 포인터 연산
  • 안전한 메모리 사용 실패

 

2. 안전한 메모리 사용

명확하게 지정된 메모리 영역만을 사용하도록 하기 위해 강력하게 지켜져야 하는 규칙

  • 다른 프로그램의 메모리 영역 절대 접근 불가
  • 현재 함수의 접근가능 메모리 영역 외의 영역의 접근 통제

 

3. 코드와 데이터

  • 폰 노이만 모델 : Code와 data를 동일 시 함
  • 폰 노이만 컴퓨터 구조 : 해당 모델을 하드웨어 형태로 개발, 컴퓨팅 환경의 혁명의 기폭제

문제점

  • 데이터와 코드가 같은 경로를 사용
  • 데이터와 코드의 경계가 불분명해짐
  • 코드가 스스로 갱신되는 것의 불안전성

 

4. C언어와 Java

C언어

Java

 

5. Process와 Memory

Process : 실행중인 프로그램

Process의 영역

  • 코드 : 컴파일 된 프로그램이 위치
  • 데이터 : 논리가 없는 프로그램의 변수들이 위치 (전역변수/정적변수/동적할당메모리)
  • 스택 : 실행 중인 함수를 위한 동적 메모리 할당 공간 - 지역 변수, 실행 중인 객체의 주소, 리턴 주소

운영체제 마다 메모리의 보호 정도가 다름

 

 

C언어와 어셈블리어

Pointers to memory locations (&val, *ptr)

  • 문자열의 길이가 가변적이고 NULL로 끝남
  • 고정크기의 구조체에 값을 저장
  • malloc()을 활용한 동적 메모리 할당

Function return code conventions

특정 에러에 대해 관대함

  • type errors
  • unintialized variables

컴파일러에 다라 다른 반응 (Strong Warning)

  • 에러 마저도 다르게 나타남
  • C 코드 내에 방어적 코딩이 되도록 조치 함

 

1. 어셈블리어

- 가장 기본적인 컴퓨터 구조

  • Processor
  • Memory
  • 외부 입력장치
  • 이들을 연결해주는 system bus

 

- 메모리는 피라미드 계층구조를 갖고 있음

  • 용량
  • 비용
  • 속도 (지연, 대역폭)

- 프로세서의 레지스터는 모두 기억하고 있어야 함

 

- 범용 레지스터 용도

  • AX : 누산 레지스터 또는 연산 레지스터. 계산에 주로 사용
  • BX : 베이스 주소 레지스터. 메모리 주소를 계산할 때 사용
  • CX : 카운터 레지스터. 반복문에서 지금 몇 번째로 반복하고 있는지를 기억할 때 사용
  • DX : 데이터 레지스터. 계산의 결과 값을 저장하거나 메모리에서 읽어온 데이터를 저장
  • SI : 소스 인덱스 레지스터. 메모리 복사 등에서 원본 데이터의 주소를 저장
  • DI : 목적지 인덱스 레지스터. 메모리 복사 등에서 목적지 주소를 저장할 때 사용
  • BP : 베이스 포인터 레지스터. 스택 주소를 보존하는 데 사용
  • SP : 스택 포인터 레지스터. 현재의 스택 주소 저장

- 세그먼트 레지스터 용도

  • CS : 현재 프로그램이 저장된 세그먼트의 주소
  • DS : 현재 사용한느 데이터가 저장된 세그먼트의 주소
  • ES : 별도의 용도는 없고 필요할 때마다 원하는 메모리 위치의 세그먼트 주소를 저장
  • SS : 스택 있는 세그먼트의 주소가 저장

- 특수 레지스터 용도

  • IP : 명령어 포인터 레지스터. 현재 수행할 명령어의 주소
  • 플래그 레지스터 : 프로세서의 상태

 

 

Stack

Abstract Data Type 원칙 : 데이터를 접근하기 위한 전용 ADT Operation, ADT Operation을 통한 데이터의 표현 가능

스택 ADT의 Last-in-First-out : push(X), pop()

*push(x) : x를 스태그이 맨 위로 추가

*pop() : 맨 위의 데이터를 리턴하고 제거

 

Stack에서의 배치