쿠키와 세션은 무엇인가

쿠키와 세션은 웹 서비스에서 사용자의 상태를 저장하여 사용자가 웹사이트를 더욱 편하게 사용하도록 만들기 위해 만들어진 개념입니다.

왜 이런 개념이 만들어졌을까요?

HTTP 프로토콜의 특징


https://raonctf.com/essential/study/web/cookie_connection

웹 서비스에서 사용하는 HTTP프로토콜은 Connectionless와 Stateless라는 특성을 가집니다.

 

Connectionless
클라이언트가 서버에 요청을 하고 응답을 받으면 바로 연결을 끊어 연결을 유지 하지 않는다.

이를 통해 서버의 자원을 효율적으로 관리하고, 수 많은 클라이언트의 요청에도 대응할 수 있게 한다.
Stateless
Stateless는 서버가 클라이언트의 이전 상태를 보존하지 않는다는 의미이다

쿠키와 세션을 사용하지 않는다면 페이지를 이동할 때마다 로그인을 해주어야 하게 된다.

 

위와 같은 문제점을 보완해주기 위해 생겨난 개념이 쿠키(Cookie)와 세션(Session)입니다.

 

쿠키(Cookie)


https://raonctf.com/essential/study/web/cookie_connection

HTTP 쿠키(HTTP cookie)란 하이퍼 텍스트의 기록서(HTTP)의 일종으로서 인터넷 사용자가 어떠한 웹사이트를 방문할 경우 사용자의 웹 브라우저를 통해 인터넷 사용자의 컴퓨터나 다른 기기에 설치되는 작은 기록 정보 파일을 일컫는다. -wikipedia-

 

쉽게 말해 우리가 웹 사이트를 이용할 때 서버에서 우리 컴퓨터에 있는 웹 브라우저에게 쿠키라는 파일을 하나 보내줍니다. 그 쿠키에는 사용자가 웹 사이트를 편하게 이용할 수 있는 여러정보가 담겨있습니다.

 

쿠키의 구성요소

  • 쿠키의 이름 (name)
  • 쿠키의 값 (value)
  • 쿠키의 만료시간 (Expires)
  • 쿠키를 전송할 도메인 이름 (Domain)
  • 쿠키를 전송할 경로 (Path)
  • 보안 연결 여부 (Secure)
  • HttpOnly 여부 (HttpOnly)

쿠키의 특징

  • 클라이언트는 총 300개의 쿠키를 저장할 수 있다
  • 하나의 도메인 당 20개의 쿠키를 가질 수 있다
  • 하나의 쿠키는 4KB까지 저장 가능하다

쿠키의 동작방식

1. 사용자가 쿠키 없이 request 요청

2. 서버가 쿠키를 생성하여 response와 쿠키를 함께 응답

3. 사용자가 서버에게서 받은 쿠키를 저장하고 다음 request부터 쿠키를 넣어 요청

 

쿠키의 사용 예

  • 방문 사이트에서 로그인 시, "아이디와 비밀번호를 저장하시겠습니까?"
  • 쇼핑몰의 장바구니 기능
  • 자동로그인, 팝업에서 "오늘 더 이상 이 창을 보지 않음" 체크, 쇼핑몰의 장바구니

 

션(Session)


세션이란 일정시간동안 사용자로부터 들어오는 요구를 하나의 상태로 유지하는 기술이다.

 

예를 들어, 로그인을 했을 때 다른 페이지로 이동해도 로그인 상태가 계속 유지되면서 이용할 수 있는것은 세션이 있기 때문입니다.

 

세션의 특징

  • 세션은 서버의 메모리 혹은 DB등에 저장된다.
  • 서버에서는 클라이언트를 구분하기 위해 세션 ID를 부여하며 웹 브라우저가 서버에 접속해서 브라우저를 종료할 때까지 인증상태를 유지한다.
  • 접속 시간에 제한을 두어 일정 시간 응답이 없다면 정보가 유지되지 않게 설정 가능.
  • 사용자에 대한 정보를 서버에 두기 때문에 쿠키보다 보안에 좋지만, 사용자가 많아질수록 서버 메모리를 많이 차지하게 됨
  • 사용자가 Request를 보내면, 해당 서버의 엔진이 클라이언트에게 세션 ID를 부여함.

