由于自己还没有深入了解linux内核的保护机制,因此这篇文章长期更新。
看完muhe的linux kernel exploit的入门文章以后可以发现样例程序都是无保护措施的,最多加了一个canary保护,因此,想要深入学习还是首先要了解一下内核的保护措施

kaslr

MMAP_MIN_ADDR

mmap_min_addr是用来对抗null pointer dereference的,它不允许程序分配低内存,就像第一篇文章中的例子,空指针指向0,在其解引用时便会执行0地址处的代码。

kallsyms

前几篇文章中在写exp的时候,都会先确定commit_creds(),prepare_kernel_cred()函数的地址,/proc/kallsyms给出内核中所有symbol的地址,通过grep <function_name> /proc/kallsyms 就可以得到对应函数的地址,我们需要这个信息来写可靠的exploit,否则需要自己去泄露这个信息。在低版本的内核中所有用户都可读取其中的内容,高版本的内核中缺少权限的用户读取时会返回0.
linux kernel v2.6.32

linux kernel 4.15.0

smep/smap

smep:Supervisor Mode Execution Protection

管理模式执行保护。
保护内核使其不允许执行用户空间代码,前面的文章中,在介绍kernel stack overflow的exploit中,就是将内核栈的返回地址返回到用户空间的代码片段执行,开启smep之后,当 CPU 处于 ring0 模式时,执行 用户空间的代码 会触发页错误。
检查smep是否开启:cat /proc/cpuinfo | grep smep
smep 保护原理及绕过方法
操作系统是通过CR4寄存器的第20位的值来判断smep是否开启

  • 第20位 = 1时:smep开启
  • 第20位 = 0时:smep关闭
    可同通过mov指令给CR4寄存器赋值从而达到关闭smep的目的,相关的mov指令可以通过ropper,ROPgadget等工具查找。

smap: Supervisor Mode Access Protection

管理员模式访问保护
原理及绕过方法
操作系统是通过CR4寄存器的第21位判断的,绕过方式与smep类似

preView