━━━━ ◇ ━━━━
해킹/해킹, 취약점, 악성코드, 솔루션

어셈블리(Assembly), 힙(heap), 스택(stack)

728x90
반응형



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): 부호 있는 수의 연산 결과가 비트 범위를 넘을 경우 설정

 


메모리에서의 구조

 

 

728x90
반응형
COMMENT