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() : 맨 위의 데이터를 리턴하고 제거