์Šคํƒ ์นด๋‚˜๋ฆฌ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ

์Šคํƒ๊ฐ€๋“œ์™€ ์Šคํƒ์‰ด๋“œ

์Šคํƒ๊ฐ€๋“œ๋Š” EIP (Extended Instruction Pointer) ์•ž์— ์นด๋‚˜๋ฆฌ๋กœ ์•Œ๋ ค์ง„ ํŠน๋ณ„ํ•œ ๊ฐ’์„ ์‚ฝ์ž…ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฐ’์€ 0x000aff0d๋กœ, ๋„, ์ค„ ๋ฐ”๊ฟˆ, EOF, ์บ๋ฆฌ์ง€ ๋ฆฌํ„ด์„ ๋‚˜ํƒ€๋‚ด์–ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋กœ๋ถ€ํ„ฐ ๋ณดํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ recv(), memcpy(), read(), bcopy()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋Š” ์—ฌ์ „ํžˆ ์ทจ์•ฝํ•˜๋ฉฐ, **EBP (Base Pointer)**๋ฅผ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์Šคํƒ์‰ด๋“œ๋Š” ๊ธ€๋กœ๋ฒŒ ๋ฆฌํ„ด ์Šคํƒ์„ ์œ ์ง€ํ•˜์—ฌ ๋ชจ๋“  ๋ฆฌํ„ด ์ฃผ์†Œ(EIPs)๋ฅผ ์ €์žฅํ•จ์œผ๋กœ์จ ์Šคํƒ๊ฐ€๋“œ๋ณด๋‹ค ๋” ์ •๊ตํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ์ด ์„ค์ •์€ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๊ฐ€ ๋ฐœ์ƒํ•˜๋”๋ผ๋„ ํ•ด๋ฅผ ๋ผ์น˜์ง€ ์•Š๋„๋ก ํ•˜๋ฉฐ, ์ €์žฅ๋œ ๋ฆฌํ„ด ์ฃผ์†Œ์™€ ์‹ค์ œ ๋ฆฌํ„ด ์ฃผ์†Œ๋ฅผ ๋น„๊ตํ•˜์—ฌ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ ๋ฐœ์ƒ์„ ๊ฐ์ง€ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์Šคํƒ์‰ด๋“œ๋Š” ๋ฆฌํ„ด ์ฃผ์†Œ๊ฐ€ ์˜ˆ์ƒ ๋ฐ์ดํ„ฐ ๊ณต๊ฐ„ ์™ธ๋ถ€๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š”์ง€ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๊ฒฝ๊ณ„ ๊ฐ’๊ณผ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ๋ณดํ˜ธ๋Š” Return-to-libc, ROP (Return-Oriented Programming) ๋˜๋Š” ret2ret์™€ ๊ฐ™์€ ๊ธฐ์ˆ ์„ ํ†ตํ•ด ์šฐํšŒ๋  ์ˆ˜ ์žˆ์–ด, ์Šคํƒ์‰ด๋“œ๊ฐ€ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ๋ณดํ˜ธํ•˜์ง€ ์•Š์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค.

์Šคํƒ ์Šค๋งค์‹œ ํ”„๋กœํ…ํ„ฐ (ProPolice) -fstack-protector:

