Heap ๊ตฌ์กฐ

 

์ถœ์ฒ˜ : https://dokhakdubini.tistory.com/35 

: ์ปดํ“จํ„ฐ ์•ˆ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ ์ค‘ ์‚ฌ์šฉ์ž๊ฐ€ ์ž„์˜๋กœ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„

โ–ท malloc ํ•จ์ˆ˜๋ฅผ ์ด์šฉํ•ด ์„ ์–ธํ•ด์ฃผ๊ณ , free ํ•จ์ˆ˜๋ฅผ ํ†ตํ•ด ํ•ด์ œํ•ด์คŒ

 

 

1. First-Fit ์•Œ๊ณ ๋ฆฌ์ฆ˜

: ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ „๋žต ์ค‘ ํ•˜๋‚˜๋กœ, ๋ฆฌ๋ˆ…์Šค ์šด์˜์ฒด์ œ๋Š” ์ด ์•Œ๊ณ ๋ฆฌ์ฆ˜์„ ์ฑ„ํƒํ•˜๊ณ  ์žˆ๋‹ค.

  • First-Fit ๋ง๊ณ ๋„ Best-Fit, Worst-Fit๋„ ์žˆ์Œ

์˜ˆ)

char *a = malloc(20);     // 0xe4b010
char *b = malloc(20);     // 0xe4b030
char *c = malloc(20);     // 0xe4b050
char *d = malloc(20);     // 0xe4b070
 
free(a);
free(b);
free(c);
free(d);
 
a = malloc(20);           // 0xe4b070
b = malloc(20);           // 0xe4b050
c = malloc(20);           // 0xe4b030
d = malloc(20);           // 0xe4b010

๊ฐ๊ฐ 20๋ฐ”์ดํŠธ์”ฉ heap์— 4๊ฐœ์˜ ํฌ์ธํ„ฐ์˜ ์˜์—ญ์„ ํ• ๋‹น ํ•ด์ฃผ์—ˆ๊ณ , free๋ฅผ ํ•ด์ค€ ๋‹ค์Œ ๋‹ค์‹œ 4๊ฐœ์˜ ์˜์—ญ์„ ํ• ๋‹น๋ฐ›์•˜๋‹ค.

์ด๋•Œ ํ• ๋‹น์ด ๋  ๋•Œ๋Š” LIFO(Last In First Out)์„ ๋”ฐ๋ฅธ๋‹ค.

 

 

 

 

 

2. UAF(Use After Free)

๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ•ด์ œํ•˜๊ณ  ์žฌ์‚ฌ์šฉํ•  ๋•Œ ์ƒ๊ธฐ๋Š” ์ทจ์•ฝ์ 

 

์˜ˆ)

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int* heap1;
    int* heap2;
    int* heap3;
 
    heap1 = (int*)malloc(256);
    heap2 = (int*)malloc(256);
 
    printf("heap1์˜ ์ฃผ์†Œ : %p\n", heap1);
    printf("heap2์˜ ์ฃผ์†Œ : %p\n", heap2);        
 
    *heap2 = 1234;
    printf("heap2 number : %d\n", *heap2);        //1234
 
    free(heap2);
    printf("free heap2\n");
 
    heap3 = (int*)malloc(256);
    printf("new heap์˜ ์ฃผ์†Œ : %p\n", heap3);
    printf("new heap number: %d\n", *heap3);    //์•ˆ์—์žˆ๋Š” ๊ฐ’์€ ์ดˆ๊ธฐํ™”๋จ
    *heap3 = 4321;
    printf("new heap์˜ ๋‚ด์šฉ์„ \"%d\"๋กœ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค.\n\n", *heap3);
 
    printf("heap2๋ฅผ ๋‹ค์‹œ ๋ถ€๋ฅธ๋‹ค๋ฉด?: %d\n", *heap2);  //heap3์˜ ๊ฐ’๊ณผ 
 
    return 0;
}

 

 

 

    heap1 = (int*)malloc(256);
    heap2 = (int*)malloc(256);
  • malloc์„ ์‚ฌ์šฉํ•ด์„œ heap1๊ณผ heap2์˜ ๊ณต๊ฐ„์„ ํ• ๋‹นํ•ด์ฃผ์—ˆ๋‹ค.

 

    *heap2 = 1234;
    free(heap2);
    printf("free heap2\n");
  • heap2์˜ ๊ฐ’์„ 1234๋กœ ๋ฐ”๊ฟ”์ฃผ์—ˆ๋‹ค
  • heap2๋ฅผ freeํ•ด์ฃผ์—ˆ๋‹ค.

 

    heap3 = (int*)malloc(256);
    printf("new heap์˜ ์ฃผ์†Œ : %p\n", heap3);
    printf("new heap number: %d\n", *heap3);    //์•ˆ์—์žˆ๋Š” ๊ฐ’์€ ์ดˆ๊ธฐํ™”๋จ
  • heap3์„ mallocํ•˜๋ฉด ์•ž์„œ ์‚ดํŽด๋ณธ First-Fit์— ๋”ฐ๋ผ heap3์—๋Š” heap2์˜ ์ฃผ์†Œ๊ฐ€ ๋“ค์–ด๊ฐ€๊ฒŒ ๋œ๋‹ค.
  • heap3์˜ ๊ฐ’์„ ์‹คํ–‰ํ•ด์„œ ํ™•์ธํ•ด๋ณด๋ฉด ์ดˆ๊ธฐํ™” ๋˜์–ด์žˆ๋‹ค๋Š” ๊ฑธ ์•Œ ์ˆ˜ ์žˆ๋‹ค.

 

์•ž์˜ cํŒŒ์ผ์„ ์ปดํŒŒ์ผํ•˜๊ณ  ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์‹คํ–‰๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.

์‹คํ–‰ ๊ฒฐ๊ณผ

์ด์™€ ๊ฐ™์ด UAF๋ฅผ ์ด์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด heap์„ ํ• ๋‹นํ•ด์ค€ ํ›„ ์›ํ•˜๋Š” ๊ฐ’์„ ์ž…๋ ฅํ•œ ๋‹ค์Œ ๊ธฐ์กด heap์„ ์‹คํ–‰ํ•ด์„œ ์ต์Šคํ”Œ๋กœ์ž‡ ํ•ด์ค„ ์ˆ˜ ์žˆ๋‹ค.

๋ณต์‚ฌํ–ˆ์Šต๋‹ˆ๋‹ค!