Skip to main content

CSAPP Chapter 3

์ฑ•ํ„ฐ
#

2026

CSAPP Attack Lab

·1218 words·6 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # Part I: Code Injection Attacks # ์ƒˆ๋กœ์šด ์ฝ”๋“œ๋ฅผ ์ธ์ ์…˜ํ•˜์ง€๋Š” ์•Š๊ณ , string์„ ์ง์ ‘ ๋ฐ•์•„๋„ฃ์–ด์„œ ์กด์žฌํ•˜๋Š” ํ”„๋กœ์‹œ์ ธ๋กœ ๊ฝ‚์„๊ฒƒ์ด๋‹ค. void test() { int val; val = getbuf(); printf("No exploit. Getbuf returned 0x%x\n", val); } ์œ„์™€ ๊ฐ™์€ ์ฝ”๋“œ์— ์ง์ ‘ ๋„ฃ์„ ์˜ˆ์ • Level 1 # void touch1() ํ•จ์ˆ˜๋กœ ๊ฐ€๊ฒŒ ๋งŒ๋“ค์ž. 00000000004017a8 <getbuf>: 4017a8: 48 83 ec 28 sub $0x28,%rsp 4017ac: 48 89 e7 mov %rsp,%rdi 4017af: e8 8c 02 00 00 call 401a40 <Gets> 4017b4: b8 01 00 00 00 mov $0x1,%eax 4017b9: 48 83 c4 28 add $0x28,%rsp 4017bd: c3 ret 4017be: 90 nop 4017bf: 90 nop getbuf ํ•จ์ˆ˜๋ฅผ ๋ณด๋‹ˆ, 0x28 = 40๋ฐ”์ดํŠธ๋ฅผ ์Šคํƒ๋ฉ”๋ชจ๋ฆฌ์— ํ• ๋‹นํ•˜๊ณ , getํ•จ์ˆ˜๋ฅผ ๋ถ€๋ฅธ๋‹ค.

CSAPP 3.12 Summary

·134 words·1 min
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ๊ทธ๋™์•ˆ C์–ธ์–ด์˜ ์ถ”์ƒํ™” ์ธต์„ ์‚ดํŽด๋ดค๋‹ค! 5์žฅ์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํŠน์„ฑ์„ ์•Œ๋ฉด, ํšจ์œจ์ ์ธ ์ฝ”๋“œ์— ๋Œ€ํ•ด ๋” ์ž˜ ์ดํ•ดํ•˜๊ฒŒ ๋  ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์— ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๊ฒŒ ๋˜์—ˆ๋‹ค. 12์žฅ์—์„œ ๋Ÿฐํƒ€์ž„ ์Šคํƒ์— ํ”„๋กœ๊ทธ๋žจ ๋ณ€์ˆ˜๊ฐ€ ์žˆ๋Š”์ง€, ๋™์  ํ• ๋‹น๋œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์žˆ๋Š”์ง€, ๊ธ€๋กœ๋ฒŒ ํ”„๋กœ๊ทธ๋žจ ๋ฐ์ดํ„ฐ ์ผ๋ถ€์—์žˆ๋Š”์ง€ ๋” ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ ๋ช…๋ น์–ด๋“ค์˜ ์‹œํ€€์Šค๋กœ ํ‘œํ˜„๋˜๋ฉฐ, ๋ช…๋ น์–ด ๊ฐ๊ฐ์€ ๋‹จ์ผ ๋™์ž‘์„ ์ˆ˜ํ–‰ํ•œ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ƒ์ดํ•œ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑ/๋™์ž‘/์ œ์–ด ๋“ฑ ์—ฌ๋Ÿฌ๊ฐ€์ง€๋ฅผ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ ๋ช…๋ น์–ด๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค. C์—์„œ๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ๋ถ€์กฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์กฐ์‹ฌํ•ด์•ผ ํ•œ๋‹ค. C++์€ C์™€ ์œ ์‚ฌํ•˜๊ฒŒ ์ปดํŒŒ์ผ๋˜์ง€๋งŒ, ์ž๋ฐ”๋Š” ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•œ๋‹ค. ์ž๋ฐ” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š” ํŠน๋ณ„ํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋œ๋‹ค. ์ด๋Š” ๊ฐ€์ƒ ๋จธ์‹ ์„ ์œ„ํ•œ ๋จธ์‹  ๋ ˆ๋ฒจ์˜ ํ”„๋กœ๊ทธ๋žจ์ด์ง€๋งŒ, ํ•˜๋“œ์›จ์–ด์—์„œ ์ง์ ‘ ๊ตฌํ˜„๋˜์ง€ ์•Š๋Š”๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์ด๋ฅผ ์‹œ๋ฎฌ๋ ˆ์ด์…˜ํ•˜์—ฌ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ฒ˜๋ฆฌํ•œ๋‹ค. ์ด๋Š” ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ๋Ÿฌ ๊ธฐ๊ณ„์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ๊ณ ๋ คํ•œ C๊ฐ™์€ ๊ฒฝ์šฐ๋Š” x86-64 ๊ธฐ๊ณ„์—์„œ๋งŒ ์‹คํ–‰๋œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ #

