songining
article thumbnail

ํž™์ด๋ž€ ? ์š”์ฒญ์— ๋”ฐ๋ผ ํ• ๋‹น๋˜๋ฉฐ chunk ํ˜•ํƒœ๋กœ ๋‚˜๋‰  ์ˆ˜ ์žˆ๋Š” ์ธ์ ‘ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ

ํž™์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•  ๋•Œ๋Š” malloc() ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ 

malloc ํ•จ์ˆ˜์—๋Š” ํฌ๊ธฐ๋ฅผ ์ •ํ•˜๋Š” ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๊ทธ ํฌ๊ธฐ๋งŒํผ ๊ณต๊ฐ„์„ ํž™ ์„ธ๊ทธ๋จผํŠธ์— ํ• ๋‹นํ•œ๋‹ค. (Top Chunk๋ฅผ ์‚ฌ์šฉํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น) 

๊ทธ๋ฆฌ๊ณ  ๋ณด์ด๋“œ ํฌ์ธํ„ฐ๋กœ ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ์˜ ์‹œ์ž‘์ฃผ์†Œ๋ฅผ ๋ฆฌํ„ดํ•œ๋‹ค.

mallocํ•จ์ˆ˜๊ฐ€ ์–ด๋–ค ์ด์œ ๋กœ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ๋˜๋ฉด 0๊ฐ’์„ ๋ฆฌํ„ดํ•œ๋‹ค. 

 

malloc์— ๋Œ€์‘ํ•˜๋Š” ํ•ด์ œ ํ•จ์ˆ˜๋Š” free()์ด๋‹ค. free ํ•จ์ˆ˜์—๋Š” ํฌ์ธํ„ฐ ์ธ์ž๊ฐ€ ํ•„์š”ํ•˜๊ณ , ๋‚˜์ค‘์— ๋‹ค์‹œ ๊ทธ ๊ณต๊ฐ„์„ ์‚ฌ์šฉํ•˜๋ ค๋ฉด ์ธ์ž ํฌ์ธํ„ฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ํ•ด์ œํ•œ๋‹ค.

char *char_ptr; 

// ํž™ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น (mem_size ๋ฐ”์ดํŠธ ๋งŒํผ ํ• ๋‹น)
char_ptr = (char *) malloc(mem_size);

 

chunk์˜ ๊ตฌ์กฐ

 

ํž™ ํ• ๋‹น ์˜ˆ์‹œ

 

ํž™ ํ•ด์ œ ์˜ˆ์‹œ

 

 

prev_size : ์ด์ „ chunk์˜ ํฌ๊ธฐ ( ์ด์ „ chunk๊ฐ€ free๋˜์—ˆ์„ ๋•Œ ์„ค์ •๋จ )

size : ํ˜„์žฌ chunk์˜ ํฌ๊ธฐ (32bits์—์„œ 8byte, 64bits์—์„œ 16byteํฌ๊ธฐ๋กœ ํ• ๋‹น๋จ) 

-> ํ•˜์œ„ 3bit๋Š” flag๋กœ ์‚ฌ์šฉ(M,A,P)

     PREV_INUSE : ์ด์ „ chunk๊ฐ€ ์‚ฌ์šฉ์ค‘์ธ ๊ฒฝ์šฐ ์„ค์ •๋˜๋Š” ํ”Œ๋ž˜๊ทธ 

     IS_MMAPPED : mmap()๋กœ ํ• ๋‹น๋œ chunk์ธ ๊ฒฝ์šฐ ์„ค์ •๋˜๋Š” ํ”Œ๋ž˜๊ทธ

     NON_MAIN_ARENA : ๋ฉ€ํ‹ฐ ์“ฐ๋ ˆ๋“œ ํ™˜๊ฒฝ์—์„œ main์ด ์•„๋‹ ๋•Œ ์ƒ์„ฑ๋˜๋Š” ํ”Œ๋ž˜๊ทธ

 

fd(forward pointer) : ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ๋‹ค์Œ chunk์˜ ์ฃผ์†Œ 

bk(backward pointer) : ์•„์ง ์‚ฌ์šฉ๋˜์ง€ ์•Š์€ ์ด์ „ chunk์˜ ์ฃผ์†Œ

malloc ์„ ํ†ตํ•ด์„œ ํ• ๋‹น๋œ chunk๋Š” prev_size, size , dataํ•„๋“œ ์ด๋ ‡๊ฒŒ ๊ตฌ์„ฑ

