BROP - Blind Return Oriented Programming

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 ์ง€์›ํ•˜๊ธฐ

๊ธฐ๋ณธ ์ •๋ณด

์ด ๊ณต๊ฒฉ์˜ ๋ชฉํ‘œ๋Š” ์ทจ์•ฝํ•œ ๋ฐ”์ด๋„ˆ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด ์—†์ด ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ํ†ตํ•ด ROP๋ฅผ ์•…์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๊ณต๊ฒฉ์€ ๋‹ค์Œ ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค:

  • ์Šคํƒ ์ทจ์•ฝ์ ๊ณผ ์ด๋ฅผ ์œ ๋ฐœํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์ง€์‹.
  • ์ถฉ๋Œ ํ›„ ์žฌ์‹œ์ž‘๋˜๋Š” ์„œ๋ฒ„ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜.

๊ณต๊ฒฉ

1. ์ทจ์•ฝํ•œ ์˜คํ”„์…‹ ์ฐพ๊ธฐ ์„œ๋ฒ„์˜ ์˜ค์ž‘๋™์ด ๊ฐ์ง€๋  ๋•Œ๊นŒ์ง€ ํ•œ ๋ฌธ์ž๋ฅผ ๋” ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

2. ์นด๋‚˜๋ฆฌ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ์ด๋ฅผ ์œ ์ถœํ•ฉ๋‹ˆ๋‹ค.

3. ์Šคํƒ์— ์ €์žฅ๋œ RBP ๋ฐ RIP ์ฃผ์†Œ๋ฅผ ๋ฌด์ฐจ๋ณ„ ๋Œ€์ž…ํ•˜์—ฌ ์œ ์ถœํ•ฉ๋‹ˆ๋‹ค.

์ด ํ”„๋กœ์„ธ์Šค์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ •๋ณด๋Š” ์—ฌ๊ธฐ (BF Forked & Threaded Stack Canaries)์™€ ์—ฌ๊ธฐ (BF Addresses in the Stack)์—์„œ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์ •์ง€ ๊ฐ€์ ฏ ์ฐพ๊ธฐ

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

5. BROP ๊ฐ€์ ฏ ์ฐพ๊ธฐ

์ด ๊ธฐ์ˆ ์€ ret2csu ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ด ๊ฐ€์ ฏ์— ์ ‘๊ทผํ•˜๋ฉด **rsi**์™€ **rdi**๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ ฏ์„ ์–ป๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค:

https://www.scs.stanford.edu/brop/bittau-brop.pdf

์ด๊ฒƒ๋“ค์ด ๊ฐ€์ ฏ์ž…๋‹ˆ๋‹ค:

  • pop rsi; pop r15; ret
  • pop rdi; ret

์ด ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜๋ฉด ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ 2๊ฐœ์˜ ์ธ์ž๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ์„ ์ฃผ๋ชฉํ•˜์„ธ์š”.

๋˜ํ•œ, ret2csu ๊ฐ€์ ฏ์€ ๋งค์šฐ ๋…ํŠนํ•œ ์„œ๋ช…์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์Šคํƒ์—์„œ 6๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํŒํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ฒด์ธ์„ ์ „์†กํ•ฉ๋‹ˆ๋‹ค:

'A' * offset + canary + rbp + ADDR + 0xdead * 6 + STOP

STOP์ด ์‹คํ–‰๋˜๋ฉด, ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์Šคํƒ์—์„œ 6๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํŒํ•˜๋Š” ์ฃผ์†Œ๊ฐ€ ์‚ฌ์šฉ๋˜์—ˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ์‚ฌ์šฉ๋œ ์ฃผ์†Œ๊ฐ€ ๋˜ํ•œ STOP ์ฃผ์†Œ์˜€์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ด ๋งˆ์ง€๋ง‰ ์˜ต์…˜์„ ์ œ๊ฑฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์ƒˆ๋กœ์šด ์ฒด์ธ์ด ์‹คํ–‰๋˜๋ฉฐ, ์ด์ „ ์ฒด์ธ์ด 6๊ฐœ์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ํŒํ–ˆ์Œ์„ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด STOP ๊ฐ€์ ฏ์„ ์‹คํ–‰ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค:

'A' * offset + canary + rbp + ADDR

