C, Python, Assembly 언어 등의 기본적인 이해가 필요함
메모리 구조에 대한 이해
메모리에 대해 공부할 때 segment가 많이 나온다.
OSI 7 layer에서 1계층은 bit, 2계층은 frame, 3계층은 packet, 4계층은 segment, 5~7계층은 data이다.
컴퓨터에서 메모리는 stack이라는 구조로 저장이 된다.
pop: 데이터인출 (데이터를 꺼내오는 과정)
FIFO(First In First Out): 선입선출
LIFO(Last In First Out): 후입선출 → stack
cpu는 사용자가 명령 같은 것을 내리면 ‘연산’을 해야한다.
ALU: Arithmetic Logical Unit (산술논리연산장치)
register
cache memory: L1, L2로 나눠져있고 cpu 내부에 있다. 캐시메모리의 용량이 크면 cpu의 성능도 빠르다.
그래서 클럭이 같아도 cache memory의 크기에 따라 성능에 차이가 생긴다.
- 코드(Code) 세그먼트(Segment): 읽기, 실행 권한
실행 가능한 기계 코드가 위치하는 영역, 텍스트 세그먼트라고도 함.
int main() {return 31337;} - 554849~~~~dc3
31337을 기계어로 바꾸게 되면 위처럼 된다.
- Data Segment(데이터 세그먼트): 쓰기 O / 쓰기 X (rodate - readonly data)
컴파일(Compile) 시점에 값이 정해져 있는 전역 변수 및 전역 상수들이 위치
상수: 프로그램이 끝날 때까지 변하지 않는 수
변수: 변하는 수
int data_num = 31337;
char data_rwsrt[] = “writable_data”;
↑문자열을 담을 수 있는 빈 데이터
const char data_rostr[] = “readonly_data”;
↑문자형 상수
char “str_ptr = “readonly”;
int main() {……..}
int main() {……}
- BSS(Block Standard by Symbol Segment) : 읽기 / 쓰기
컴파일 시점에 값이 정해지지 않은 전역 변수가 위치하는 메모리 영역
int bss_data; // 선언
int main() {
int bss_data = 31337
printf(“bss_data);
return 0;
}
- 힙(Heap) 세그먼트: 읽기, 쓰기
힙 데이터가 위치하는 메모리 영역, 실행중에 동적으로 할당이 가능
Malloc(), calloc() 등을 호출해서 할당받는 메모리
int main() {
int “heap_data = malloc(sizedof(*heap_data));
*heap_data = 31337;
printf(“*heap_data);
return 0
}
- Stack Segment: 읽기, 쓰기
프로세스의 스택이 위치하는 영역, 함수의 인자나 지역 변수와 같은 임시 변수들이 실행중에 저장 스택 프레임(stack frame) 단위로 사용 - 함수가 호출될 때 생성되고 함수가 반환될 때 해제
def Stack(num1, num2) ;
sum = num1 + num2;
print(sum)
void main() {
int choice = 0;
scanf(&choice);
if(choise)
call_true();
else
call_false();
return 0;
컴퓨터 과학 - 컴퓨터 구조 / 명령어 집합구조 / 인텔(x86_64)구조
컴퓨터 구조 - 컴퓨터가 효율적으로 작동할 수 있도록 하드웨어 및 소프트웨어의 기능을 고안하고, 이들을 구성하는 방법
- 기능 구조 / 명령어 집합구조 / 마이크로 아키텍처 / 하드웨어 및 컴퓨팅 방법론
기능 구조 - 폰 노이만 구조, 하버드 구조, 수정된 하버드 구조
Bus → 속도가 다른 장치간 연결
- 명령어 집합 구조 - x86 / x86_ 64 / ARM /MIPS / AVR 등
ISA - Instruction Set Architecture -> CPU가 해석하는 명령어의 집합을 의미
x86_64 아키텍처 : 레지스터
CPU가 데이터를 빠르게 저장하고 사용할 때 이용하는 보관소(일종의 메모리)이며 산술 연산에 필요한 데이터를 저장하거나 참조하는 등 다양한 용도로 사용
- 범용 레지스터(General) / 세그먼트 레지스터 / 명령어 포인터 레지스트(Instruction Pointer) / 범용 레지스터 - 주용도는 있으나 그 외 다른 용도로도 사용될 수 있는 레지스터(8byte)
rax(accumulator register): 함수의 반환 값
rbx(base register): 주된 용도는 없음
rcx(counter register): 반복문의 반복 횟수, 각종 연산의 시행 횟수를 보관
rdx(data register): 주된 용도는 없음
세그먼트 레지스터 - 6가지의 세그먼트가 존재, 각 레지스터의 크기는 16비트이다.
cs / ss / ds / es / fs / gs
명령어 포인터 레지스터 - CPU가 어느 부분의 코를 실행할 지 가리키는 것
플래그 레지스터 - 프로세서의 현재 상태를 저장하고 있는 것
CF(Carry Flag): 부호 없는 수의 연산 결과가 비트의 범위를 넘을 경우 설정
ZF(Zeo flg): 연산의 결과가 0일 경우 설정
SF(Sign Flag): 연산의 겨로가가 음수일 경우 설정
OF(Overflow Flag): 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정
메모리에서의 구조
'해킹 > 해킹, 취약점, 악성코드, 솔루션' 카테고리의 다른 글
어셈블리어 문제 풀이 (0) | 2023.04.17 |
---|---|
어셈블리어란? (0) | 2023.04.17 |
Mod_evasive 설치와 DdoS, Brute Force 방어 (0) | 2023.04.17 |
WAF(Web Application Firewall) 구축 및 정책 작성 (0) | 2023.04.16 |
통합위협관리 솔루션 Untangle 설치 (0) | 2023.04.16 |