题目
这里以以下两道题目为研究对象:
题目一:
https://lkmidas.github.io/posts/20210123-linux-kernel-pwn-part-1
题目二:
https://breaking-bits.gitbook.io/breaking-bits/exploit-development/linux-kernel-exploit-development/stack-cookies
两道题目都只开了kernel stack其他安全机制关闭,可以直接使用ret2user进行利用;
ret2user需要构造payload,覆写内核栈,执行用户态的getroot函数。
如何对内核栈进行覆盖,将返回地址控制为自己的地址就是关键。
对于用户态,用户栈压栈出栈是由函数调用约定来标准化的,是有规律可循的,但是在内核中却不是这样。
linux 5.9.0
第一道题运行起来,查看一下内核版本
内核版本为5.9.0 架构为x86_64
对给出的有漏洞驱动进行反汇编
其对rbp、r12和rbx进行了压栈
在实际构造payload时就需要填充这三个位
linux 5.4.0
题目二内核版本为:
对于其提供的漏洞驱动进行反编译
可以看到只压栈了rbp、r12
所以只需填充两位
原答案中
是按照用户态惯例进行填充,是不对的。
总结
内核栈调用不同于用户态,需要亲自调试。