linux kernel的堆内存分配和用户态的内存分配有点不同
是利用slab/slub分配的
这里推荐一篇文章
讲得非常清晰
所以我们要get root shell的方法是
- open 两次设备
- 将内存改为0x8a,就是cred结构体的大小
- 然后close掉其中一个设备,这个时候就有一个UAF了
- fork一个子程序,因为fork的时候会创建cred结构体,所以这个时候我们就可以控制这个结构体
- 把结构体中的uid之类的置0,就有root shell了
测试了一下,那个kmalloc的范围是0x81-0x92,emmmmm,还是要研究一下slab/slub的分配方法……..
poc如下
1 | #include <stdio.h> |