初识linux内核漏洞利用

0x00 简介


之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下。

0x01 概况


这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.04 32位系统环境下提权。驱动实现了write函数,但是write可以写0x5a0000000个字节。然后还实现了一个ioctl,这里有任意地址写的问题(但是这个分析里没用到)。还有一个read函数,这个可以读取堆上的数据。驱动的代码可以在这里下载到:http://www.52pojie.cn/thread-480792-1-1.html

static ssize_t mem_write(struct file *filp, const char __user *buf, size_t size, loff_t *ppos)
{
    unsigned long p =  *ppos;
    unsigned int count = size;
    int ret = 0;
    struct mem_dev *dev = filp->private_data;

    if((dev->size >> 24 & 0xff) != 0x5a) 
    //dev->size == 0x5aXXXXXX
        return -EFAULT;

    if (p > dev->size)
        return -ENOMEM;

    if (count > dev->size - p)
        count = dev->size - p;

    if (copy_from_user((void *)(dev->data + p), buf, count)) {