์ด ๋ฉ”์ปค๋‹ˆ์ฆ˜์€ EBP ์•ž์— ์นด๋‚˜๋ฆฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๊ณ , ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์žฌ์กฐ์งํ•˜์—ฌ ๋ฒ„ํผ๋ฅผ ๋” ๋†’์€ ๋ฉ”๋ชจ๋ฆฌ ์ฃผ์†Œ์— ์œ„์น˜์‹œ์ผœ ๋‹ค๋ฅธ ๋ณ€์ˆ˜๋ฅผ ๋ฎ์–ด์“ฐ์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ, ์ง€์—ญ ๋ณ€์ˆ˜ ์œ„์˜ ์Šคํƒ์— ์ „๋‹ฌ๋œ ์ธ์ˆ˜๋ฅผ ์•ˆ์ „ํ•˜๊ฒŒ ๋ณต์‚ฌํ•˜๊ณ  ์ด ๋ณต์‚ฌ๋ณธ์„ ์ธ์ˆ˜๋กœ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ 8๊ฐœ ๋ฏธ๋งŒ์˜ ์š”์†Œ๋ฅผ ๊ฐ€์ง„ ๋ฐฐ์—ด์ด๋‚˜ ์‚ฌ์šฉ์ž์˜ ๊ตฌ์กฐ ๋‚ด์˜ ๋ฒ„ํผ๋Š” ๋ณดํ˜ธํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์นด๋‚˜๋ฆฌ๋Š” /dev/urandom์—์„œ ํŒŒ์ƒ๋œ ๋žœ๋ค ์ˆซ์ž์ด๊ฑฐ๋‚˜ ๊ธฐ๋ณธ๊ฐ’ 0xff0a0000์ž…๋‹ˆ๋‹ค. ์ด๋Š” **TLS (Thread Local Storage)**์— ์ €์žฅ๋˜์–ด, ์Šค๋ ˆ๋“œ ๊ฐ„์— ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์—์„œ ์Šค๋ ˆ๋“œ๋ณ„ ๊ธ€๋กœ๋ฒŒ ๋˜๋Š” ์ •์  ๋ณ€์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ณ€์ˆ˜๋Š” ์ฒ˜์Œ์— ๋ถ€๋ชจ ํ”„๋กœ์„ธ์Šค์—์„œ ๋ณต์‚ฌ๋˜๋ฉฐ, ์ž์‹ ํ”„๋กœ์„ธ์Šค๋Š” ๋ถ€๋ชจ๋‚˜ ํ˜•์ œ์—๊ฒŒ ์˜ํ–ฅ์„ ์ฃผ์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ fork()๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ƒˆ๋กœ์šด ์นด๋‚˜๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š์œผ๋ฉด ๋ชจ๋“  ํ”„๋กœ์„ธ์Šค(๋ถ€๋ชจ ๋ฐ ์ž์‹)๊ฐ€ ๋™์ผํ•œ ์นด๋‚˜๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๊ฒŒ ๋˜์–ด ์ทจ์•ฝํ•ด์ง‘๋‹ˆ๋‹ค. i386 ์•„ํ‚คํ…์ฒ˜์—์„œ๋Š” ์นด๋‚˜๋ฆฌ๊ฐ€ gs:0x14์— ์ €์žฅ๋˜๊ณ , x86_64์—์„œ๋Š” fs:0x28์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

์ด ์ง€์—ญ ๋ณดํ˜ธ๋Š” ๊ณต๊ฒฉ์— ์ทจ์•ฝํ•œ ๋ฒ„ํผ๊ฐ€ ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ์‹๋ณ„ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜์˜ ์‹œ์ž‘ ๋ถ€๋ถ„์— ์นด๋‚˜๋ฆฌ๋ฅผ ๋ฐฐ์น˜ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๋ฉฐ, ๋ ๋ถ€๋ถ„์—์„œ ๊ทธ ๋ฌด๊ฒฐ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์›น ์„œ๋ฒ„๊ฐ€ fork()๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ์นด๋‚˜๋ฆฌ ๋ฐ”์ดํŠธ๋ฅผ ๋ฐ”์ดํŠธ ๋‹จ์œ„๋กœ ์ถ”์ธกํ•˜๋Š” ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ๊ณต๊ฒฉ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ fork() ํ›„์— execve()๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ ๊ณต๊ฐ„์ด ๋ฎ์–ด์“ฐ์—ฌ์ ธ ๊ณต๊ฒฉ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. vfork()๋Š” ์ž์‹ ํ”„๋กœ์„ธ์Šค๊ฐ€ ์“ฐ๊ธฐ๋ฅผ ์‹œ๋„ํ•  ๋•Œ๊นŒ์ง€ ์ค‘๋ณต ์—†์ด ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜์—ฌ, ๊ทธ ์‹œ์ ์— ์ค‘๋ณต์ด ์ƒ์„ฑ๋˜๋ฉฐ ํ”„๋กœ์„ธ์Šค ์ƒ์„ฑ ๋ฐ ๋ฉ”๋ชจ๋ฆฌ ์ฒ˜๋ฆฌ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

