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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
๊ธฐ๋ณธ ์ ๋ณด
์ด ๊ณต๊ฒฉ์ ๋ชฉํ๋ ์ทจ์ฝํ ๋ฐ์ด๋๋ฆฌ์ ๋ํ ์ ๋ณด ์์ด ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ฅผ ํตํด 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**๋ฅผ ์ ์ดํ ์ ์๋ ๊ฐ์ ฏ์ ์ป๊ธฐ ๋๋ฌธ์
๋๋ค:
 (1) (1) (1) (1) (1) (1) (1) (1) (1) (1) (1).png)
์ด๊ฒ๋ค์ด ๊ฐ์ ฏ์ ๋๋ค:
pop rsi; pop r15; retpop 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๊ฐ ๋ฐ๊ฒฌ๋ ๊ฒ์ ๋๋ค.
์๋ ์ต์คํ๋ก์
์ฐธ๊ณ ๋ฌธํ
- ์๋ณธ ๋ ผ๋ฌธ: https://www.scs.stanford.edu/brop/bittau-brop.pdf
- https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/blind-return-oriented-programming-brop
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