세션의 동작방식

1. 사용자가 서버에 접속 시 세션 ID를 발급받음

2. 사용자가 request 요청을 보낼 때 쿠키에 세션 ID를 넣어서 보내게 됨

3. 서버는 세션 ID를 통해 세션 ID에 맞는 클라이언트의 정보를 가져옴

4. 가져온 클라이언트 정보를 통해 사용자에게 응답

 

세션의 사용 예

  • 로그인 상태유지

쿠키와 세션의 차이


  쿠키 세션
저장 위치 클라이언트 웹 서버
저장 형식 text Object
만료 시점 쿠키 저장시 설정 브라우저 종료시 삭제
사용하는 자원 클라이언트 리소스 웹 서버 리소스
용량 제한 총 300개
하나의 도메인 당 20개
하나의 쿠키 당 4KB
서버가 설정하게 됨
속도 빠름 느림
보안 안좋음 좋음

 

쿠키 취약점

쿠키와 관련하여 발생할 수 있는 취약점에는 다음과 같은 것들이 있습니다.

 

Session Hijacking

 - XSS나 Sniffing등의 공격을 통해 쿠키를 탈취당하게 되면 공격자가 피해자의 세션 ID를 통해 바로 로그인을 할 수 있게 됩니다.

 

CSRF

 - CSRF공격을 통해 사용자의 세션 ID를 이용하여 공격자가 원하는 작업을 수행할 수 있습니다.

 

 

'Security > Webhacking' 카테고리의 다른 글

SQL injection 공격  (0) 2024.05.12
CSRF 공격  (0) 2024.05.12
XSS문제 실습  (0) 2024.05.10
PE 포맷(Portable Executable)은 윈도우 운영 체제에서 사용되는 실행 파일, DLL, object 코드, FON 폰트 파일등을 위한 파일 형식이다. PE 포맷은 윈도우 로더가 실행 가능한 코드를 관리하는데 필요한 정보를 캡슐화한 데이터 구조체이다. -위키백과-

 

다시 말하자면 PE파일이란 윈도우 운영체제에서 우리가 만든 파일이 다른 윈도우 운영체제의 PC로 옮겨(Portable)져도 실행(Executable)되도록 만들어 놓은 파일을 말합니다.

 

파일 확장자의 종류로는 다음이 있습니다.

.acm, .ax, .cpl, .dll, .drv, .efi, .exe,  .mui, .ocx, .scr, .sys, .tsp

 

PE 파일의 구조


PE파일의 구조-출처:https://rednooby.tistory.com/33

  • DOS header 부터 Section header 까지를 PE Header, 그 밑의 Section 들을 합쳐서 PE Body라고 합니다.

  • 파일에서는 offset으로, 메모리에서는 VA(Virtual Address) 로 위치를 표현합니다.

  • 파일이 메모리에 로딩되면 모양이 달라집니다(Section의 크기, 위치 등)

  • Section header에 각 Section에 대한 파일/메모리에서의 크기, 위치, 속성 등이 정의되어 있습니다.

  • PE header의 끝부분과 각 Section의 끝부분에 있는 NULL padding이라는 영역이 있습니다.
    컴퓨터에서 파일, 메모리, 네트워크 패킷 등을 처리할 때 효율을 높이기 위해 최소기본단위를 사용하는데, PE파일에서도 이러한 개념이 적용된 것입니다.

  • 파일/메모리에서 섹션의 시작위치는 각 파일/메모리의 최소기본단위의 배수에 해당하는 위치여야하고, 빈 공간은 NULL로 채웁니다.

VA와 RVA


VA(Virtual Address) : 가상메모리상의 절대주소