๊ธธ์ด

x64 ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์นด๋‚˜๋ฆฌ ์ฟ ํ‚ค๋Š” 0x8 ๋ฐ”์ดํŠธ ์ฟผ๋“œ์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ฒซ 7๋ฐ”์ดํŠธ๋Š” ๋žœ๋ค์ด๊ณ  ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋Š” ๋„ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.

x86 ๋ฐ”์ด๋„ˆ๋ฆฌ์—์„œ ์นด๋‚˜๋ฆฌ ์ฟ ํ‚ค๋Š” 0x4 ๋ฐ”์ดํŠธ ๋”๋ธ”์›Œ๋“œ์ž…๋‹ˆ๋‹ค. ์ฒซ 3๋ฐ”์ดํŠธ๋Š” ๋žœ๋ค์ด๊ณ  ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋Š” ๋„ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค.

Caution

๋‘ ์นด๋‚˜๋ฆฌ์˜ ๊ฐ€์žฅ ๋‚ฎ์€ ์œ ํšจ ๋ฐ”์ดํŠธ๋Š” ๋„ ๋ฐ”์ดํŠธ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํƒ์—์„œ ๋‚ฎ์€ ์ฃผ์†Œ์—์„œ ์˜ค๋Š” ์ฒซ ๋ฒˆ์งธ ๋ฐ”์ดํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ฌธ์ž์—ด์„ ์ฝ๋Š” ํ•จ์ˆ˜๋Š” ์ด๋ฅผ ์ฝ๊ธฐ ์ „์— ๋ฉˆ์ถœ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์šฐํšŒ ๋ฐฉ๋ฒ•

์นด๋‚˜๋ฆฌ๋ฅผ ์œ ์ถœํ•œ ํ›„ ์ž์‹ ์˜ ๊ฐ’์œผ๋กœ ๋ฎ์–ด์“ฐ๊ธฐ(์˜ˆ: ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ).

  • ์ž์‹ ํ”„๋กœ์„ธ์Šค์—์„œ ์นด๋‚˜๋ฆฌ๊ฐ€ ํฌํฌ๋œ ๊ฒฝ์šฐ ํ•œ ๋ฒˆ์— ํ•œ ๋ฐ”์ดํŠธ์”ฉ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…์ด ๊ฐ€๋Šฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

BF Forked & Threaded Stack Canaries

  • ๋ฐ”์ด๋„ˆ๋ฆฌ์— ํฅ๋ฏธ๋กœ์šด ์œ ์ถœ ๋˜๋Š” ์ž„์˜ ์ฝ๊ธฐ ์ทจ์•ฝ์ ์ด ์žˆ๋Š” ๊ฒฝ์šฐ ์œ ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

Print Stack Canary

  • ์Šคํƒ์— ์ €์žฅ๋œ ํฌ์ธํ„ฐ ๋ฎ์–ด์“ฐ๊ธฐ

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

Pointer Redirecting

  • ๋งˆ์Šคํ„ฐ์™€ ์Šค๋ ˆ๋“œ ์นด๋‚˜๋ฆฌ ๋ชจ๋‘ ์ˆ˜์ •ํ•˜๊ธฐ

