Skip to main content
  1. Posts/
  2. Today I Learned/

CSAPP 3.10 Combining Control and Data in Machine-Level Programs

·988 words·5 mins
Jiho Kim
Author
Jiho Kim
๋‹ฌ๋ ค ๋˜ ๋‹ฌ๋ ค

๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ
#

  • ๋ฐ์ดํ„ฐ์™€ ๋จธ์‹ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ๋”ฐ๋กœ ์‚ดํŽด๋ณด์•˜๋‹ค
    • ์ด์ œ๋ถ€ํ„ฐ๋Š” ํ•ฉ์ณ์„œ ํ™•์ธํ•ด๋ณด์ž
    • ์ด๊ฑด ํฌ์ธํ„ฐ ๋‹จ์œ„๋กœ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค.
    • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋„ ์—ฐ๊ตฌํ•ด๋ณด์ž
    • ์Šคํƒ ์ €์žฅ๋Ÿ‰์ด ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ? ๋ฅผ ํ™•์ธํ•ด๋ณด์ž
  • 3.10.1 Understanding Pointers
    • ๋ชจ๋“  ํฌ์ธํ„ฐ๋Š” associated type์ด ์žˆ๋‹ค.
      • ์–ด๋–ค object๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๋‚˜ํƒ€๋‚ด๋Š” ๊ฒƒ
    • ๊ฐ์ฒด๊ฐ€ ํƒ€์ž… T๋ฅผ ๊ฐ–๋Š” ๊ฒฝ์šฐ, T์˜ ํฌ์ธํ„ฐ๋Š” ํƒ€์ž… *T๋ฅผ ๊ฐ–๋Š”๋‹ค.
      • ํƒ€์ž… *T์˜ ํฌ์ธํ„ฐ๋Š” **T์ด๋‹ค.
      • ๊ทธ๋ƒฅ * ๋ผ๊ณ  ์“ฐ๋ฉด ์ผ๋ฐ˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฐ˜ํ™˜ํ•œ๋‹ค.
      • ์ด ํฌ์ธํ„ฐ ์œ ํ˜•์€ ๊ธฐ๊ณ„์ฝ”๋“œ์˜ ์ผ๋ถ€๋Š” ์•„๋‹ˆ์ง€๋งŒ, ์˜ค๋ฅ˜๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด C๊ฐ€ ์ œ๊ณตํ•˜๋Š” ์ถ”์ƒํ™”์ž„
    • ๋ชจ๋“  ํฌ์ธํ„ฐ์˜ ๊ฐ’์€ ์ผ๋ถ€ ๊ฐ์ฒด์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌํ‚จ๋‹ค
      • NULL(0)์ผ๋•Œ ๋นผ๊ณ  (์•„๋ฌด๋ฐ๋„ ๊ฐ€๋ฆฌํ‚ค์ง€ ์•Š์Œ)
    • ํฌ์ธํ„ฐ๋Š” &์—ฐ์‚ฐ์œผ๋กœ ์ƒ์„ฑ๋œ๋‹ค
      • ๊ธฐ๊ณ„์ฝ”๋“œ์—์„œ๋Š” ์ฃผ๋กœ leaq๋กœ ๋‚˜ํƒ€๋‚ด์ง€๋”๋ผ
    • ํฌ์ธํ„ฐ๋Š” *์—ฐ์‚ฐ์œผ๋กœ ์—ญ์ฐธ์กฐ๋œ๋‹ค.
      • ์ง€์ •๋œ ์ฃผ์†Œ๋กœ ์ €์žฅํ•˜๊ฑฐ๋‚˜ ์ง€์ •๋œ ์ฃผ์†Œ๋กœ๋ถ€ํ„ฐ ๊ฒ€์ƒ‰ํ•œ๋‹ค.
    • ๋ฐฐ์—ด๊ณผ ํฌ์ธํ„ฐ๋Š” ๋ฐ€์ ‘ํ•œ ๊ด€๋ จ์ด ์žˆ๋‹ค.
      • ๋ฐฐ์—ด์˜ ์ด๋ฆ„์€ ๋งˆ์น˜ ํฌ์ธํ„ฐ ๋ณ€์ˆ˜์ธ ๊ฒƒ์ฒ˜๋Ÿผ ์ฐธ์กฐ๋œ๋‹ค.
    • ํฌ์ธํ„ฐ๋ฅผ ์บ์ŠคํŒ…ํ•  ๋•Œ, ๊ทธ ์œ ํ˜•์€ ๋ฐ”๋€Œ์ง€๋งŒ ๊ทธ๊ฐ’์€ ๋ฐ”๋€Œ์ง€ ์•Š๋Š”๋‹ค.
      • ํ•˜์ง€๋งŒ ์Šค์ผ€์ผ๋ง์„ ๋ฐ”๊ฟ€ ์ˆœ ์žˆ๋‹ค
      • EX) p๊ฐ€ char * ์œ ํ˜•์˜ ํฌ์ธํ„ฐ์ธ ๊ฒฝ์šฐ
        • (int *) p+7์€ p+28์„ ๊ณ„์‚ฐํ•˜๊ณ , (int *) (p+7)์€ p+7์„ ๊ณ„์‚ฐํ•œ๋‹ค.
    • ํฌ์ธํ„ฐ๋Š” ํ•จ์ˆ˜๋ฅผ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜๋„ ์žˆ๋‹ค.
      •   int fun(int x, int *p);
          int (*fp)(int, int *); fp = fun;
          int y = 1;
          int result = fp(3, &y);
    • ํ•จ์ˆ˜ ํฌ์ธํ„ฐ์˜ ๊ฐ’์€ ํ•จ์ˆ˜์˜ ๊ธฐ๊ณ„์ฝ”๋“œ ํ‘œํ˜„์—์„œ ์ฒซ๋ฒˆ์งธ ๋ช…๋ น์–ด์˜ ์ฃผ์†Œ์ด๋‹ค.
  • 3.10.2 Life in the Real World: Using the GDB Debugger
    • gdb๋Š” GNU ๋””๋ฒ„๊ฑฐ
    • ใ…‹ใ…‹ bomb lab ํ’€๋ฉด์„œ ์ด๋ฏธ ์จ๋ดค์ง€๋กฑ
  • 3.10.3 Out-of-Bounds Memory References and Buffer Overflow
    • C๋Š” ๋ฐฐ์—ด ์ฐธ์กฐ์— ๋Œ€ํ•œ ์ž„์˜์˜ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š”๋‹ค
      • ์ €์žฅ๋œ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ’
      • ๋ฐ˜ํ™˜ ์ฃผ์†Œ์™€ ๊ฐ™์€ ์ƒํƒœ ์ •๋ณด
      • ๋กœ์ปฌ ๋ณ€์ˆ˜
      • ์ด ๋ชจ๋“ ๊ฒƒ๋“ค์ด ์Šคํƒ์— ์ €์žฅ๋œ๋‹ค
    • ๊ทผ๋ฐ ์ด๊ฑด ์‹ฌ๊ฐํ•œ ํ”„๋กœ๊ทธ๋žจ ์˜ค๋ฅ˜๋ฅผ ์ดˆ๋ž˜ํ•  ์ˆ˜๋„ ์žˆ๋‹ค!!
      • Out of bound ๋ฐฐ์—ด ์š”์†Œ์— ์ž‘์„ฑํ•˜๋Š”๊ฒƒ์œผ๋กœ!
      • ๊ทธ๋ฆฌ๊ณ  ์ด์ƒํƒœ๋กœ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๊ฑฐ๋‚˜ ret ๋ช…๋ น์–ด๋ฅผ ํ•˜๋ ค๊ณ  ํ•˜๋ฉด ํ„ฐ์งˆ ์ˆ˜ ์žˆ๋‹ค.
    • ์ด๋Ÿฐ๊ฑธ Buffer Overflow๋ผ๊ณ  ํ•œ๋‹ค.
      • ๋ฌธ์ž์—ด์„ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ ์ƒ์— ์ผ๋ถ€ ๋ฌธ์ž ๋ฐฐ์—ด์—์ด ํ• ๋‹น๋˜์ง€๋งŒ, ๊ทธ ํฌ๊ธฐ๊ฐ€ ๋„˜์–ด๊ฐ„ ๊ฒฝ์šฐ
    • char *gets(char *s){
          int c;
          char *dest = s;
          while((c = getchar()) != '\n' && c != EOF) *dest++ = c;
          if(c == EOF && dest == s) return NULL;
          *dest++ = '\0';
          return s;
      }
      
      void echo(){
          char buf[8];
          gets(buf);
          puts(buf);
      }
      • ์ด๋Ÿฐ ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ํ•˜์ž! ๊ทธ๋Ÿฐ๋ฐ ์ด ์ฝ”๋“œ๋Š” ์ž…๋ ฅ์ด ํฌ๊ธฐ์ธ 8์„ ๋„˜๋Š”์ง€ ์•ˆ๋„˜๋Š”์ง€ ์•Œ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค….
      • ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ๋„ ๋ด๋ณผ๊นŒ?
    •     void echo()
    1 echo: 2 subq $24, %rsp Allocate 24 bytes on stack 3 movq %rsp, %rdi Compute buf as %rsp 4 call gets Call gets 5 movq %rsp, %rdi Compute buf as %rsp 6 call puts Call puts 7 addq $24, %rsp Deallocate stack space 8 ret Return ``` - ์Šคํƒ ํฌ์ธํ„ฐ์—์„œ 24๋ฅผ ๋นผ์„œ ํ• ๋‹นํ•˜๊ณ , ๋งจ์œ„์— ์ €์žฅํ•˜๊ณ .. - rsp๋ฅผ rdi์— ์ ์–ด๋†”์„œ gets / puts ๋‘˜๋‹ค์—๋„ ์“ธ ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๊ณ  - buf๊ฐ€ ๊ทธ๋Ÿฌ๋ฉด 8๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๋‹ˆ๊นŒ, ๋’ค์— 16๋ฐ”์ดํŠธ๋Š” ์•ˆ์“ด๋‹ค. - ์‚ฌ์šฉ์ž๊ฐ€ 7๊ฐœ ๋ฌธ์ž ์ž…๋ ฅ (์ข…๋ฃŒ๋ฌธ์ž์—ด๊นŒ์ง€ 8๊ฐœ) ๊นŒ์ง€๋Š” ๋ฌธ์ œ๊ฐ€ ์—†๊ฒ ์ง€๋งŒ… ์ด๋ฅผ ๋„˜์–ด๊ฐ€๋ฉด? - 0-7: buf์— ์ž˜ ๋“ค์–ด๊ฐ - 9-23: ๋น„์–ด์žˆ๋Š” ์Šคํƒ๊ณต๊ฐ„ - 24-31: Return address - 32+: caller์— ์ €์žฅ๋œ ๊ฐ’๋“ค
    • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” ๋ฒ„๊ทธ๊ฐ€ ํ„ฐ์ง€๋Š”๊ฒƒ๋„ ๋ฌธ์ œ์ง€๋งŒ..
      • ์›ํ•˜์ง€ ์•Š๋Š” ํ–‰๋™์„ ๋งˆ์Œ๋Œ€๋กœ ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด?
      • ์ด๊ฒƒ์ด ์ปดํ“จํ„ฐ ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์‹œ์Šคํ…œ์˜ ๋ณด์•ˆ์„ ๊ณต๊ฒฉํ•˜๋Š” ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ธ ๋ฐฉ๋ฒ•
      • ์ด๋ฅผ Exploit code๋ผ๊ณ  ํ•œ๋‹ค.
    • ๋ญ ์•”ํŠผ ๋ณด์•ˆ์„ ์ž˜ํ•ด์•ผํ•œ๋‹ค๋Š” ์ด์•ผ๊ธฐ
  • 3.10.4 Thwarting Buffer Overflow Attacks
    • ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฌธ์ œ๊ฐ€ ๋˜๋‹ˆ๊นŒ ํ˜„๋Œ€ ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์šด์˜์ฒด์ œ๋Š” ์ด๋ฅผ ๋ง‰๋Š” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ๊ตฌํ˜„ํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๋‹ค
    • Stack Randomization
      • ์‹œ์Šคํ…œ ๋‚ด์— ์ต์Šคํ”Œ๋กœ์ž‡ ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๊ธฐ ์œ„ํ•ด์„œ ๊ณต๊ฒฉ์ž๋Š” ์ฝ”๋“œ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ฝ”๋“œ ๋ชจ๋‘๋ฅผ ์ฃผ์ž…ํ•ด์•ผํ•จ.
      • ๋˜ํ•œ, ํ•ด๋‹น ๋ฌธ์ž์—ด์ด ๋“ค์–ด๊ฐˆ ์Šคํƒ/๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ๋„ ์•Œ์•„์•ผ๋œ๋‹ค!!
        • ์—ญ์‚ฌ์ ์œผ๋กœ, ์ด๋Š” ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์•˜๋‹ค.
        • ๊ณต๊ฒฉ์ž๊ฐ€ ๊ณตํ†ต ์›น์„œ๋ฒ„์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์Šคํƒ ์ฃผ์†Œ๋ฅผ ์ฐพ์•˜๋‹ค๋ฉด?
          • ๋งŽ์€ ๋จธ์‹ ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ณต๊ฒฉ์„ ๋งŒ๋“ค ์ˆ˜ ์žˆ์—ˆ๋‹ค.
      • ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ, ์Šคํƒ์˜ ์œ„์น˜๋ฅผ ๊ฐ ํ”„๋กœ๊ทธ๋žจ์˜ ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅด๊ฒŒ ํ•˜์ž.
        • ๋งŽ์€ ๋จธ์‹ ์ด ๊ฐ™์€ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋”๋ผ๋„, ๋ชจ๋‘ ์ƒ์ดํ•œ ์Šคํƒ ์ฃผ์†Œ๋ฅผ ์‚ฌ์šฉํ•  ๊ฒƒ์ด๋‹ค.
        • allocaํ•จ์ˆ˜๊ฐ™์€๊ฑธ ์ด์šฉํ•ด์„œ ํ”„๋กœ๊ทธ๋žจ ์‹œ์ž‘์‹œ ์Šคํƒ์ƒ์— ๋žœ๋คํ•œ ๊ฐ’์„ ํ• ๋‹นํ•œ๋‹ค
          • ์ด ๊ฐ’์€ ์ถฉ๋ถ„ํ•œ ๋ณ€๋™์„ ์–ป์„์ˆ˜ ์žˆ์„์ •๋„๋กœ ์ปค์•ผํ•˜์ง€๋งŒ, ๋‚ญ๋น„ํ•˜์ง€ ์•Š์„๋งŒํผ ์ž‘์•„์•ผํ•˜๋Š”.. ๋‹น์—ฐํ•œ๋ง
      • ๊ฐ„๋‹จํ•˜๊ฒŒ๋Š” ์ด๋ ‡๊ฒŒ ํ™•์ธ ๊ฐ€๋Šฅํ•˜๋‹ค
      • int main(){
            long local;
            printf("local at %p\n", &local);
            return 0;
        }		   
        
        • ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ธ์ œ๋‚˜ ๊ฐ™์€ ๊ฐ’์„ ๊ฐ€์ง€์ง€ ์•Š์Œ์„ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ด๋Š” ํ˜„์žฌ ๋ฆฌ๋ˆ…์Šค ์‹œ์Šคํ…œ์—์„œ ํ‘œ์ค€ ๊ด€ํ–‰์ด๋‹ค.
      • ํ•˜์ง€๋งŒ ์ด๋Š” ์–ด๋А์ •๋„์˜ ๊ณต๊ฒฉ์„ ๋ง‰์„ ์ˆ˜๋Š” ์žˆ์ง€๋งŒ
        • ๊ณต๊ฒฉ์ž๊ฐ€ ์ •๋ง ํž˜๋‚ด๋ฉด ๋‹ค๋ฅธ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ง„ ๊ณต๊ฒฉ์„ ๋ฐ˜๋ณต์ ์œผ๋กœ ์‹œ๋„ํ•ด์„œ ๋ธŒ๋ฃจํŠธํฌ์Šค๋กœ ๊ทน๋ณต ๊ฐ€๋Šฅํ•˜๋‹ค.
    • Stack Corruption Detection
      • ์Šคํƒ์ด ์†์ƒ๋˜์—ˆ์„ ๋•Œ๋ฅผ ๊ฐ์ง€ํ•˜๋ฉด ๋˜์ง€ ์•Š์„๊นŒ?
        • echoํ•จ์ˆ˜๋Š” local buffer์˜ ๊ฒฝ๊ณ„๋ฅผ ์ดˆ๊ณผํ•  ๋•Œ ํ„ฐ์กŒ์—ˆ๋‹ค
        • C์—์„œ๋Š” ๋ฐฐ์—ด์˜ ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด์„œ ์“ฐ๊ธฐ๋ฅผ ๋ฐฉ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ด ์—†๋‹ค.
        • ๋Œ€์‹  ํ”„๋กœ๊ทธ๋žจ์€ ๊ทธ๋Ÿฌํ•œ ์“ฐ๊ธฐ๊ฐ€ ์–ด๋– ํ•œ ํ•ด๋กœ์šด ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ธฐ ์ „์— ๋ญ”๊ฐ€๊ฐ€ ๋ฐœ์ƒํ•œ์  ์žˆ๋Š”์ง€๋ฅผ ๊ฒ€์‚ฌํ•  ์ˆ˜ ์žˆ๋‹ค.
      • ์ด๋Š” ๋ฒ„ํผ ์˜ค๋ฒ„๋Ÿฐ์„ ๊ฒ€์ถœํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ์— ์Šคํƒ ๋ณดํ˜ธ์ž๋กœ ์•Œ๋ ค์ง„ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ํ†ตํ•ฉํ•œ๋‹ค (?)
        • ์ž„์˜์˜ ๋กœ์ปฌ ๋ฒ„ํผ์™€ ๋‚˜๋จธ์ง€ ์Šคํƒ๋“ค ์‚ฌ์ด์— ํŠน๋ณ„ํ•œ canary ๊ฐ’์„ ์ง€์ •ํ•˜๋Š” ๊ฒƒ
          • ์ด๋Š” guard๊ฐ’์ด๋ผ๊ณ ๋„ ํ•˜๋ฉฐ, ํ”„๋กœ๊ทธ๋žจ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ๋ฌด์ž‘์œ„๋ผ์„œ ๊ณต๊ฒฉ์ž๊ฐ€ ๊ทธ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์‰ฝ๊ฒŒ ๊ฒฐ์ •ํ•  ์ˆ˜ ์—†๋‹ค.
      • ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๋ณต์›ํ•˜๊ณ  ๋Œ์•„๊ฐ€๊ธฐ ์ „์—, ํ”„๋กœ๊ทธ๋žจ์€ ์ด canary๊ฐ€ ๋ณ€๊ฒฝ๋˜์—ˆ๋Š”์ง€ ์•ˆ๋๋Š”์ง€ ํ™•์ธํ•œ๋‹ค.
        • ์•„ํ•˜, ์˜ˆ์ „์— bomb lab์—์„œ ๋ดค๋˜ %fs:40์ด ์ด๊ฑฐ์˜€๊ตฌ๋‚˜!!!
    • Limiting Executable Code Regions
      • ๊ณต๊ฒฉ์ž๊ฐ€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์‹œ์Šคํ…œ์— ์‚ฝ์ž…ํ•˜๋Š” ๋Šฅ๋ ฅ์„ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ
        • ๊ทธ์ค‘ ํ•œ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ์ €์žฅํ•˜๋Š”๊ฒƒ์„ ์ œํ•œํ•˜๋Š” ๊ฒƒ
          • ์˜ˆ๋ฅผ ๋“ค์–ด, ์ปดํŒŒ์ผ๋Ÿฌ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๋ถ€๋ถ„๋งŒ ์‹คํ–‰ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ณ , ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„์€ ์ฝ๊ธฐ ๋ฐ ์“ฐ๊ธฐ๋งŒ ํ—ˆ์šฉํ•˜๋„๋ก ์ œํ•œํ•  ์ˆ˜ ์žˆ๊ฒ ๋‹ค.
          • ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๊ณต๊ฐ„์€ ํŽ˜์ด์ง€๋‹น 2048 / 4096๋ฐ”์ดํŠธ์ž„. (9์žฅ์—์„œ ๋ฐฐ์šธ ๊ฒƒ)
          • ํ•˜๋“œ์›จ์–ด๋Š” ํ”„๋กœ๊ทธ๋žจ / ์šด์˜์ฒด์ œ ๋“ฑํ•œํ…Œ ์•ก์„ธ์Šค ํ˜•ํƒœ๋ฅผ ์ง€์ •ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ณดํ˜ธ๋ฅผ ์ง€์›ํ•จ
          • ๋งŽ์€ ์‹œ์Šคํ…œ๋“ค์€ ์ฝ๊ธฐ / ์“ฐ๊ธฐ / ์‹คํ–‰์— ๋Œ€ํ•œ ์ œ์–ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค.
            • ์—ญ์‚ฌ์ ์œผ๋กœ x86์€ ์ฝ๊ธฐ ๋ฐ ์‹คํ–‰์„ 1๋น„ํŠธ ํ”Œ๋ž˜๊ทธ๋กœ ๋ณ‘ํ•ฉํ•˜์—ฌ, ์ฝ๊ธฐ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉด ์‹คํ–‰๋„ ๊ฐ€๋Šฅํ–ˆ๋‹ค.
              • ์Šคํƒ์ชฝ๋„ ์ฝ์–ด์•ผํ•˜๊ธฐ๋•Œ๋ฌธ์— ์Šคํƒ์˜ ๋ฐ”์ดํŠธ๋„ ์‹คํ–‰์ด ๊ฐ€๋Šฅํ–ˆ๋‹ค
            • ํ•˜์ง€๋งŒ ์ด์ œ 64๋น„ํŠธ ํ”„๋กœ์„ธ์„œ์—์„œ๋Š” AMD๋„ ์ธํ…”๋„ ์ด๋ฅผ ๋ถ„๋ฆฌํ•˜๊ธฐ ์‹œ์ž‘ํ–‡๋‹ค.
    • ์ด ์„ธ๊ฐ€์ง€ ๊ธฐ์ˆ ๋“ค์€ ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜ ๋…ธ๋ ฅ๋„, ์ˆ˜ํ–‰ ์˜ค๋ฒ„ํ—ค๋“œ๋„ ์ ๋‹ค.
    • ๊ฐœ๋ณ„์ ์œผ๋กœ ์ทจ์•ฝ์„ฑ ์ˆ˜์ค€์„ ๋‚ฎ์ถ”๊ณ , ์กฐํ•ฉํ•ด์„œ ๋” ์ข‹๊ธฐ๋„ ํ•˜๋‹ค.
    • ํ•˜์ง€๋งŒ ๋ถˆํ–‰ํžˆ๋„ ์ปดํ“จํ„ฐ๋ฅผ ๊ณต๊ฒฉํ•˜๋Š” ๋ฐฉ๋ฒ•๋“ค์€ ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๊ณ , worm๊ณผ ๋ฐ”์ด๋Ÿฌ์Šค๋“ค์€ ๊ณ„์† ๊ณต๊ฒฉํ•ด๋‚˜๊ฐ„๋‹ค.
  • 3.10.5 Supporting Variable-Size Stack Frames
    • ์ง€๊ธˆ๊นŒ์ง€๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์Šคํƒ์— ์–ผ๋งŒํผ์„ ํ• ๋‹นํ•ด์•ผํ•˜๋Š”์ง€ ๋ฏธ๋ฆฌ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์—ˆ๋‹ค.
      • ํ•˜์ง€๋งŒ ์ผ๋ถ€ ๊ธฐ๋Šฅ์€ ์š”๊ตฌํ•˜๋Š” ์Šคํƒ ๋ฉ”๋ชจ๋ฆฌ์˜ ์–‘์ด ๋‹ฌ๋ผ์งˆ ์ˆ˜ ์žˆ๋‹ค!
        • ์˜ˆ๋ฅผ๋“ค์–ด, alooca ๋“ฑ์˜ ์ž„์˜ ํฌ๊ธฐ์˜ ๋ฐ”์ดํŠธ๋ฅผ ์Šคํƒ์— ํ• ๋‹นํ•˜๋Š” ๊ฑฐ๋ผ๋˜์ง€,
        • ๊ฐ€๋ณ€ ํฌ๊ธฐ์˜ ๋กœ์ปฌ ์–ด๋ ˆ์ด๋ฅผ ์„ ์–ธํ•˜๋˜์ง€
    • ๋”ฐ๋ผ์„œ, ๋‚˜์ค‘์— ํ•จ์ˆ˜๋กœ ๋Œ์•„๊ฐˆ๋•Œ ์Šคํƒ ํฌ์ธํ„ฐ์˜ ์œ„์น˜๊ฐ€ ์–ด๋””์˜€๋Š”์ง€๋ฅผ ๊ธฐ์–ตํ•˜๊ธฐ ์œ„ํ•ด, ์ด๋ฅผ ํ”„๋ ˆ์ž„ ํฌ์ธํ„ฐ๋งˆ๋ƒฅ %rbp์— ์ €์žฅํ•ด๋‘์ž!!
      • ๊ทธ๋Ÿฌ๋ฉด %rsp๊ฐ€ ์–ผ๋งˆ๋‚˜ ํฌ๋”๋ผ๋„ ํ•จ์ˆ˜ return์‹œ ์–ด๋””๋กœ ๋Œ์•„๊ฐ€์•ผํ•˜๋Š”์ง€๋Š” ํ™•์‹คํ•˜๋‹ค.
      • ์ด๊ฑด ๊ธฐ๊ณ„์ฝ”๋“œ์— leave๋ผ๊ณ  ์žˆ๋‹ค.

โ”์งˆ๋ฌธ ์‚ฌํ•ญ
#

  • ์™œ 8๋ฐ”์ดํŠธ๊ฐ€ ์•„๋‹Œ 24๋ฐ”์ดํŠธ๋ฅผ ๋•ก๊ฒผ์ง€?
    • -> 16๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ rsp๋ฅผ ๋งž์ถ”๊ธฐ ์œ„ํ•ด
  • Stack Randomization, Stack Canary ๋ชจ๋‘ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ๊ฒฐ์ •๋œ๊ฑฐ ์•„๋‹Œ๊ฐ€? ๋žœ๋ค๊ฐ’์ด?
    • ๊ฐ™์€ ์ปดํŒŒ์ผ๋œ ๋ฐ”์ด๋„ˆ๋ฆฌํŒŒ์ผ์„ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฐ๊ตญ ์ผ์–ด๋‚˜๋Š”์ผ์€ ์–ธ์ œ๋‚˜ ๊ฐ™์€๊ฑด๊ฐ€?
      • -> ใ„ด.ใ„ด fs:40๊ฐ™์€๋ฐ ๋“ค์–ด์ด์žˆ๋Š” ๊ฐ’์€ ๋งจ๋‚  ๋‹ค๋ฅด๋‹ค
    • ๊ทธ๋ž˜๋„ RNG๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ๋ฐ•ํ˜€์žˆ๋Š”๊ฑฐ ์•„๋‹Œ๊ฐ€?
      • -> ๋งž๊ธด ํ•œ๋ฐ, ๊ฐ„๋‹จํ•œ rand()๊ธ‰์ด ์•„๋‹ˆ๊ณ  ๋งˆ์šฐ์Šค ์›€์ง์ž„ / ํ•˜๋“œ์›จ์–ด ์ธํ„ฐ๋ŸฝํŠธ๋“ฑ ๋‹ค์–‘ํ•œ ๋ถˆ๊ทœ์น™์  ์‹ ํ˜ธ๋“ค์„ ๋ชจ์•„์„œ ๋ฌด์ž‘์œ„ํ™”ํ•œ๋‹ค.
      • ์Šคํƒ์—์„œ printf๊ฐ™์€๊ฑธ๋กœ๋„ ๋ชป์ฝ๊ฒŒ ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ๋ฅผ 0x00(NULL)๋กœ ์„ค์ •ํ•ด์„œ ๋ฌธ์ž์—ด ํ•จ์ˆ˜ ๋“ฑ๋„ ๋ฐฉ์–ดํ•œ๋‹ค!

๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ
#

  • CSAPP