RVA(Relative Virtual Address) : 기준위치(Imagebase)에서부터의 상대주소

 

RVA와 VA의 관계식은 다음과 같습니다.

RVA + Imagebase = VA

 

왜 RVA를 써야할까?

PE파일(주로 DLL)이 프로세스 가상 메모리의 특정 위치에 로딩되는 순간

이미 그 위치에 다른 PE 파일(DLL)이 로딩되어있을 수 있습니다.

 

그럴때 재배치(Relocation) 과정을 통해서 비어 있는 다른 위치에 로딩되어야 하는데,

만약 PE header 정보들이 VA로 되어있다면 정상적인 엑세스가 이루어지지 않을것입니다.

 

PE Header


PE파일의 각 부분에 대한 설명은 너무나도 길어지기에 PE에 대해 정말 잘 정리해주신 분의 블로그를 발견하여 링크올려드립니다.

아래 그림과 함께 읽어보시면 더욱 이해가 잘 될거라고 생각합니다.

DOS Header & DOS Stub

https://reversecore.com/19

 

NT header(IMAGE_FILE_HEADER & IMAGE_OPTIONAL_HEADER32)

아래 그림중 signature~NumberOfRvaAndSizes 부분

https://reversecore.com/20

https://reversecore.com/21

 

Section Header

아래 그림중 Section Table 영역

https://reversecore.com/22

 

IAT(Import Address Table) & EAT(Export Address Table)

https://reversecore.com/23

https://reversecore.com/24

PE Header 32bit Structure-출처:https://commons.wikimedia.org/wiki/File:Portable_Executable_32_bit_Structure.png

 

CPU 성능 분석

 

CPU성능분석을 위해 알아야하는 개념들은 다음과 같다.

Response time : 응답시간 작업을 끝내는데 걸린 시간
Throughput : 처리량 단위시간당 처리한 작업량
Execution time : 실행시간 어떠한 결과를 내놓는데 걸리는 총 시간
Clock(cycles) : 클럭(사이클) 연산을 조정하는 타이밍 신호
Clock period : 클럭시간 클럭하나가 걸리는 시간
Clock frequency(rate) : 클럭주기 1초당 도는 클럭의 개수
CPU time : CPU 시간 한 컴퓨터 프로그램이 CPU를 차지하여 일을 한 시간의 양
Instruction count(IC) : 명령개수 한 프로세스의 총 명령개수
Cycles per instruction(CPI) 명령 당 필요한 사이클(클럭)의 개수

Performance(성능) & Execution time(실행시간)

성능 = 1/실행시간

X는 Y보다 n배 만큼 성능이 좋다(빠르다).

 

Execution time에는 Elapsed time, CPU time 두가지가 있다.

Elapsed time (wall clock time, response time 다 같은 표현) : 모든 측면을 포함한 총 작업시간

프로세싱, I/O, OS overhead, idle time등 포함

 

CPU time : CPU가 주어진 작업을 실행하는데 드는 시간

I/O작업이나 다른 작업들을 포함하지 않음


Clock(클럭, 사이클)

클럭 신호(영어: clock signal)는 논리상태 H(high,논리 1)와 L(low,논리 0)이 주기적으로 나타나는 방형파(square wave) 신호를 말한다.

많은 경우 전자공학의 디지털 회로에서 클럭 신호에 맞추어 신호의 처리를 하는 동기 처리를 위해 사용한다.

-wikipedia-

Clock period : 클럭 한 주기에 걸리는 시간

예) 1ns(nano second)

 

Clock frequency(rate) : 1초에 도는 클럭의 개수

예) 1s/1ns = 10^9 = 1GHz


CPU time의 계산

CPU time = CPU clock cycles * Clock cycle time = CPU clock cycles / Clock rate

[clock cycles는 클럭의 개수를 의미한다]

 

CPU time을 줄이는 방법

클럭의 수를 줄이거나 rate를 올리면 CPU time이 줄어 성능이 향상될 수 있다.


Instruction Count(IC) & CPI

