堆利用-UAF

发布于 2023-04-06  416 次阅读


UAF也就是Use-After-Free的缩写,原理就是释放后的一个堆块,我们可以对这个堆块进行改写,之后利用堆分配算法进行攻击。

先申请了0x10大小的堆空间,然后把这个堆空间free掉,但是还可以编辑这个堆空间,这就是漏洞发生的点,那我们把p的0号位置的fd指针篡改为伪造的chunk,然后在伪造的chunk里构造内容,就能实现攻击了。

可以看到,整个过程没有直接对伪造的target写入内容,唯一的就是初始化赋值了0x21大小,但却能从target[2]处打印出hello,这就证明攻击成功了。但目前这个程序仅适用于没有tcache的一个ubuntu16.04 ,也就是glibc版本要在2.23,因为有了tcache之后就不能用这种fastbin的攻击方式了。从以上的程序可以看到,如果有办法把释放后的堆块重新利用起来,那你就可以把堆分配到任意你想要分配到的位置。包括各种各样的函数指针,如果把函数指针劫持了,就相当于劫持了这个程序的程序控制流,那你就可以以这个程序所能执行的权限去做任意你想做的事。

栗题:

ida分析:

菜单题。

先看create

一次create 申请2次malloc,两次create申请4次malloc,第一次申请得到的结构体指针与content称为A,第二次申请得到的结构体指针与content称为B。如下图:

再看delete

释放的时候如下图:

然后此时再向程序申请0x10堆块C的时候,就会把两个大小为0x10刚free掉的chunk拿出来,由于fastbins是LIFO,所以B先出来,A后出来,那么新申请的堆块的struct会覆盖B,content会覆盖A。(为什么contentB与contentA不见了呢,因为我们申请他俩的大小为0x200,离0x10尽量远,当free的时候这俩不会被放进fastbin里)如下图:

再看print里:

最后接住print就可以触发binsh

图解大概如下:

exp如下:

总结:

UAF的利用最关键的就是画图,画内存图,要把握各个结构指针的状态。


穿过云层我试着努力向你奔跑