ret2csu ๊ฐ€์ ฏ์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์œผ๋ฉด rsi์™€ rdi๋ฅผ ์ œ์–ดํ•  ๊ฐ€์ ฏ์˜ ์ฃผ์†Œ๋ฅผ ์œ ์ถ”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

6. PLT ์ฐพ๊ธฐ

PLT ํ…Œ์ด๋ธ”์€ 0x400000 ๋˜๋Š” ์Šคํƒ์—์„œ ์œ ์ถœ๋œ RIP ์ฃผ์†Œ์—์„œ ๊ฒ€์ƒ‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(๋งŒ์•ฝ PIE๊ฐ€ ์‚ฌ์šฉ๋˜๊ณ  ์žˆ๋‹ค๋ฉด). ํ…Œ์ด๋ธ”์˜ ํ•ญ๋ชฉ์€ 16B(0x10B)๋กœ ๊ตฌ๋ถ„๋˜์–ด ์žˆ์œผ๋ฉฐ, ํ•˜๋‚˜์˜ ํ•จ์ˆ˜๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์ธ์ž๊ฐ€ ์˜ฌ๋ฐ”๋ฅด์ง€ ์•Š๋”๋ผ๋„ ์„œ๋ฒ„๋Š” ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ, PLT + 6B์˜ ์ฃผ์†Œ๋ฅผ ํ™•์ธํ•ด๋„ ์ถฉ๋Œํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ์ฝ”๋“œ๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‹ค์Œ ๋™์ž‘์„ ํ™•์ธํ•˜์—ฌ PLT ํ…Œ์ด๋ธ”์„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • 'A' * offset + canary + rbp + ADDR + STOP -> ์ถฉ๋Œ ์—†์Œ
  • 'A' * offset + canary + rbp + (ADDR + 0x6) + STOP -> ์ถฉ๋Œ ์—†์Œ
  • 'A' * offset + canary + rbp + (ADDR + 0x10) + STOP -> ์ถฉ๋Œ ์—†์Œ

7. strcmp ์ฐพ๊ธฐ

strcmp ํ•จ์ˆ˜๋Š” ๋น„๊ต๋˜๋Š” ๋ฌธ์ž์—ด์˜ ๊ธธ์ด๋ฅผ rdx ๋ ˆ์ง€์Šคํ„ฐ์— ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. **rdx**๋Š” ์„ธ ๋ฒˆ์งธ ์ธ์ž์ด๋ฉฐ, ๋‚˜์ค‘์— ํ”„๋กœ๊ทธ๋žจ์„ ์œ ์ถœํ•˜๊ธฐ ์œ„ํ•ด 0๋ณด๋‹ค ์ปค์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ํ•จ์ˆ˜์˜ ์ฒซ ๋‘ ์ธ์ž๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ์‹ค์„ ์ด์šฉํ•˜์—ฌ PLT์—์„œ **strcmp**์˜ ์œ„์น˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค:

  • strcmp(<non read addr>, <non read addr>) -> ์ถฉ๋Œ
  • strcmp(<non read addr>, <read addr>) -> ์ถฉ๋Œ
  • strcmp(<read addr>, <non read addr>) -> ์ถฉ๋Œ
  • strcmp(<read addr>, <read addr>) -> ์ถฉ๋Œ ์—†์Œ

์ด๊ฒƒ์€ PLT ํ…Œ์ด๋ธ”์˜ ๊ฐ ํ•ญ๋ชฉ์„ ํ˜ธ์ถœํ•˜๊ฑฐ๋‚˜ PLT ๋А๋ฆฐ ๊ฒฝ๋กœ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ PLT ํ…Œ์ด๋ธ”์˜ ํ•ญ๋ชฉ์„ ํ˜ธ์ถœํ•œ ํ›„ + 0xb (์ด๋Š” **dlresolve**๋ฅผ ํ˜ธ์ถœํ•จ)์ด๋ฉฐ, ์Šคํƒ์—์„œ ํƒ์ƒ‰ํ•˜๊ณ ์ž ํ•˜๋Š” ํ•ญ๋ชฉ ๋ฒˆํ˜ธ(0๋ถ€ํ„ฐ ์‹œ์ž‘)๋ฅผ ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค:

  • strcmp(<non read addr>, <read addr>) -> ์ถฉ๋Œ
  • b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0x300) + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP -> ์ถฉ๋Œ ๋ฐœ์ƒ
  • strcmp(<read addr>, <non read addr>) -> ์ถฉ๋Œ
  • b'A' * offset + canary + rbp + (BROP + 0x9) + p64(0x300) + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP
  • strcmp(<read addr>, <read addr>) -> ์ถฉ๋Œ ์—†์Œ
  • b'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb ) + p64(ENTRY) + STOP