Instruction Count(IC) : 한 프로세스(프로그램)에서 실행할 명령의 개수

CPI : 명령당 필요한 클럭(사이클)의 개수

CPI는 CPU에 따라 달라지게 되고 명령마다도 값이 다를 수 있다.

따라서 CPI의 평균값을 구해 계산하게 된다.

 

Clock cycles = IC * CPI 

CPU time = IC * CPI * Clock Cycle time = IC * CPI / Clock rate

 

평균 CPI 구하기

 

Load balancing이란?

서버와 클라이언트가 통신을 할 때, 트래픽이 많지 않다면 서버 하나로 충분할 것입니다.

하지만 클라이언트가 많아지며 트래픽이 증가하게 된다면 서버 하나로는 부하를 견디기 충분하지 않게 될 수 있습니다.

Load balancing은 이러한 부하(Load)를 분산(balancing)해주는 장치 또는 기술을 통칭합니다.

Scale-up 과 Scale-out

서버의 성능을 개선하는데는 두가지 방식이 있습니다. Scale-up과 Scale-out입니다.

Scale-up : 서버 자체의 성능을 확장하여 운영

Scale-out : 기존 서버와 비슷한 수준의 서버를 증설하여 운영

Scale-out 방식으로 서버를 증설하여 운영할 경우 각 서버에 부하를 분산해줄 Load balancing이 필요하게 됩니다.

Load balancing의 기본 기능

1. Health Check(상태 확인)

    - 서버들에 대한 주기적인 Health Check를 통해 서버들의 장애 여부를 판단하여, 정상 동작 중인 서버로만 트래픽을 보낸다.

    - L2 체크 : ARP 응답 확인 (디폴트로 ICMP 주기의 10배로 자동 설정)

    - L3 체크 : ICMP를 이용하여 서버의 IP주소가 통신 가능한 상태인지 확인한다.

    - L4 체크 : TCP의 3 Way-Handshaking으로 각 포트의 상태를 체크한다.

    - L7 체크 : 어플리케이션 계층에서 체크를 수행. Request를 (ex. GET /health_check.html) 통해 응답 코드 확인하는 방식. 주기적으로 서버와 세션을 맺기 때문에 부하가 발생하지만 어플리케이션 상태까지 체크할 수 있기 때문에 L4 Health Check 보다 확실한 헬스체크가 가능.

 

2. Tunneling(터널링)
    - 데이터 스트림을 인터넷 상에서 가상의 파이프를 통해 전달시키는 기술로, 패킷 내에 터널링할 대상을 캡슐화시켜 목적지까지 전송.

    - 연결된 상호 간에만 캡슐화된 패킷을 구별해 캡슐화를 해제하게 함.

 

3. NAT(Network Address Translation)

    - 내부 네트워크에서 사용하는 사설 IP 주소와 Load balancer 외부의 공인 IP 주소 간의 변환 역할.

    - Load balancing 관점에서는 여러개의 호스트가 하나의 공인 IP 주소를 통해 접속하는 것이 주 목적.

 

4. DSR(Destination Network Address Translation)

    - 서버에서 클라이언트로 트래픽이 되돌아 가는 경우, 목적지를 클라이언트로 설정한 다음, 네트워크 장비나 Load balancer를 거치지 않고 바로 클라이언트를 찾아가는 방식.

    - 이 기능을 통해 Load balancer의 부하를 줄여줄 수 있음.

Load balancing의 종류

Load balancing의 종류로는 L4 Load balancing과 L7 Load balancing이 있습니다.

L4 Load balancer는 네트워크 계층(IP)나 전송 계층(TCP, UDP)의 정보를 바탕으로 로드를 분산합니다. IP주소나 포트번호, MAC주소, 전송 프로토콜에 따라 트래픽을 나누는 것이 가능합니다.

L4 Load balancing

