๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
๐Ÿ’ ๋ณด์•ˆ·์ทจ์•ฝ์ /๐Ÿ”ธ์‹œ์Šคํ…œ·์šด์˜์ฒด์ œ

[dreamhack] Background: Linux Memory Layout

by Jenny:! 2022. 7. 28.

1. ์„œ๋ก 

 ์ปดํ“จํ„ฐ๋Š” ํฌ๊ฒŒ CPU์™€ ๋ฉ”๋ชจ๋ฆฌ๋กœ ๊ตฌ์„ฑ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. CPU๋Š” ์‹คํ–‰ํ•  ๋ช…๋ น์–ด์™€ ๋ช…๋ น์–ด ์ฒ˜๋ฆฌ์— ํ•„์š”ํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ฝ๊ณ , ISA์— ๋”ฐ๋ผ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์—ฐ์‚ฐ์˜ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ์ ์žฌํ•ฉ๋‹ˆ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ(Memory Corruption) ์ทจ์•ฝ์ 

๊ณต๊ฒฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•…์˜์ ์œผ๋กœ ์กฐ์ž‘ํ•˜๋ฉด, ์กฐ์ž‘๋œ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ’์— ์˜ํ•ด CPU๋„ ์ž˜๋ชป๋œ ๋™์ž‘์„ ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์‹œ์Šคํ…œ ํ•ดํ‚น์—๋Š” ๋‹ค์–‘ํ•œ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•๋“ค์ด ์žˆ์ง€๋งŒ, ๋งŽ์€ ๊ณต๊ฒฉ ๊ธฐ๋ฒ•์ด ๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

 

๋ฉ”๋ชจ๋ฆฌ ์˜ค์—ผ๊ณผ ๊ด€๋ จ๋œ ์ทจ์•ฝ์ 

  • Stack Buffer Overflow
  • Off by One
  • Format String Bug
  • Double Free Bug
  • Use After Free

 ์ด๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•œ ๋ฐฐ๊ฒฝ ์ง€์‹์œผ๋กœ ๋ฆฌ๋ˆ…์Šค ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ(Memory Layout)๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ํ”„๋กœ์„ธ์Šค ๊ฐ€์ƒ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ฐ ๊ตฌ์—ญ์ด ์–ด๋–ค ์ •๋ณด๋ฅผ ๋‹ด๊ณ  ์žˆ๋Š”์ง€ ์ดํ•ดํ•จ์œผ๋กœ์จ ํ”„๋กœ์„ธ์Šค ๋ฉ”๋ชจ๋ฆฌ์˜ ์ „์ฒด ๊ตฌ์กฐ์— ๋Œ€ํ•ด ํŒŒ์•…ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

 

๊ฐœ์š”

  • ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ
  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ
  • BSS ์„ธ๊ทธ๋จผํŠธ
  • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ
  • ํž™ ์„ธ๊ทธ๋จผํŠธ

 

 

2. ๋ฆฌ๋ˆ…์Šค ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ตฌ์กฐ

2.1. ์„ธ๊ทธ๋จผํŠธ๋ž€?

  • ์„ธ๊ทธ๋จผํŠธ : ์ ์žฌ๋˜๋Š” ๋ฐ์ดํ„ฐ์˜ ์šฉ๋„๋ณ„๋กœ ๋ฉ”๋ชจ๋ฆฌ์˜ ๊ตฌํš์„ ๋‚˜๋ˆˆ ๊ฒƒ

 ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ํ”„๋กœ์„ธ์Šค์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ธ๊ทธ๋จผํŠธ(Segment)๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค. ํฌ๊ฒŒ 5๊ฐ€์ง€๋กœ, ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ, ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ, BSS ์„ธ๊ทธ๋จผํŠธ, ํž™ ์„ธ๊ทธ๋จผํŠธ, ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์ž…๋‹ˆ๋‹ค.

 

์„ธ๊ทธ๋จผํŠธ์˜ ์žฅ์ 

์šด์˜์ฒด์ œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์šฉ๋„๋ณ„๋กœ ๋‚˜๋ˆ„๋ฉด, ๊ฐ ์šฉ๋„์— ๋งž๊ฒŒ ์ ์ ˆํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ถŒํ•œ์€ ์ฝ๊ธฐ, ์“ฐ๊ธฐ, ์‹คํ–‰์ด ์žˆ์œผ๋ฉฐ CPU๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋œ ํ–‰์œ„๋งŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

 

