老表带你学Linux kernel pwn 入门(三)

本文是Linux kernel pwn系列的第三篇,聚焦Double_Fetch漏洞。介绍漏洞基础知识,详细分析内核模块`baby.ko`,包括驱动注册和设备交互函数,并探讨POC编写和调试策略,旨在帮助新手理解利用过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

写在前面

本篇是老表带你学linux kernel pwn 系列的第三篇,展示在面对包含double Fetch这种漏洞赛题解题方式。新手上路,详细记录。

第一章 基础知识准备

2.1 Double_Fetch 漏洞简介

以下是ctfwiki中堆Double_Fetch的定义与解释

Double Fetch 从漏洞原理上属于条件竞争漏洞,是一种内核态与用户态之间的数据访问竞争。

在 Linux 等现代操作系统中,虚拟内存地址通常被划分为内核空间和用户空间。内核空间负责运行内核代码、驱动模块代码等,权限较高。而用户空间运行用户代码,并通过系统调用进入内核完成相关功能。通常情况下,用户空间向内核传递数据时,内核先通过通过 copy_from_user 等拷贝函数将用户数据拷贝至内核空间进行校验及相关处理,但在输入数据较为复杂时,内核可能只引用其指针,而将数据暂时保存在用户空间进行后续处理。此时,该数据存在被其他恶意线程篡改风险,造成内核验证通过数据与实际使用数据不一致,导致内核代码执行异常。

一个典型的 Double Fetch 漏洞原理如下图所示,一个用户态线程准备数据并通过系统调用进入内核,该数据在内核中有两次被取用,内核第一次取用数据进行安全检查(如缓冲区大小、指针可用性等),当检查通过后内核第二次取用数据进行实际处理。而在两次取用数据之间,另一个用户态线程可创造条件竞争,对已通过检查的用户态数据进行篡改,在真实使用时造成访问越界或缓冲区溢出,最终导致内核崩溃或权限提升。

典型的Double Fetch原理图
图片来自ctfwiki。

第二章 目标准备与分析

2.1 逆向分析baby.ko

2.1.1 分析驱动注册函数init_module

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iSXfRTok-1605147153759)(C:\Users\Siamese\AppData\Roaming\Typora\typora-user-images\image-20201111105541064.png)]

baby.ko注册了一个misc设备baby

2.1.2 分析设备交互函数babay_ioctl

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-xfv45FBa-1605147153760)(C:\Users\Siamese\AppData\Roaming\Typora\typora-user-images\image-20201111105745093.png)]

  • a2=0x6666

    a2值为 0 x 6666 0x6666 0x6666时,打印出flag值所在内核中的地址

      if ( (_DWORD)command == 0x6666 )
      {
         
         
        printk("Your flag is at %px! But I don't think you know it's content\n", flag);
        result = 0LL;
      }
    
  • a2=0x1337

    a2值为 0 x 1337 0x1337 0x1337时,先做检查,检查通过逐字节比较flag与v5的异同,通过则会打印flag的值

      else if ( (_DWORD)command == 0x1337
             && !_chk_range_not_ok(v2, 16LL, *(_QWORD *)(__readgsqword((unsigned __int64)&current_task) + 0x1358))
             &
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值