tar 文件解压
文件 to_pwner.tar.xz
解压命令: xz -d to_pwner.tar.xz
再次解压:tar -xvf to_pwner.tar 之后获得 src文件夹
获得src文件夹 ,里面包含了启动脚本startvm.sh 和问题驱动mod.ko, bzImage 是经过压缩的原始内核文件。
运行脚本尝试获得一些信息:
加载进来,是在别的目录里,驱动程序应该是一开始就已经加载了的,大部分kernel pwn都是提权,这题也是。
接下来分析 启动脚本:
打开 qemu_cmd继续分析:
启动脚本,逐条解释含义:
9先指明框架 -m 分配内存
10指明内核文件
11开启了KASLR ,内核地址空间布局随机化
12文件系统
13 指定guest cpu资源,core是我们平时说的“核“,每个物理CPU可以双核,四核等。thread是每个core的硬件线程数,即超线程
14smep 保护和smap保护:
SMAP(Supervisor Mode Access Prevention,管理模式访问保护)禁止内核访问用户空间的数据
SMEP(Supervisor Mode Execution Prevention,管理模式执行保护)禁止内核执行用户空间的代码。
在内核态中,SMEP类似于NX。
接下来进行静态分析:
粗略的看一下函数表,这个驱动管理的设备名称为kpwn,才三个函数初始化函数,退出函数和操作函数。
系统设备文件夹下也能看见这个设备,
主要任务分析kpwn_ioctl函数中的漏洞即可。
粗略的扫一遍,可以明显的看见case 0x133d存在uaf。
但是我现在还是茫然的,根本不知道如何触发和利用这个uaf漏洞,接下的工作,分析每一个case的功能,捋清楚程序流程。
case:
0x1336 申请 0xDC0大小的堆块然后指针存放到bss段,栈上也要指针。限制case 0x1336的使用次数为7次
case 0x1337 主要是赋值操作 v18.staff[1]=v17.staff v18.staff[2] = v17 v4 =0 v4原本是-22
case 0x1338 和0x13339 着两个姑且看作对v3.staff的赋值 一个是0xdeadbeef 一个是 0x1
case 0x133A
若v17.staff!= 0xdeadbeef且cnt >v17.staff[2]且合