L7 Load balancer는 어플리케이션 계층(HTTP, FTP, SMTP)에서 로드를 분산하기 때문에 HTTP헤더, 쿠키 등과 같은 사용자의 요청을 기준으로 특정 서버에 트래픽을 분산하는 것이 가능합니다. 아래 그림과 같이 URL에 따라 부하를 분산시키거나, HTTP 헤더의 쿠키값에 따라 부하를 분산하는 등 클라이언트의 요청을 보다 세분화 해 서버에 전달할 수 있습니다.

또한 L7 Loadbalancer의 경우 특정한 패턴을 지닌 바이러스를 감지해 네트워크를 보호할 수 있으며, DoS/DDoS와 같은 비정상적인 트래픽을 필터링 할 수 있어 네트워크 보안 분야에서도 활용되고 있습니다.

L7 Load balancing

Load balancing의 알고리즘

1. 라운드 로빈 (Round Robin)

 

순차적으로 돌아가며 세션을 할당해주는 방식입니다.

요청이 오면 단순히 그 요청을 순서대로 서버에 분배해주는데 첫 번째 요청은 첫 번째 서버, 두 번째 요청은 두 번째 서버에 할당해 줍니다. 로드밸런싱 대상 서버의 스펙이 동일하고, 처리 시간 혹은 세션지속시간이 짧은 애플리케이션의 경우 이러한 방식이 적합합니다.

 

2. 가중 라운드 로빈 (Weighted Round Robin)

 

각 서버마다 가중치를 설정해두고 해당 가중치만큼 세션을 할당해주는 방식입니다. 특정 서버의 스펙이 좋다면 해당 서버에 가중치를 좀 더 주어 세션을 더 많이 할당해주고, 스펙이 좋지 않은 서버에는 가중치를 적게 두어 세션을 적게 할당해주는 방식입니다.

 

3. 최소 연결 (Least Connection)

 

가장 적게 연결(가장 적은 세션)되어 있는 서버에 세션을 할당해주는 방식입니다.

서버에 분배된 세션들이 일정하지 않은 경우에 적합하며 부하를 줄이는 측면에서 많이 사용됩니다.

 

4. 최소 응답 (Least Response Time)

 

서버의 응답시간을 고려하여 세션을 할당해주는 방식입니다. 가장 짧은 응답 시간을 보이는 서버에 우선적으로 세션을 할당해주는 방식입니다.

 

5. 해시 (Hash)

특정 사용자는 특정 서버로만 할당시키는 방식입니다. 특정 IP주소나 포트를 갖는 사용자들은 특정 서버로만 세션을 맺도록 하는데 특정 IP주소나 포트에서 접속량이 특히 많을 때 관리가 편한 방식입니다.

 

 

 

 

 

 

참고 및 출처

 

https://medium.com/@dinubhagya97/load-balncing-f9e5a120a402

 

Load Balncing

In general terms, proxies are servers located between the client and the servers.

medium.com

https://m.post.naver.com/viewer/postView.nhn?volumeNo=27046347&memberNo=2521903

 

로드밸런서(Load Balancer)의 개념과 특징

[BY 가비아] 현대의 모든 정보는 인터넷을 통해 연결되어있습니다. 인터넷의 발달은 데이터 통신을 보다...

m.post.naver.com

https://co-no.tistory.com/entry/%EB%84%A4%ED%8A%B8%EC%9B%8C%ED%81%AC-%EB%A1%9C%EB%93%9C%EB%B0%B8%EB%9F%B0%EC%8B%B1

 

[네트워크] 로드밸런싱의 개념 및 기법 설명

로드밸런싱(Load Balancing)이란? : 컴퓨터 네트워크 기술의 일종으로 둘 혹은 셋 이상의 중앙처리장치 혹은 저장장치와 같은 컴퓨터 자원들에게 작업(Work), 즉, 부하(Load)를 나누는 것을 의미한다. 이

co-no.tistory.com

https://m.blog.naver.com/sungsu9022/220962662085

 

[펌] L4, L7 health check에 관하여[kakao의 L3DSR 구성 사례]