CSAPP 3.11 Floating-Point Code

·642 words·4 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # Floating-Point Code ๋ถ€๋™์†Œ์ˆ˜์  ์•„ํ‚คํ…์ณ๋Š” ์–ด์ผ€ ๋™์ž‘ํ• ๋ผ๋‚˜ ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์ด ์ €์žฅ๋˜๊ณ  ์—‘์„ธ์Šค๋˜๋Š” ๋ฐฉ๋ฒ• ๋ถ€๋™์†Œ์ˆซ์  ๋ฐ์ดํ„ฐ์—์„œ ์ž‘๋™ํ•˜๋Š” ๋ช…๋ น์–ด ๋ถ€๋™์†Œ์ˆ˜์  ๊ฐ’์„ ํ•จ์ˆ˜์— ์ „๋‹ฌํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜๋Š”๋ฐ ์‚ฌ์šฉ๋˜๋Š” ์ปจ๋ฒค์…˜/๊ด€๋ก€ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ค‘ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ๋ณด์กด๋˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ทœ์•ฝ SSE๋Š” 128๋น„ํŠธ, AVX๋Š” 256๋น„ํŠธ, AVX-512๋Š” 512๋น„ํŠธ.. %xmm0, %xmm1๋“ฑ์˜ ์–ด์…ˆ๋ธ”๋ฆฌ ์ฝ”๋“œ๊ฐ€ ๋‚˜์˜ค๋ฉด ํ˜„๋Œ€์ ์ธ ๋ ˆ์ง€์Šคํ„ฐ๋‹ค! %rax, %rbx, %rsp, … %r15๋ž‘์€ ์•„์˜ˆ ๋ณ„๊ฐœ. ์œ„์น˜๋„ ๋‹ค๋ฅธ๋“ฏ? ์—ฐ์‚ฐ ๋ฐฉ์‹ ์ž์ฒด๊ฐ€ ๋ณด์ˆ˜๋ฐฉ์‹ / ์ง€์ˆ˜๊ฐ€์ˆ˜ ๋ฐฉ์‹์œผ๋กœ ๋‹ค๋ฅด๋‹ˆ๊นŒ ๋‹ค๋ฅธ ์žฅ์น˜์—์„œ SIMD๋„ ๊ฐ€๋Šฅํ•˜๋‹ค! 3.11.1 Floating-Point Movement and Conversion Operations vmovss / vmovsd / vmovaps / vmovapd ๊ฐ™์€ ๋ช…๋ น์–ด๋“ค์ด ์žˆ๋‹ค ์ฝ”๋“œ ์ตœ์ ํ™” ์ง€์นจ์€ 32๋น„ํŠธ ๋ฐ์ดํ„ฐ๋Š” 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„, 64๋น„ํŠธ ๋ฐ์ดํ„ฐ๋Š” 8๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋„๋ก ๊ถŒ์žฅํ•˜์ง€๋งŒ ์•ˆ๊ทธ๋ž˜๋„ ๋™์ž‘์€ ํ•œ๋‹ค ์ •์ˆ˜ mov๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ์›ฌ๋งŒํ•˜๋ฉด ๋™์ž‘ํ•œ๋‹ค! GCC๋Š” ์Šค์นผ๋ผ ์ด๋™ ์—ฐ์‚ฐ์„ xmm ๋ ˆ์ง€์Šคํ„ฐ - ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์ด์—์„œ๋งŒ ์ˆ˜ํ–‰ํ•œ๋‹ค. xmm ๋ ˆ์ง€์Šคํ„ฐ ์‚ฌ์ด์—์„œ ์ „์†กํ•˜๊ธฐ ์œ„ํ•ด์„  vmovaps๋‚˜ vmoapd ์•ˆ์—์žˆ๋Š” a๋Š” aligned, ์ •๋ ฌ์„ ์˜๋ฏธํ•œ๋‹ค float float_mov(float v1, float *src, float *dst){ float v2 = *src; *dst = v1; return v2; } ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฒˆ์—ญ๋œ๋‹ค. v1 in %xmm0, src in %rdi, dst in %rsi 1 float_mov: 2 vmovaps %xmm0, %xmm1 Copy v1 3 vmovss (%rdi), %xmm0 Read v2 from src 4 vmovss %xmm1, (%rsi) Write v1 to dst 5 ret Return v2 in %xmm0 ``` vmovaps, vmovss๋ฅผ ๋‘˜๋‹ค ํ™•์ธํ•  ์ˆ˜ ์žˆ๋‹ค! float -> ์ •์ˆ˜์—์„œ๋Š” ์ž˜ ๋ฐ˜์˜ฌ๋ฆผํ•ด์„œ ๋“ค์–ด๊ฐ ์ •์ˆ˜ -> float์—์„œ๋Š” ์‹ ๊ธฐํ•˜๊ฒŒ๋„ ๋’ค์— ํ”ผ์—ฐ์‚ฐ์ž๊ฐ€ 3๊ฐœ ๋“ค์–ด๊ฐ„๋‹ค ์ด๋•Œ ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ์ƒ์œ„ ๋ฐ”์ดํŠธ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์ณ์„œ ๋ฌด์‹œํ•ด๋„ ๋œ๋‹ค ์ผ๋‹จ ๋‘๋ฒˆ์งธ ์—ฐ์‚ฐ์ž๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋“ค์–ด๊ฐˆ ๋ ˆ์ง€์Šคํ„ฐ์˜๊ธฐ ๊ธฐ์กด ๊ฐ’์„ ์˜๋ฏธํ•œ๋‹ค. ์›ฌ๋งŒํ•œ ์—ฐ์‚ฐ์—์„œ ๋‘๋ฒˆ์งธ ํ”ผ์—ฐ์‚ฐ์ž์™€ ์„ธ๋ฒˆ์งธ ๋ชฉ์ ์ง€ ํ”ผ์—ฐ์‚ฐ์ž๋Š” ๊ฐ™๋‹ค float -> float์—์„œ ์กฐ๊ธˆ ์ด์ƒํ•œ ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ๋œ๋‹ค ์ƒ์œ„๋น„ํŠธ๋ฅผ ๋‹ค์‹œ ํ™œ์šฉํ•˜์ง€ ๋ชปํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•จ ๊ฐ€์งœ ์˜์กด์„ฑ ์ด์ „์˜ ์ƒ์œ„ ๋น„ํŠธ๊ฐ’์„ ์จ์•ผ๋ ๋•Œ ๊ฐ’์„ ๊ธฐ๋‹ค๋ฆฌ๊ฒŒ ํ•˜์ง€ ์•Š๊ธฐ ์œ„ํ•ด, ๊ทธ๋ƒฅ ๋ฎ์–ด๋ฒ„๋ฆฐ๋‹ค single -> double, double -> single ๋‘˜๋‹ค ๋งˆ์ฐฌ๊ฐ€์ง€ 3.11.2 Floating-Point Code in Procedures ํฌ์•„์•… ํ”„๋กœ์‹œ์ ธ๋‹ค ์–ธ์ œ๋‚˜ ๊ทธ๋žฌ๋“ฏ XMM ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ด์šฉํ•ด์„œ float ์ธ์ˆ˜๋“ค์„ ํ•จ์ˆ˜๋กœ ์ „๋‹ฌํ•˜๊ณ  ๋ฐ˜ํ™˜๋ฐ›๊ณ  ํ•œ๋‹ค x86-64์—์„œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๊ด€์Šต์ด ๊ด€์ฐฐ๋œ๋‹ค ์ตœ๋Œ€ 8๊ฐœ์˜ float arg๊ฐ€ xmm0~7๋กœ ์ „๋‹ฌ๋˜๊ณ , ๋” ํ•„์š”ํ•˜๋ฉด ์Šคํƒ ์‚ฌ์šฉ float ๋ฐ˜ํ™˜์€ xm0์—์„œ ๋ชจ๋“  XMM ๋ ˆ์ง€์Šคํ„ฐ๋Š” caller-saved. ์ดํ›„์— ํ˜ธ์ถœ๋œ๋†ˆ์ด ๋ง˜๋Œ€๋กœ ๋ฐ”๊ฟ”๋„ ๋จ double f1(int x, double y, long z); ์œ„์˜ ์˜ˆ์—์„œ, %edi์— x, %xmm0์— y, %rsi์— z 3.11.3 Floating-Point Arithmetic Operations double funct(double a, float x, double b, int i){ return a*x - b/i; } ์œ„ ์ฝ”๋“œ๋Š” ๋‹ค์Œ๊ณผ๊ฐ™์ด ๋ฒˆ์—ญ๋œ๋‹ค. a in %xmm0, x in %xmm1, b in %xmm2, i in %edi 1 funct: The following two instructions convert x to double 2 vunpcklps %xmm1, %xmm1, %xmm1 3 vcvtps2pd %xmm1, %xmm1 4 vmulsd %xmm0, %xmm1, %xmm0 Multiply a by x 5 vcvtsi2sd %edi, %xmm1, %xmm1 Convert i to double 6 vdivsd %xmm1, %xmm2, %xmm2 Compute b/i 7 vsubsd %xmm2, %xmm0, %xmm0 Subtract from a*x 8 ret Return ``` 3.11.4 Defining and Using Floating-Point Constants ์ •์ˆ˜ ์—ฐ์‚ฐ๊ณผ ๋‹ฌ๋ฆฌ AVX float ์—ฐ์‚ฐ์€ immediate value๋กœ ์—ฐ์‚ฐํ•  ์ˆ˜ ์—†๋‹ค. ๋Œ€์‹  ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ž„์˜๊ฐ’์— ๋Œ€ํ•ด ์Šคํ† ๋ฆฌ์ง€๋ฅผ ํ• ๋‹นํ•˜๊ณ  ์ดˆ๊ธฐํ™”ํ•˜๊ณ , ๋ฉ”๋ชจ๋ฆฌ๋กœ๋ถ€ํ„ฐ ๊ฐ’์„ ์ฝ๋Š”๋‹ค. double cel2fahr(double temp){ return 1.8 * temp + 32.0; } ๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด, ์ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋ฐ”๋€๋‹ค. double cel2fahr(double temp) temp in %xmm0 1 cel2fahr: 2 vmulsd .LC2(%rip), %xmm0, %xmm0 Multiply by 1.8 3 vaddsd .LC3(%rip), %xmm0, %xmm0 Add 32.0 4 ret 5 .LC2: 6 .long 3435973837 Low-order 4 bytes of 1.8 7 .long 1073532108 High-order 4 bytes of 1.8 8 .LC3: 9 .long 0 Low-order 4 bytes of 32.0 10 .long 1077936128 High-order 4 bytes of 32.0 ``` .LC2์˜ ์œ„์น˜๋กœ๋ถ€ํ„ฐ 1.8์„ ๊ฐ€์ ธ์˜ค๊ณ , .LC3์—์„œ 32.0์„ ํŒ๋…ํ•ด์˜ค๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค. 3.11.5 Using Bitwise Operations in Floating-Point Code ๋น„ํŠธ์—ฐ์‚ฐ์„ float์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค! vxorps, vxorpd, vandps, vandpd ๊ทผ๋ฐ float์—์„œ ๋น„ํŠธ์—ฐ์‚ฐ์€ ์ง„์งœ ์™œํ•˜์ง€? ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ 0์œผ๋กœ ์ดˆ๊ธฐํ™”ํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์ž๊ธฐ ์ž์‹ ์„ xorํ•˜๊ธฐ ๋ถ€ํ˜ธ ๋ฐ˜์ „ / ์ ˆ๋Œ“๊ฐ’ํ™” ๋งจ์•ž MSB ๋งŒ์ง€๊ธฐ (x<0 ? 0:x)๊ณผ ๊ฐ™์€ ๊ฒฝ์šฐ (RELU) 3.11.6 Floating Point Comparison Operations ์•„๋ฌด๋ž˜๋„ ์ˆ˜๋ฅผ ๋น„๊ต๋Š” ํ•ด์•ผ๊ฒ ์ง€ ucomiss / ucomisd S1์™€ S2 ๋น„๊ต ๋Š˜ ๊ทธ๋žฌ๋“ฏ ZF, CF, PF๋ฅผ ์„ค์ •ํ•œ๋‹ค ํ•˜๋‚˜๋ผ๋„ NaN์ด๋ฉด, ์„ธ ํ”Œ๋ž˜๊ทธ๋ฅผ ๋‹ค ํ‚จ๋‹ค! 3.11.7 Observations about Floating-Point Code AVX2๊ฐ€ float์— ๋Œ€ํ•ด ์ •์ˆ˜๋ž‘ ๋น„์Šทํ•˜์ง€๋งŒ, ํ›จ์”ฌ๋” ๋‹ค์–‘ํ•œ ๋ช…๋ น์–ด์™€ ํ˜•์‹์„ ํฌํ•จํ•˜๋Š”๊ฑธ ์•Œ ์ˆ˜ ์žˆ์—ˆ๋‹ค. ๋˜ํ•œ ํŒจํ‚น๋œ ๋ฐ์ดํ„ฐ์— ๋ณ‘๋ ฌ์—ฐ์‚ฐ์„ ์ˆ˜ํ–‰ํ•ด์„œ ๋” ๋น ๋ฅด๊ฒŒ ์‹คํ–‰์‹œํ‚ฌ์ˆ˜๋„ ์žˆ๋‹ค. ์š”์ƒˆ gcc๊ฐ€ ํ•ด์ฃผ๋”๋ผ โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ #

CSAPP 3.10 Combining Control and Data in Machine-Level Programs

·988 words·5 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # ๋ฐ์ดํ„ฐ์™€ ๋จธ์‹ ๋ ˆ๋ฒจ ์ฝ”๋“œ๋ฅผ ์ง€๊ธˆ๊นŒ์ง€ ๋”ฐ๋กœ ์‚ดํŽด๋ณด์•˜๋‹ค ์ด์ œ๋ถ€ํ„ฐ๋Š” ํ•ฉ์ณ์„œ ํ™•์ธํ•ด๋ณด์ž ์ด๊ฑด ํฌ์ธํ„ฐ ๋‹จ์œ„๋กœ ๊ณต๋ถ€ํ•  ๊ฒƒ์ด๋‹ค. ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋„ ์—ฐ๊ตฌํ•ด๋ณด์ž ์Šคํƒ ์ €์žฅ๋Ÿ‰์ด ์‹คํ–‰๋งˆ๋‹ค ๋‹ค๋ฅผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ? ๋ฅผ ํ™•์ธํ•ด๋ณด์ž 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

CSAPP 3.9 Heterogeneous Data Structures

·421 words·2 mins
๐Ÿ“ ์ƒ์„ธ ์ •๋ฆฌ # C๋Š” ์„œ๋กœ ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๊ฒฐํ•ฉํ•ด์„œ ๋ฐ์ดํ„ฐ ์œ ํ˜•์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ ๋‘๊ฐ€์ง€ ์–ด์ฉŒ๊ตฌ.. struct, union 3.9.1 Structures ๋‹ค๋ฅธ ์œ ํ˜•์˜ ๊ฐ์ฒด๋ฅผ ๋‹จ์ผ ๊ฐ์ฒด๋กœ ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๋ฐ์ดํ„ฐ ์œ ํ˜• structure ๋‚ด์˜ ๋‹ค๋ฅธ ์ปดํฌ๋„ŒํŠธ๋Š” ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐ๋จ ๋ชจ๋“  ๊ตฌ์„ฑ์š”์†Œ๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ์˜ ์—ฐ์† ์˜์—ญ์— ์ €์žฅ๋˜๊ณ , structure์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์ฒซ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์˜ ์ฃผ์†Œ Array๋ž‘ ๋น„์Šทํ•˜๋‹ค! ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ๊ฐ ํ•„๋“œ์˜ ๋ฐ”์ดํŠธ ์˜คํ”„์…‹์„ ๋“ค๊ณ ์žˆ๊ณ .. ๊ทธ๊ฑธ๋กœ ์ž˜ ์™”๋‹ค๊ฐ”๋‹ค ์ฐธ์กฐ 3.9.2 Unions ๋‹จ์ผ ๊ฐ์ฒด๋ฅผ ์—ฌ๋Ÿฌ ์œ ํ˜•์— ๋”ฐ๋ผ ์ฐธ์กฐํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•จ ์ด๊ฒŒ ๋ฌด์Šจ์†Œ๋ฆฌ์ง€? struct์—์„œ char, int[2], double์ด ์žˆ๋‹ค๋ฉด char: 01, int: 412, double: 16~24๋ฐ”์ดํŠธ๋กœ ์ด 24๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์‚ฌ์ด๊ณต๊ฐ„์€ ํŒจ๋”ฉ Union์ด์—ˆ๋‹ค๋ฉด ๊ฐ€์žฅ ํฐ๊ฒƒ์— ๋งž์ถฐ์„œ ๊ทธ์ € 8๋ฐ”์ดํŠธ ์‚ฌ์šฉ ๊ทธ๋•Œ๊ทธ๋•Œ char / int / double๋กœ ์ฝ๋Š” ๊ฒƒ ๊ทผ๋ฐ ๊ทธ๋Ÿผ ์ด๊ฑธ ์™œ์“ฐ๋ƒ? ํ•œ๋ฒˆ์— char / int / double ์ค‘ ์—ฌ๋Ÿฌ ๊ฐ’์„ ๋™์‹œ์— ๊ฐ€์ง€์ง€ ์•Š์„๋–„! ์ฑ…์— ๋‚˜์˜จ ์˜ˆ์ œ๋Š” ๋ฆฌํ”„๋…ธ๋“œ์—๋งŒ ๊ฐ’์ด ์žˆ๋Š” ์ด์ง„ ํŠธ๋ฆฌ ๊ตฌ์กฐ์ฒด ์™ผ์ชฝ๋…ธ๋“œ ํฌ์ธํ„ฐ, ์˜ค๋ฅธ์ชฝ๋…ธ๋“œ ํฌ์ธํ„ฐ, double 2๊ฐœ๋ฅผ ๊ฐ€์ง„๋‹ค๊ณ  ํ•ด๋ณด์ž struct๋Š” 32๋ฐ”์ดํŠธ, Union์ด๋ผ๋ฉด ์ž˜ ๋ฌถ์–ด์„œ 16๋ฐ”์ดํŠธ๋กœ ์ฒ˜๋ฆฌ ๊ฐ€๋Šฅ ๋‹ค์Œ ์˜ˆ์‹œ๋ฅผ ๋ณด์ž. double uu2double(unsigned word0, unsigned word1) { union { double d; unsigned u[2]; } temp; temp.u[0] = word0; temp.u[1] = word1; return temp.d; } ์ด๋•Œ word0 = 0x12345678, word1 = 0x9abcdef0 ์ด๋ผ๊ณ  ํ•˜๋ฉด temp์—๋Š” Little Endian์ผ๋•Œ 78 56 34 12 f0 de bc 9a Big Endian์ผ๋• 12 34 56 78 9a bc de f0 ๊ฐ€ ์ €์žฅ๋œ๋‹ค. ์ด๋ฅผ d๋กœ ์ฝ์„ ๋•Œ Little Endian์—์„œ๋Š” 0x9abcdef012345678 Big Endian์—์„œ๋Š” 0x123456789abcdef0 ์œผ๋กœ ํ•ด์„ํ•˜๊ฒŒ ๋œ๋‹ค. (d๋ฅผ ์ฝ์„๋•Œ๋„ endian ์‹ ๊ฒฝ์ฝํ•˜๋‹ˆ๊นŒ!!) 3.9.3 Data Alignment ์ผ๋ถ€ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” 2, 4, 8๋“ฑ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผํ•จ์„ ์š”๊ตฌํ•˜๋Š” ์• ๋“ค์ด ์žˆ๋‹ค ์ด๋ž˜์•ผ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค 8์˜ ๋ฐฐ์ˆ˜๋กœ ์ •๋ ฌ๋˜์–ด์žˆ์œผ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ•œ๋ฒˆ๋งŒ ์ฐธ์กฐํ•˜๋ฉด ๋˜์ง€๋งŒ, ์•„๋‹ˆ๋ผ๋ฉด ์•ž๋’ค๋กœ ๋ถ„ํ• ๋˜์–ด ์žˆ๋Š”๊ณณ์— ๋‘๋ฒˆ ์ฐธ์กฐํ•ด์•ผํ•  ์ˆ˜๋„ ์žˆ์Œ x86-64๋Š” ๋ฐ์ดํ„ฐ์˜ ์ •๋ ฌ์— ๊ด€๊ณ„์—†์ด ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘๋™ํ•˜์ง€๋งŒ, ์ธํ…”์€ ๋ฉ”๋ชจ๋ฆฌ ์‹œ์Šคํ…œ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•ด ์ •๋ ฌํ• ๊ฒƒ์„ ๊ถŒ๊ณ ํ•˜๊ณ  ์žˆ์Œ ์ •๋ ฌ ๊ถŒ์žฅ์‚ฌํ•ญ์€ ๋‹ค์Œ๊ณผ ๊ฐ™๋‹ค K = 1 : char K = 2 : short K = 4 : int, float K = 8 : long, double, char * ์•„ํ•˜, ์ด๊ฒŒ bool ์ •์  ๋ฐฐ์—ด๋ณด๋‹ค bitset์ด ๋น ๋ฅธ ์ด์œ ๊ตฌ๋‚˜!! ์•Œ์•„์„œ SIMD๋ฅผ ์ง€์›ํ•˜๋ฉด์„œ ์ฑ„์›Œ์ฃผ๋Š”๊ฑฐ๊ตฌ๋‚˜!! ๊ทธ๋ฆฌ๊ณ  ์ด๊ฑธ ํŒจ๋”ฉ์ด๋ผ๊ณ  ํ•˜๊ฒ ๊ตฌ๋‚˜! .align 8 ์–ด์…ˆ๋ธ”๋ฆฌ์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฝ”๋“œ๊ฐ€ ์žˆ์œผ๋ฉด, ๊ทธ ๋’ค๋”ฐ๋ฅด๋Š” ๋ฐ์ดํ„ฐ๊ฐ€ 8์˜ ๋ฐฐ์ˆ˜์œ ์ฃผ์†Œ๋กœ ์‹œ์ž‘๋  ๊ฒƒ์„ ๋ณด์žฅํ•œ๋‹ค. struct S1 { int i; char c; int j; } ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด, 4 / 1 / 4 ๋ฐ”์ดํŠธ๋ฅผ ์“ฐ๋Š”๊ฒŒ ์•„๋‹ˆ๋ผ 4 / 1 + 3(ํŒจ๋”ฉ) / 4 ๋ฐ”์ดํŠธ๋ฅผ ์“ด๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ j๋Š” ์˜คํ”„์…‹ 8์„ ๊ฐ€์ง€๋ฉฐ ์ „์ฒด ๊ตฌ์กฐ ํฌ๊ธฐ๋Š” 12๋ฐ”์ดํŠธ์ด๋‹ค. ๋˜ํ•œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” S1 ์œ ํ˜•์˜ ํฌ์ธํ„ฐ p๊ฐ€ 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. โ”์งˆ๋ฌธ ์‚ฌํ•ญ # ์ผ๋ถ€ ๊ฐ์ฒด๋“ค์— ๋Œ€ํ•œ ์ฃผ์†Œ๋Š” 2, 4, 8๋“ฑ์˜ ๋ฐฐ์ˆ˜์—ฌ์•ผํ•จ์„ ์š”๊ตฌํ•˜๋Š” ์• ๋“ค์ด ์žˆ๊ณ , ์ด๋ž˜์•ผ ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค ํ•˜๋“œ์›จ์–ด ์„ค๊ณ„๊ฐ€ ๋‹จ์ˆœํ™”๋œ๋‹ค๋Š”๊ฑด ๋ญ˜๊นŒ? ๋˜ํ•œ, ์ปดํŒŒ์ผ๋Ÿฌ๋Š” S1 ์œ ํ˜•์˜ ํฌ์ธํ„ฐ p๊ฐ€ 4๋ฐ”์ดํŠธ ์ •๋ ฌ์„ ๋งŒ์กฑํ•˜๋Š”์ง€ ํ™•์ธํ•ด์•ผํ•œ๋‹ค. ์•ˆ์— ์žˆ๋Š” ์›์†Œ๋“ค ์ค‘ K์˜ ์ตœ๋Œ“๊ฐ’์„ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋‚˜? ๐Ÿ”— ์ฐธ๊ณ  ์ž๋ฃŒ # CSAPP