C언어의 메모리 구조, 메모리의 동적 할당


================================ Outline ====================================

* 리눅스에서 메모리 주소 보안 옵션 off

C언어의 메모리 구조

메모리의 동적 할당

- malloc 함수

- calloc 함수

- realloc 함수

----------------------------------------------------------------------------

 

*** 리눅스에서 메모리 주소 보안 옵션 off

 

랜덤스택이란, 프로그램이 실핼 될때마다, 프로세스 내부에 함수 주소 및 스택, 힙의 주소가 랜덤하게 바뀌는 것이다.

 

해제 하기위해선,

sysctl -w kernel.randomize_va_space=0

 

명령어를 사용해서 해제합니다. (루트권한 필요)

 

 

C 언어 교재 p/536 <C언어의 메모리 구조>

 

코드영역은 영어 표기로 Code 또는 Text 영역이라고 부른다.

 

메모리의 HEAP영역에 대해 알아보자.

 

//코드 영역을 텍스트 영역이라고 부르기도 한다.

 

함수를 만들게 되면 기본적으로 다음 함수의 base point와 해당 함수가 끝났을 때 다음 함수로 넘어가는 주소가 저장된다. 때문에 메모리의 주소를 최소화하기 위해서는 인자를 여러 개를 넣는 것 보다는 인자가 존재하는 주소를 입력해 주는 것이 메모리를 줄이는데 효과적이다.

 



 

다음 함수의 return 포인트를 활용하여 해킹을 할수도 있다.

 

/*** 소스 ***/

#include <stdio.h>

volatile unsigned int uiCnt;

void hackhack(void)
{

  while(1)
    for(uiCnt=0; uiCnt<40000; ++uiCnt);
}

void Hack(void)
{

  printf("해킹코드\n");
  hackhack();
}
  
void smart(int n2, int n1)
{
       int C;
       int D;
  int * p = &n2;
  p = p-1;
  *p = (int)Hack;

  
       printf("smart:n1:주소  [%08X]입니다.\n"&n1);
       printf("smart:n2:주소  [%08X]입니다.\n"&n2);
      printf("smart:C:주소  [%08X]입니다.\n"&C);
      printf("smart:D:주소  [%08X]입니다.\n"&D);
}
 
 
int main(void)
{
      int A;
      int B;

 
      printf("main:A:주소 [%08X]입니다.\n"&A);
      printf("main:B:주소 [%08X]입니다.\n\n"&B);
      smart(200100);
 
      printf("--------------------------------------------------\n");
 
      smart(200100);
 
      return 0;
 
}


 

 

C언어 교재 p/542: <메모리의 동적 할당>

 

변수의 생성과 소멸의 시기가 지역변수나 전역변수와 다른 유형의 변수는 mallocfree라는 이름의 함수를 통해서 힙(heap)영역에 할당하고 소멸할 수 있다.

 

<malloc(memory allocation)함수>

 

#include <stdlib.h>

void * malloc(size_t size); // 힙 영역으로의 메모리 공간 할당

void free(void * ptr); // 힙 영역에 할당된 메모리 공간 해제

-> malloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환

 

malloc함수를 사용하기 위해서는 받은 주소를 저장하기 위한 포인트 변수가 필요하다.

 

p/546 예제

 

 

동적 할당을 받은 후 free 함수로 해지 않고 덮어쓰는 경우 덮어 씌워진 경우 해당 메모리는 어딘가에 살아있다. 때문에 반드시 malloc함수를 사용하고 나서는 덮어 쓰지 않고 free함수로 할당 받은 메모리를 반환하여야 한다.

 

<calloc 함수>

 

#include <stdlib.h>

void * calloc(size_t elt_count, size_t elt_size);

-> calloc 함수는 성공 시 할당된 메모리의 주소 값, 실패 시 NULL 반환

 

블록 크기(elt_count) * 개수(elt_size)

 

ex) calloc(10, 30)

10byte블록을 30개 생성 -> 300bytes

 

<calloc함수의 구현>

<realloc 함수>

#include <stdlib.h>

void * realloc(void * ptr, size_t size);

-> 성공 시 새로 할당된 메모리의 주소 값, 실패 시 NULL 반환

 

구현은 malloc을 활용하여 기존 동적 할당의 내용을 새로 받은 동적할당 영역에 복사하고 free를 활용하여 기존 동적 할당 내용을 없앤다.

 

다음 시간은 ch.27

반응형
Posted by newind2000