๊ธฐ์–ตํ•˜์„ธ์š”:

  • BROP + 0x7๋Š” **pop RSI; pop R15; ret;**๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • BROP + 0x9๋Š” **pop RDI; ret;**๋ฅผ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.
  • PLT + 0xb๋Š” dl_resolve ํ˜ธ์ถœ์„ ๊ฐ€๋ฆฌํ‚ต๋‹ˆ๋‹ค.

strcmp๋ฅผ ์ฐพ์œผ๋ฉด **rdx**๋ฅผ 0๋ณด๋‹ค ํฐ ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Tip

์ผ๋ฐ˜์ ์œผ๋กœ rdx๋Š” ์ด๋ฏธ 0๋ณด๋‹ค ํฐ ๊ฐ’์„ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฏ€๋กœ ์ด ๋‹จ๊ณ„๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

8. Write ๋˜๋Š” ๋™๋“ฑํ•œ ๊ฒƒ ์ฐพ๊ธฐ

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ์œ ์ถœํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ถœํ•˜๋Š” ๊ฐ€์ ฏ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ 2๊ฐœ์˜ ์ธ์ž๋ฅผ ์ œ์–ดํ•˜๊ณ  rdx๋ฅผ 0๋ณด๋‹ค ํฌ๊ฒŒ ์„ค์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋ฅผ ์œ„ํ•ด ์•…์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ํ•จ์ˆ˜๋Š” 3๊ฐœ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  • puts(data)
  • dprintf(fd, data)
  • write(fd, data, len(data))

๊ทธ๋Ÿฌ๋‚˜ ์›๋ณธ ๋…ผ๋ฌธ์—์„œ๋Š” write ํ•จ์ˆ˜๋งŒ ์–ธ๊ธ‰ํ•˜๋ฏ€๋กœ ์ด์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:

ํ˜„์žฌ ๋ฌธ์ œ๋Š” PLT ๋‚ด๋ถ€์˜ write ํ•จ์ˆ˜๊ฐ€ ์–ด๋””์— ์žˆ๋Š”์ง€ ๋ชจ๋ฅด๊ณ , ๋ฐ์ดํ„ฐ๋ฅผ ์†Œ์ผ“์œผ๋กœ ์ „์†กํ•  fd ๋ฒˆํ˜ธ๋ฅผ ๋ชจ๋ฅด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ PLT ํ…Œ์ด๋ธ”์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ์•Œ๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ํ–‰๋™์„ ๊ธฐ๋ฐ˜์œผ๋กœ write๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” ์„œ๋ฒ„์™€ ์—ฌ๋Ÿฌ ์—ฐ๊ฒฐ์„ ๋งŒ๋“ค๊ณ  ๋†’์€ FD๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์šฐ๋ฆฌ์˜ ์—ฐ๊ฒฐ ์ค‘ ํ•˜๋‚˜์™€ ์ผ์น˜ํ•˜๊ธฐ๋ฅผ ํฌ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•จ์ˆ˜๋“ค์„ ์ฐพ๊ธฐ ์œ„ํ•œ ํ–‰๋™ ์„œ๋ช…:

  • 'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + p64(0) + p64(0) + (PLT + 0xb) + p64(ENTRY) + STOP -> ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด, puts๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • 'A' * offset + canary + rbp + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP -> ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด, dprintf๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • 'A' * offset + canary + rbp + (BROP + 0x9) + RIP + (BROP + 0x7) + (RIP + 0x1) + p64(0x0) + (PLT + 0xb ) + p64(STRCMP ENTRY) + (BROP + 0x9) + FD + (BROP + 0x7) + RIP + p64(0x0) + (PLT + 0xb) + p64(ENTRY) + STOP -> ๋ฐ์ดํ„ฐ๊ฐ€ ์ถœ๋ ฅ๋˜๋ฉด, write๊ฐ€ ๋ฐœ๊ฒฌ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ž๋™ ์ต์Šคํ”Œ๋กœ์ž‡

์ฐธ๊ณ  ๋ฌธํ—Œ

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 ์ง€์›ํ•˜๊ธฐ