์นด๋‚˜๋ฆฌ๋กœ ๋ณดํ˜ธ๋œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์Šค๋ ˆ๋“œ์˜ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋‘ ๊ฐœ์˜ ๋™์ผํ•œ ์นด๋‚˜๋ฆฌ(์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ)๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™„ํ™” ์กฐ์น˜๋Š” ๋ฌด์šฉ์ง€๋ฌผ์ด ๋ฉ๋‹ˆ๋‹ค.

๊ฒŒ๋‹ค๊ฐ€, ์นด๋‚˜๋ฆฌ๋กœ ๋ณดํ˜ธ๋œ ์Šค๋ ˆ๋“œ ํ•จ์ˆ˜์˜ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋Š” TLS์— ์ €์žฅ๋œ ๋งˆ์Šคํ„ฐ ์นด๋‚˜๋ฆฌ๋ฅผ ์ˆ˜์ •ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์—์„œ bof๋ฅผ ํ†ตํ•ด TLS๊ฐ€ ์ €์žฅ๋œ ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜์— ๋„๋‹ฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
๊ฒฐ๊ณผ์ ์œผ๋กœ, ๋‘ ๊ฐœ์˜ ๋™์ผํ•œ ์นด๋‚˜๋ฆฌ(์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ)๊ฐ€ ์‚ฌ์šฉ๋˜๊ธฐ ๋•Œ๋ฌธ์— ์™„ํ™” ์กฐ์น˜๋Š” ๋ฌด์šฉ์ง€๋ฌผ์ด ๋ฉ๋‹ˆ๋‹ค.
์ด ๊ณต๊ฒฉ์€ ๋‹ค์Œ์˜ ๊ธ€์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค: http://7rocky.github.io/en/ctf/htb-challenges/pwn/robot-factory/#canaries-and-threads

๋˜ํ•œ https://www.slideshare.net/codeblue_jp/master-canary-forging-by-yuki-koike-code-blue-2015์—์„œ์˜ ๋ฐœํ‘œ๋ฅผ ํ™•์ธํ•˜์„ธ์š”. ์ด ๋ฐœํ‘œ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ TLS๊ฐ€ **mmap**์— ์˜ํ•ด ์ €์žฅ๋˜๋ฉฐ, ์Šค๋ ˆ๋“œ์˜ ์Šคํƒ์ด ์ƒ์„ฑ๋  ๋•Œ๋„ mmap์— ์˜ํ•ด ์ƒ์„ฑ๋œ๋‹ค๊ณ  ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด์ „ ๊ธ€์—์„œ ๋ณด์—ฌ์ค€ ๊ฒƒ์ฒ˜๋Ÿผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ—ˆ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • __stack_chk_fail์˜ GOT ํ•ญ๋ชฉ ์ˆ˜์ •ํ•˜๊ธฐ

๋ฐ”์ด๋„ˆ๋ฆฌ์— Partial RELRO๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, __stack_chk_fail์˜ GOT ํ•ญ๋ชฉ์„ ํ”„๋กœ๊ทธ๋žจ์ด ์นด๋‚˜๋ฆฌ๊ฐ€ ์ˆ˜์ •๋˜๋”๋ผ๋„ ์ฐจ๋‹จํ•˜์ง€ ์•Š๋Š” ๋”๋ฏธ ํ•จ์ˆ˜๋กœ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์˜ ์“ฐ๊ธฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ๊ณต๊ฒฉ์€ ๋‹ค์Œ์˜ ๊ธ€์—์„œ ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค: https://7rocky.github.io/en/ctf/other/securinets-ctf/scrambler/

์ฐธ๊ณ  ๋ฌธํ—Œ

Tip

AWS ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ:HackTricks Training AWS Red Team Expert (ARTE)
GCP ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training GCP Red Team Expert (GRTE) Azure ํ•ดํ‚น ๋ฐฐ์šฐ๊ธฐ ๋ฐ ์—ฐ์Šตํ•˜๊ธฐ: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks ์ง€์›ํ•˜๊ธฐ