-
-
[原创]kernel pwn入门 强网杯 core
-
发表于: 2020-5-8 11:22 10750
-
开始了心心念念的kernel pwn 学习,分享所学,希望和大佬们一起进步,同时可能里面的知识有些来源网络,我找不到出处了,所以没加链接,万分抱歉,如果侵权,可以联系作者,同时欢迎各路大佬找我交流。
参考: https://mp.weixin.qq.com/s/LQTKJrcTyX-KBddzeAK38w
题目: https://pan.baidu.com/s/1vkdsYCq3tvASYtuQeA_zRA 提取码:6l2l
其包含多种运行模式,最常用的就是User-mode emulation 和 System emulation两种。
User-mode emulation
用户模式,在这个模式下,qemu 可以运行单个其他指令集的 linux 或者 macOS/darwin 程序,允许了为一种架构编译的程序在另外一种架构上面运行。
Sytem emulation
系统模式,在这个模式下,qemu 将模拟一个完整的计算机系统,包括外围设备。
bash启动脚本:
命令参数意义
常见保护:Kaslr 地址随机化 , Smep 内核态不可执行用户态代码,Smap内核态不可访问用户态内存。
想深入了解的化可以,去网上查找其实保护机制还有很多,关于这三种的叙述也不是很详细,为了不给小白加压力,其实初期记住这些就好了。
对于提权我们需要进行的此时有两步:
基本步骤如下:
start.sh
解包后里面有init文件,这个是内核启动的初始化文件
保护检查:
checksec .io : 这个是用来检查驱动文件的保护,*该题目开启了canary保护。
同时我们修改文件系统的uidgid部分使得我们可以进入root权限,通过 cat /proc/cpuinfo 显示的flags标志位可以看出内核开启了什么样的保护。
该题开启了kalsr,但是smep这些没开
IDA查看驱动文件。
创建文件系统节点core,注册了 /proc/core
core_ioctl:
这个是ioctl函数驱动时进入的函数,可以类比一些mian函数
core_read:
从 v6[off] 拷贝 64 个字节到用户空间,但要注意的是全局变量 off 使我们能够控制的,因此可以合理的控制 off 来 leak canary 和一些地址.
core_write:
这个就是向全局变量name里面写数据。
core_copy_func:
if对a1进行判断的时候用的64位方式,但是qmemcpy往内核栈里面复制数据的时候用的是a1的低16位,那么我们可以构造一个负数进行绕过,同时使得qmemcpy出现栈溢出。
EXP编写思路:
1.首先我们要通过偏移泄露出基地址(绕过kaslr)
分析init文件,发现本题已经把所需要的数据存放再/tmp/kallsyms了,读取文件,加减偏移即可,我们就获得了prepare_kernel_cred,commit_creds两个关键函数的实际地址。
2.然后我们可以设置偏移,从而通过core_read函数泄露出canary。
这里有两种方法,一种是retuser,一种是kernel rop,技术。
先找出地址,泄露地址的时候我们已经得到了kernel_base,注意:它跟驱动文件的base不是一个东西:
接下来由于后来的内核态和用户态的切换,所以我们要保存相关寄存器的值
接下来就是溢出劫持了,跟平常的pwn区别不大:
完整EXP:
这个跟rop几乎是一样的,唯一的区别在于不是通过系统调用的方式,而是通过直接函数执行的方式来获得权限,贴个Exp(大差别有注释):
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)