(์„ธ๊ทธ๋จผํŠธ๋ฅผ ์ž์„ธํžˆ ์ดํ•ดํ•˜๋ ค๋ฉด, ์šด์˜์ฒด์ œ์˜ ๋ฉ”๋ชจ๋ฆฌ ๊ด€๋ฆฌ๊ธฐ๋ฒ• ์ค‘ ํ•˜๋‚˜์ธ ์„ธ๊ทธ๋จผํ…Œ์ด์…˜ ๊ธฐ๋ฒ•๊ณผ ์ธํ…” x86-64(x64)์—์„œ ๊ด€๋ จ๋œ ํ•˜๋“œ์›จ์–ด์˜ ์„ค๊ณ„๋ฅผ ์กฐ๊ธˆ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

 

 

 

 

 

2.2. ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ

  •  ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ(Code Segment) : ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๊ธฐ๊ณ„ ์ฝ”๋“œ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ
    = ํ…์ŠคํŠธ ์„ธ๊ทธ๋จผํŠธ(Text Segment)

์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์˜ ๊ถŒํ•œ

  • ์ฝ๊ธฐ ๊ถŒํ•œ, ์‹คํ–‰ ๊ถŒํ•œ : ํ”„๋กœ๊ทธ๋žจ์ด ๋™์ž‘ํ•˜๋ ค๋ฉด ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถ€์—ฌ
  • ์“ฐ๊ธฐ ๊ถŒํ•œ : ๊ณต๊ฒฉ์ž๊ฐ€ ์•…์˜์ ์ธ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ๊ฐ€ ์‰ฌ์›Œ์ง€๋ฏ€๋กœ, ์“ฐ๊ธฐ ๊ถŒํ•œ ์ œ๊ฑฐ

 

์˜ˆ์‹œ

์•„๋ž˜์—์„œ ์ •์ˆ˜ 31337์„ ๋ฐ˜ํ™˜ํ•˜๋Š” mainํ•จ์ˆ˜๊ฐ€ ์ปดํŒŒ์ผ ๋˜๋ฉด 554889e5b8697a00005dc3๋ผ๋Š” ๊ธฐ๊ณ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜๋˜๋Š”๋ฐ, ์ด ๊ธฐ๊ณ„ ์ฝ”๋“œ๊ฐ€ ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

int main() { return 31337; }

 

 

2.3. ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ

  • ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ(Data Segment) : ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ’์ด ์ •ํ•ด์ง„ ์ „์—ญ ๋ณ€์ˆ˜ ๋ฐ ์ „์—ญ ์ƒ์ˆ˜๋“ค์ด ์œ„์น˜ํ•˜๋Š” ์˜์—ญ

 

๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์˜ ๊ถŒํ•œ

  • ์ฝ๊ธฐ ๊ถŒํ•œ : CPU๊ฐ€ ์ด ์„ธ๊ทธ๋จผํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ฝ์„ ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋ฏ€๋กœ ๋ถ€์—ฌ
    • ์“ฐ๊ธฐ ๊ถŒํ•œ : data ์„ธ๊ทธ๋จผํŠธ
      - ์ „์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์ด ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด์„œ ๊ฐ’์ด ๋ณ€ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ
    • ์“ฐ๊ธฐ ๊ถŒํ•œ ์—†์Œ : rodata(read-only data) ์„ธ๊ทธ๋จผํŠธ
      - ์ „์—ญ์œผ๋กœ ์„ ์–ธ๋œ ์ƒ์ˆ˜ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋˜๋ฉด์„œ ๊ฐ’์ด ๋ณ€ํ•˜๋ฉด ์•ˆ ๋˜๋Š” ๋ฐ์ดํ„ฐ

 

์˜ˆ์‹œ

์•„๋ž˜๋Š” ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ํฌํ•จ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฐ์ดํ„ฐ์˜ ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ์ฃผ์˜ ๊นŠ๊ฒŒ ์‚ดํŽด๋ด์•ผ ํ•  ๋ณ€์ˆ˜๋Š” str_ptr์ž…๋‹ˆ๋‹ค. str_ptr์€ “ readonly”๋ผ๋Š” ๋ฌธ์ž์—ด์„ ๊ฐ€๋ฆฌํ‚ค๊ณ  ์žˆ๋Š”๋ฐ, ์ด ๋ฌธ์ž์—ด์€ ์ƒ์ˆ˜ ๋ฌธ์ž์—ด๋กœ ์ทจ๊ธ‰๋˜์–ด rodata์— ์œ„์น˜ํ•˜๋ฉฐ, ์ด๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” str_ptr์€ ์ „์—ญ ๋ณ€์ˆ˜๋กœ์„œ data์— ์œ„์น˜ํ•ฉ๋‹ˆ๋‹ค.

int data_num = 31337;                       // data
char data_rwstr[] = "writable_data";        // data
const char data_rostr[] = "readonly_data";  // rodata
char *str_ptr = "readonly";  // str_ptr์€ data, ๋ฌธ์ž์—ด์€ rodata
int main() { ... }

 

 

2.4. BSS ์„ธ๊ทธ๋จผํŠธ

  • BSS ์„ธ๊ทธ๋จผํŠธ(BSS Segment, Block Started By Symbol Segment) : ์ปดํŒŒ์ผ ์‹œ์ ์— ๊ฐ’์ด ์ •ํ•ด์ง€์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ
    - ์„ ์–ธ๋งŒ ํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜ ๋“ฑ

BSS ์„ธ๊ทธ๋จผํŠธ์˜ ๊ถŒํ•œ

  • ์ฝ๊ธฐ ๊ถŒํ•œ, ์“ฐ๊ธฐ ๊ถŒํ•œ

 ์ด ์„ธ๊ทธ๋จผํŠธ์˜ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์€ ํ”„๋กœ๊ทธ๋žจ์ด ์‹œ์ž‘๋  ๋•Œ, ๋ชจ๋‘ 0์œผ๋กœ ๊ฐ’์ด ์ดˆ๊ธฐํ™”๋ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฐ ํŠน์„ฑ ๋•Œ๋ฌธ์— C ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ, ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ 0์ด ๋ฉ๋‹ˆ๋‹ค.

 

 

์˜ˆ์‹œ

์•„๋ž˜ ์ฝ”๋“œ์—์„œ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜์ธ bss_data๊ฐ€ BSS ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

int bss_data;
int main() {
  printf("%d\n", bss_data);  // 0
  return 0;
}

 

 

2.5. ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ

  • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ(Stack Segment) : ํ”„๋กœ์„ธ์Šค์˜ ์Šคํƒ์ด ์œ„์น˜ํ•˜๋Š” ์˜์—ญ
    - ํ•จ์ˆ˜์˜ ์ธ์ž๋‚˜ ์ง€์—ญ ๋ณ€์ˆ˜์™€ ๊ฐ™์€ ์ž„์‹œ ๋ณ€์ˆ˜๋“ค์ด ์‹คํ–‰ ์ค‘์— ์—ฌ๊ธฐ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์˜ ๊ถŒํ•œ

  • ์ฝ๊ธฐ ๊ถŒํ•œ, ์“ฐ๊ธฐ ๊ถŒํ•œ : CPU๊ฐ€ ์ž์œ ๋กญ๊ฒŒ ๊ฐ’์„ ์ฝ๊ณ  ์“ธ ์ˆ˜ ์žˆ๋„๋ก

 

์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์˜ ํŠน์ง•

  • ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์˜ ๋‹จ์œ„ ์Šคํƒ ํ”„๋ ˆ์ž„(Stack Frame)
    - ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ ์‹œ ์ƒ์„ฑ, ๋ฐ˜ํ™˜ ์‹œ ํ•ด์ œ

 ํ”„๋กœ์„ธ์Šค๊ฐ€ ์–ผ๋งˆ๋งŒํผ์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์‚ฌ์šฉํ•  ์ง€๋ฅผ ๋ฏธ๋ฆฌ ๊ณ„์‚ฐํ•˜๊ธฐ๋Š” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šด์˜์ฒด์ œ๋Š” ํ”„๋กœ์„ธ์Šค๋ฅผ ์‹œ์ž‘ํ•  ๋•Œ ์ž‘์€ ํฌ๊ธฐ์˜ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋จผ์ € ํ• ๋‹นํ•ด์ฃผ๊ณ , ๋ถ€์กฑํ•ด์งˆ ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ํ™•์žฅํ•ด ์ค๋‹ˆ๋‹ค. ์Šคํƒ์— ๋Œ€ํ•ด์„œ ‘์•„๋ž˜๋กœ ์ž๋ž€๋‹ค'๋ผ๋Š” ํ‘œํ˜„์„ ์ข…์ข… ์‚ฌ์šฉํ•˜๋Š”๋ฐ, ์ด๋Š” ์Šคํƒ์ด ํ™•์žฅ๋  ๋•Œ, ๊ธฐ์กด ์ฃผ์†Œ๋ณด๋‹ค ๋‚ฎ์€ ์ฃผ์†Œ๋กœ ํ™•์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

 

 

์˜ˆ์‹œ

์•„๋ž˜์˜ ์ฝ”๋“œ์—์„œ๋Š” ์ง€์—ญ๋ณ€์ˆ˜ choice๊ฐ€ ์Šคํƒ์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

void func() {
  int choice = 0;
  scanf("%d", &choice);
  if (choice)
    call_true();
  else
    call_false();
  return 0;
}

 

 

2.6. ํž™ ์„ธ๊ทธ๋จผํŠธ

  • ํž™ ์„ธ๊ทธ๋จผํŠธ(Heap Segment) :ํž™ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ
    - C์–ธ์–ด์—์„œ malloc(), calloc() ๋“ฑ์„ ํ˜ธ์ถœํ•ด์„œ ํ• ๋‹น๋ฐ›๋Š” ๋ฉ”๋ชจ๋ฆฌ

 

ํž™ ์„ธ๊ทธ๋จผํŠธ์˜ ๊ถŒํ•œ

  • ์ฝ๊ธฐ ๊ถŒํ•œ, ์“ฐ๊ธฐ ๊ถŒํ•œ

 

ํž™ ์„ธ๊ทธ๋จผํŠธ์˜ ํŠน์ง•

์Šคํƒ๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์‹คํ–‰ ์ค‘์— ๋™์ ์œผ๋กœ ํ• ๋‹น๋  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ฆฌ๋ˆ…์Šค์—์„œ๋Š” ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์™€ ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ž๋‹ˆ๋‹ค.

 

 

์˜ˆ์‹œ

heap_data_ptr์— malloc()์œผ๋กœ ๋™์  ํ• ๋‹นํ•œ ์˜์—ญ์˜ ์ฃผ์†Œ๋ฅผ ๋Œ€์ž…ํ•˜๊ณ , ์ด ์˜์—ญ์— ๊ฐ’์„ ์“ด๋‹ค. heap_data_ptr์€ ์ง€์—ญ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ์Šคํƒ์— ์œ„์น˜ํ•˜๋ฉฐ, malloc์œผ๋กœ ํ• ๋‹น๋ฐ›์€ ํž™ ์„ธ๊ทธ๋จผํŠธ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค.

int main() {
  int *heap_data_ptr =
      malloc(sizeof(*heap_data_ptr));  // ๋™์  ํ• ๋‹นํ•œ ํž™ ์˜์—ญ์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚ด
  *heap_data_ptr = 31337;              // ํž™ ์˜์—ญ์— ๊ฐ’์„ ์”€
  printf("%d\n", *heap_data_ptr);  // ํž™ ์˜์—ญ์˜ ๊ฐ’์„ ์‚ฌ์šฉํ•จ
  return 0;
}

 

 

๐Ÿ’ก ํž™๊ณผ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์ž๋ผ๋Š” ๋ฐฉํ–ฅ์ด ๋ฐ˜๋Œ€์ธ ์ด์œ ?

๋‘ ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ๋™์ผํ•œ ๋ฐฉํ–ฅ์œผ๋กœ ์ž๋ผ๋ฉฐ ์—ฐ์†๋œ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ๊ฐ๊ฐ ํ• ๋‹น๋œ๋‹ค๋ฉด, ๊ธฐ์กด์˜ ํž™ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ๋ชจ๋‘ ์‚ฌ์šฉํ•˜๊ณ  ๋‚˜์„œ ์ด๋ฅผ ํ™•์žฅํ•˜๋Š” ๊ณผ์ •์—์„œ ์Šคํƒ ์„ธ๊ทธ๋จผํŠธ์™€ ์ถฉ๋Œํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

 

 

 

 

 

 

3. ์š”์•ฝ

 

์„ธ๊ทธ๋จผํŠธ ์—ญํ•  ์ผ๋ฐ˜์ ์ธ ๊ถŒํ•œ ์‚ฌ์šฉ ์˜ˆ
์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๊ฐ€ ์ €์žฅ๋œ ์˜์—ญ ์ฝ๊ธฐ, ์‹คํ–‰ main() ๋“ฑ์˜ ํ•จ์ˆ˜ ์ฝ”๋“œ
๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜ ๋˜๋Š” ์ƒ์ˆ˜๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ ์ฝ๊ธฐ์™€ ์“ฐ๊ธฐ ๋˜๋Š” ์ฝ๊ธฐ ์ „์šฉ ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ ๋ณ€์ˆ˜, ์ „์—ญ ์ƒ์ˆ˜
BSS ์„ธ๊ทธ๋จผํŠธ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์˜์—ญ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ์ดˆ๊ธฐํ™”๋˜์ง€ ์•Š์€ ์ „์—ญ ๋ณ€์ˆ˜
์Šคํƒ ์„ธ๊ทธ๋จผํŠธ ์ž„์‹œ ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜๋Š” ์˜์—ญ ์ฝ๊ธฐ, ์“ฐ๊ธฐ ์ง€์—ญ ๋ณ€์ˆ˜, ํ•จ์ˆ˜์˜ ์ธ์ž ๋“ฑ
ํž™ ์„ธ๊ทธ๋จผํŠธ ์‹คํ–‰์ค‘์— ๋™์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ์˜์—ญ ์ฝ๊ธฐ, ์“ฐ๊ธฐ malloc(), calloc() ๋“ฑ์œผ๋กœ ํ• ๋‹น ๋ฐ›์€ ๋ฉ”๋ชจ๋ฆฌ

 

 

4. ์˜ˆ์ œ

#include <stdlib.h>
int a = 0xa;
const char b[] = "d_str";
int c;
int foo(int arg) {
  int d = 0xd;
  return 0;
}
int main()
{
  int *e = malloc(sizeof(*e));
  return 0;
}

 

1. e๋Š” ์–ด๋А ์„ธ๊ทธ๋จผํŠธ์˜ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”๊ฐ€?

 malloc() ํ•จ์ˆ˜๋กœ ๋™์ ํ• ๋‹น๋˜์—ˆ์œผ๋กœ ํž™ ์„ธ๊ทธ๋จผํŠธ์ด๋‹ค.

 

2. a, b๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋””์ธ๊ฐ€?

 ์ดˆ๊ธฐํ™”๋œ ์ „์—ญ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ๋ฐ์ดํ„ฐ ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•œ๋‹ค.

 

3. "d_str"์ด ์œ„์น˜ํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋””์ธ๊ฐ€?

 ๋ฌธ์ž์—ด "d_str"์€ ์ฝ๊ธฐ ์ „์šฉ ๋ฐ์ดํ„ฐ(rodata) ์„ธ๊ทธ๋จผํŠธ์— ์ €์žฅ๋œ๋‹ค.

 

4. foo๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋””์ธ๊ฐ€?

 ํ•จ์ˆ˜ ์ฝ”๋“œ๋Š” ์ฝ”๋“œ ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•œ๋‹ค.

 

5. d๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋””์ธ๊ฐ€?

 ์ง€์—ญ๋ณ€์ˆ˜์ด๋ฏ€๋กœ ์Šคํƒ์— ์œ„์น˜ํ•œ๋‹ค.

 

6. c๊ฐ€ ์œ„์น˜ํ•˜๋Š” ์„ธ๊ทธ๋จผํŠธ๋Š” ์–ด๋””์ธ๊ฐ€?

 ์ดˆ๊ธฐํ™” ๋˜์ง€ ์•Š์€ ์ „์—ญ๋ณ€์ˆ˜์ด๋ฏ€๋กœ BSS ์„ธ๊ทธ๋จผํŠธ์— ์œ„์น˜ํ•œ๋‹ค.