因为本人也是个菜鸡,这道题的反编译又很阴间,所以我花了比较长的时间读反编译代码,也是一步一步理解的整个过程,感觉有一些收获,所以就想写一个比较详细的wp,个人觉得是我看到的最详细的wp了。
请♂享♂用♂我♂吧
这是add函数,add一次会malloc两个chunk。
同时要注意,这里的notelist是一个二维数组。notelist[i]表示的其实是notelist[i][0](八个字节).后面还有一个notelist[i][1]。
我们看notelist[i],他被赋值为print_note_content这个地址的函数。
notelist[i][1]才是真正存放chunk的content的地方。
为什么要把notelist[i]赋值为print_note_content这个地址的函数呢?
下面这个函数是print_note函数
可以发现,这个函数把notelist[v2]作为函数调用,后面的notelist[v2]则是这个函数的参数。这个函数就是
打印一个chunk的content。
下面就是delete_note的代码
可以看到,释放一个note需要两个free,一个free掉notelist[i][0]一个free掉notelist[i][1]。但是这里free之后没有对指针进行置NULL操作,所以存在Use After Free漏洞。
前面的逆向分析有点长,但是我觉得是有必要的。
接下来开始漏洞的分析。
我们之前已经说过了,一个note分为两个字段,notelist[i][0]和notelist[i][1].我们把他们命名为put段和content段。
如果我们把一个note的put段变成magic函数
那么我们在调用菜单里的print_note函数的时候,是不是相当于调用了system(’/bin/sh’)呢?当时是的。但是因为我们只能对content部分进行操作,无法对put部分进行操作,所以我们要想办法,操作put段
接下来是漏洞利用过程:
申请note0(大小为0x40):包括put0和con