fd์™€ bk๋Š” chunk๊ฐ€ free๊ฐ€ ๋˜๋ฉด ์„ธํŒ…๋จ 

 

Arena ์ข…๋ฅ˜

- Main Arena : ๋ฉ”์ธ ์“ฐ๋ ˆ๋“œ๋กœ์จ ์ƒ์„ฑ 

- Sub Arena : ์ƒˆ๋กœ์šด ์Šค๋ ˆ๋“œ๊ฐ€ ์ƒ์„ฑ๋˜์–ด ํž™ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ณ ์ž ํ•  ๋•Œ ๋‹ค๋ฅธ ์Šค๋ ˆ๋“œ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์„ ์ค„์ด๊ธฐ ์œ„ํ•ด ์ƒˆ๋กœ์šด arena ์ƒ์„ฑ! main arena์™€ ๋‹ฌ๋ฆฌ mmap()์„ ํ†ตํ•ด ์ƒˆ๋กœ์šด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น๋ฐ›๊ณ  mprotect()๋ฅผ ์‚ฌ์šฉํ•ด ํ™•์žฅ 

 

House of Force 

Chunk : malloc()์— ์˜ํ•ด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์š”์ฒญ์ด ๋“ค์–ด์˜จ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ํ• ๋‹น๋ฐ›๋Š” ์˜์—ญ

chunk์˜ ์ข…๋ฅ˜ : Allocated Chunk , Free Chunk, Top Chunk

TopChunk : ๋ฉ”๋ชจ๋ฆฌ์˜ ๋งˆ์ง€๋ง‰์— ์žˆ๋Š” ํŠน๋ณ„ํ•œ chunk์ด๋‹ค.  malloc์ด OS์— ๋” ๋งŽ์€ ๊ณต๊ฐ„์„ ์š”๊ตฌํ•  ๋•Œ TopChunk๋Š” resize๋œ๋‹ค. 

House of Force๋Š” Top chunk์˜ size์— ์ €์žฅ๋œ ๊ฐ’์„ ๋‹ค๋ฅธ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ธ์ˆ˜ ์žˆ๊ณ , ์›ํ•˜๋Š” ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์„ ์š”์ฒญํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๊ตฌํ˜„์ด ๊ฐ€๋Šฅํ•˜๋‹ค.

    - user chunk : ์‚ฌ์šฉ์ž๊ฐ€ ์š”์ฒญํ•œ ํฌ๊ธฐ 

    - remainder chunk : ์š”์ฒญํ•œ ํฌ๊ธฐ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์œผ๋กœ ์ƒˆ๋กญ๊ฒŒ top chunk๊ฐ€ ๋จ 

offset = ํ• ๋‹น๋ฐ›๊ธฐ ์›ํ•˜๋Š” ์ฃผ์†Œ - ์ฒญํฌ ํ—ค๋”์‚ฌ์ด์ฆˆ(0x10) - ํ˜„์žฌ ํƒ‘์ฒญํฌ ์ฃผ์†Œ - ์ฒญํฌ ํ—ค๋”์‚ฌ์ด์ฆˆ(0x10)

๋ฐ˜๋Œ€๋กœ Top chunk๋ณด๋‹ค ํฐ chunk๋ฅผ ์š”์ฒญํ•˜๋ฉด top chunk์˜ ํฌ๊ธฐ๋ฅผ ๋Š˜๋ฆฌ๊ฒŒ ๋จ 

remainder : ํ• ๋‹นํ•˜๊ณ  ๋‚จ์€ chunk ํฌ๊ธฐ 

 

main arena -> top : top chunk์˜ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ 

main arena -> top -> size : top chunk size 

 

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
   
// ์ฝ”๋“œ ์˜ˆ์‹œ 
int main(int argc, char *argv[])
{
    int size;
    unsigned long *buf1, *buf2, *buf3;
 
    fprintf(stderr,"The house of Force"); 
 
    buf1 = malloc(256);
    buf1[33] = 0xffffffffffffffff; // ๋ณ€ํ™˜ํ•  chunk์˜ ํฌ๊ธฐ
 
    buf2 = malloc(0xffffffffffffeee0); // offset
 
    buf3 = malloc(256);
 
    buf3[0] = 0x4141414141414141; // AAAAA..
 
    free(buf3);
   
    return 0;
}

Unsafe Unlink 

 

 

 

[์ฐธ๊ณ ]

https://d41jung0d.tistory.com/108

https://www.lazenca.net/pages/viewpage.action?pageId=1148018 

https://cyber0946.tistory.com/101