Overview서비스 웹서버 Load Balancing을 위한 메커니즘으로 KAKAO에서는 L3DSR 방식을 사용하...

blog.naver.com

https://habitus92.tistory.com/22

 

[네트워크] 로드밸런싱(Load Balancing)이란? 종류와 기법

로드밸런싱 (Load Balancing) 은 '부하분산'이라고도 하며 해석 그대로 일을 밸런스 있게 맞추는 기능입니다. 모든 사람들이 12월 31일 23시 59분 59초에 메신저로 친구들을 포함한 지인들에게 새해 인

habitus92.tistory.com

 

이번엔 Stack의 구조와 Stack Frame Pointer에 대해 알아보겠습니다.

 

Stack이란?

Stack이란 RAM내의 영역 중 하나로

프로그램에서 함수가 호출될 때 필요한 지역변수와 매개변수가 저장되는 영역입니다.

또 Stack은 후입선출(Last In First Out)구조이기 때문에 데이터 저장시 높은 주소에서 낮은 주소방향으로 데이터를 저장하게 됩니다.


Stack의 구조

Stack은 기본적으로 저장공간이기 때문에 데이터를 담을 수 있는 상자가 쭉 늘어서 있는 창고라고 생각하면 됩니다.

 

그럼 이 Stack에 우리의 컴퓨터는 어떤 방식으로 데이터를 저장하는걸까요?

이해를 위해서 예시를 하나 보도록 하겠습니다.

main(){

  int A = sum(1,2)

  return A

}

sum(x,y){

   return x+y

}

위와 같은 단순한 코드하나를 만들어 봤습니다. 

 

우리가 이 코드로 만든 프로그램을 돌릴때 Stack에선 데이터를 어떻게 처리하는지 보겠습니다.


Stack의 구조

함수가 호출될 때 Stack엔 매개변수, 반환 주소값, 지역변수 이렇게 3가지의 데이터가 들어갑니다.

 

main()함수 실행시

  1. main()함수엔 매개변수가 없어 반환 주소값부터 들어가게 됩니다.
  2. 가장 아래(높은)주소부터 RET(반환 주소값), RBP(main()함수 스택 프레임의 시작점), 변수 c, 버퍼(지역변수) 이렇게 채워 가는걸 볼 수 있습니다.

 

위와 같은 함수의 호출 정보를 스택 프레임(Stack Frame) 이라고 합니다.

 

sum()함수 실행시

  1. sum()함수는 main()함수 안에서 호출되기 때문에
  2. sum()함수를 호출하게 되면 main()함수의 스택 프레임위에 다시 sum()함수의 스택 프레임을 쌓게 됩니다.
  3. sum()함수엔 매개변수가 있어 매개변수 x, y를 먼저 쌓아주는 모습을 볼 수 있습니다.

 


스택 프레임 포인터(Stack Frame Pointer)

이제 Stack이 어떤식으로 데이터를 저장하는지 알게됐습니다.

그럼 저걸 어떻게 사용해서 프로그램을 돌리는 걸까요?

 

CPU내에는 레지스터라고 하는 아주 작은 값만을 담을 수 있는(하지만 처리속도가 매우 빠른)  메모리가 있습니다.

CPU는 이 레지스터와 RAM에 저장되어있는 값들을 이용하여 프로그램을 돌립니다.

Stack의 데이터들을 이용할때도 이 레지스터들을 이용하게됩니다.

 

레지스터는 여러가지 종류가 있지만 Stack에 있는 데이터를 다룰 때 사용하는 레지스터는 SP, FP 레지스터입니다.

 

SP(Stack Pointer) 레지스터 : 다음 데이터가 저장될 스택의 주소를 담고 있는 레지스터

 

FP(Frame Pointer) 레지스터 : SP레지스터가 돌아갈 주소(함수 호출 전)를 담고있는 레지스터

 

SP레지스터는 함수 호출 중 데이터가 저장될 스택의 주소를 가리킵니다. CPU가 SP가 가리키고 있는 스택에 값을 넣고 나면 SP레지스터는 그 위의 주소를 가리키게 변경됩니다.

 

