程序保护全开,程序功能:
1 | 1.add |
但是有一个隐藏功能:666可打印出基地址
1 | if ( v5 == 666 ) |
1、add函数
中规中矩没有漏洞,但是限制大小0x90~0x2333
也就是没有fastbin
2、delete函数
正常free,没有UAF,没有下标越界等情况
3、edit函数
神奇的是这个edit函数,啥都不干,就给你个任意地址写
1 | puts("Name:"); |
所以整个程序,在知道基地址的情况下,有个任意地址写漏洞,虽然写入的内容不可控,但是还是很有用的
首先先泄漏libc地址
1 | add(0x98,'a')#0 |
在得到libc和基地址的基础上,因为add的大小被限制了,但是可以任意地址写,所以这里把global_max_fast
直接写成0xCAFEBABELL
接下来,只需要构造fastbin attack申请出free_hook修改成system即可,具体如下:
1、同样利用任意地址写修改free_hook - 0x8
为0xca
作为size
2、利用任意地址写攻击gra123位置(即存放堆的全局变量),构造overlap
3、将free_hook链上去申请出来
(这里overlap具体还要自己去理解)大概就是将一个大的把一个小的包住,然后两个都free掉,再申请这个大的时候就能够修改小的堆的fd
exp:
1 | #coding:utf-8 |