FP레지스터는 함수 호출 이전에 SP레지스터가 가리키고 있던 주소를 담고있게됩니다.

 

함수 호출이 끝난 후 SP레지스터는 FP레지스터에 쓰여져있는 주소를 참고하여 함수를 호출하기 이전의 주소로 돌아가게됩니다.

 

하지만 함수 호출을 여러번 하게 될 경우 FP레지스터의 값이 계속 바뀌기 때문에 스택에 FP레지스터의 값을 저장해 놓음으로써 스택 프레임간의 경계정보를 저장합니다.

'Security > Pwnable' 카테고리의 다른 글

메모리 구조  (1) 2023.03.29

메모리 구조에 대해 이야기하기 전 프로그램의 실행순서를 알아보겠습니다.

프로그램이 실행되는 순서(Free space는  heap 또는 stack영역에 데이터가 할당되면 사용되는 곳입니다.)

 

 

메모리는 크게 4가지 영역으로 나눌 수 있습니다.

  • Code/Text 영역
  • Data 영역
  • Heap 영역
  • Stack 영역

Code/Text 영역

프로그램의 소스코드가 저장되는 영역, 기계어 형태로 저장

 

Code영역 또는 Text영역이라고도 부릅니다.

 

CPU는 Code영역에 저장된 명령어들을 하나씩 가져가 실행합니다.

 

Code영역은 프로그램이 시작하고 종료될 때까지 메모리에 계속 남아있습니다.

Data 영역

전역변수와 static변수가 할당되는 영역

 

main함수 전에 선언되어 프로그램 시작과 동시에 할당되고 프로그램이 종료하면 메모리에서 소멸됩니다.

 

Data 영역은 Rodata, BSS, Data 3가지 영역으로 나뉩니다.

 

Rodata(Read Only data)영역은 읽기 전용 data들이 들어갑니다.

주로 상수, 상수형 문자열 등의 값이 들어갑니다.

읽기 전용 영역이기 때문에 쓰는것은 불가능합니다.

 

Data영역과 BSS영역

data영역과 bss영역은 둘다 전역 변수를 저장하는건 동일합니다.

정적변수(static)도 이 영역에 저장됩니다.

data영역과 bss영역의 차이는 값이 초기화 되어있는가 되어있지 않은가의 차이입니다.

data영역은 초기화 된 변수, bss영역은 초기화 하기 전의 변수를 저장합니다.

이 영역들은 읽기 쓰기 모두 가능합니다.

 

Heap 영역

동적으로 선언된 변수가 할당되는 영역

 

메모리 위쪽 주소부터 할당되는 선입선출(FIFO) 구조

 

런타임 시 크기가 결정

 

프로그래머가 원하는 시점에 변수를 할당하고 소멸 가능하도록 하는 영역

 

사용하고 난 후 메모리 해제를 해주지 않으면 memory leak이 발생하기 때문에 반드시 메모리 해제를 해줘야 합니다.

 

 

Stack 영역

함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역

 

메모리 아래쪽 주소부터 할당되는 후입선출(LIFO) 구조

 

컴파일 타임에 크기가 결정

 

함수의 호출과 함께 할당되며 함수의 호출이 완료(종료)되면 소멸합니다.

 

stack영역에 저장되는 함수의 호출 정보를 스택 프레임(Stack Frame)이라고 합니다.

 

오버 플로우(Overflow)

오버플로우란, 한정된 메모리 공간이 부족하여 메모리 내의 데이터가 넘쳐 흐르는 현상입니다.

오버플로우

Heap Overflow

Heap이 위에서부터 주소를 채워 내려오다가 Stack영역을 침범하는 경우

Stack Overflow

Stack이 아래에서부터 주소를 채워 올라가다가 Heap영역을 침범하는 경우

'Security > Pwnable' 카테고리의 다른 글

Stack의 구조와 Stack Frame Pointer  (0) 2023.04.01

+ Recent posts