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

文章目录

  • 写在前面
  • 第一章 环境配置方法
    • 1.1 内核编译方法
    • 1.2 调试环境准备
  • 第二章 linux kernel pwn 赛题介绍
    • 2.1 文件组成
    • 2.2 原始赛题文件处理方法
      • 2.2.1 抽取`vmlinux`的方法
      • 2.2.2 解包文件系统的方法
      • 2.2.3 获取`gadget`的方法
      • 2.2.4 如何将exp送到虚拟机中编译
      • 2.2.5 gdb调试内核方法
  • 第三章 基础知识准备
    • 1. kernel pwn的基本目的
    • 2. 用户态和内核态的状态切换过程
      • 2.1 用户态和内核态
      • 2.2 用户态切换到内核态的过程
      • 2.3 内核态切换到用户态的过程
      • 2.4为什么要麻烦回到用户空间?
  • 第四章 牛刀小试——简单内核栈溢出
    • 4.1 目标分析
    • 4.2 poc分析调试
    • 4.3 利用思路分析
    • 4.4 exp编写与调试
    • 权限结构

写在前面

​ 本系列笔记主要搬运各个大佬的kernel pwn相关的笔记,外加上自己的分析过程,记录收获,方便以后用到查询。kernel相关的基础知识很多,很难几次讲清楚,所以随着分析的漏洞数量的增加,慢慢补喽。

​ 本篇笔记算上搭环境+骚扰大佬历时三天时间完成,通过本篇笔记可以掌握linux kernel pwn的环境搭建方法以及赛题的基本处理方法,给以后分析和利用kernel打个基础,答应老表的fuzz笔记又跳票了。

第一章 环境配置方法

本章介绍linux系统下内核漏洞分析利用环境的搭建方法,首先介绍内核的编译方法,其次介绍调试内核代码的方法。

1.1 内核编译方法

本小节介绍linux内核的一般编译流程,

  1. 资源准备

    • 准备ubuntu18.04系统

    • 下载待分析的内核源码(以linux-4.20为例)

    • 安装编译依赖

      sudo apt-get install make gcc bison flex libssl-dev ncurses-dev

  2. 编译内核

  3. 检验编译结果

    一般使用qemu启动目标内核

    代码等待补充

1.2 调试环境准备

  1. 调试工具

    • gef

      gef下载地址补充,git备份

    • tmux

      tmux网址补充

  2. 分析工具

    • IDA

      自行寻找,吾爱破

    • pwntools

      补充安装方法

第二章 linux kernel pwn 赛题介绍

2.1 文件组成

  • baby.ko
    baby.ko是包含漏洞的程序,一般使用ida打开分析,可以根据init文件的路径去rootfs.cpio里面找
  • bzImage
    bzImage是打包的内核代码,一般通过它抽取出vmlinx,寻找gadget也是在这里。
  • initramfs.cpio
    initramfs.cpio是内核采用的文件系统
  • startvm.sh
    startvm.sh是启动QEMU的脚本
  • vmlinux
    静态编译,未压缩的内核文件,可以在里面找ROP
  • init文件
    在rootfs.cpio文件解压可以看到,记录了系统初始化时的操作,一般在文件里insmod一个内核模块.ko文件,通常是有漏洞的文件
    .ko文件:需要拖到IDA里面分析找漏洞的文件,

2.2 原始赛题文件处理方法

2.2.1 抽取vmlinux的方法

利用linux内核源码中的script中的extract-vmlinux脚本可以抽取出vmlinux,具体方法为:
./extract-vmlinux ./bzImage > vmlinux

2.2.2 解包文件系统的方法

本小节提供两种对内核文件系统的解包方法

  • cpio文件使用解压、重打包
    • mkdir extracted; cd extracted
    • cpio -i --no-absolute-filenames -F ../rootfs.cpio
    • 此时与其它文件系统相同,找到rcS文件或者init文件,查看加载的驱动,拿出来
    • find . | cpio -o --format=newc > ../rootfs.cpio
  • ext4:文件系统挂在到已有目录
    • 等待补充

2.2.3 获取gadget的方法

  • ropper(不推荐比较慢)
    可以使用ropper 获得gadget片段
    https://github.com/sashs/Ropper
    ropper --file ./vmlinux --nocolor > ropgadget
    -tips: 使用ropper时会卡主不知道为什么

  • 推荐使用objdump
    objdump -d vmlinux > gadget

    然后使用vim中搜索功能搜索gadget比较快

2.2.4 如何将exp送到虚拟机中编译

  • t3ls大佬的方法
    当我们写好exp.c时,需要编译并把它传到本地或远程的QEMU虚拟机中,但是由于出题人会使用busybox等精简版的系统,所以我们也不能用常规方法。这里给出一个t3ls的脚本,也可以用于本地调试,就不需要重复挂载、打包等操作了。需要安装muslgccapt install musl-tools
from pwn import *
#context.update(log_level='debug')

HOST = "10.112.100.47"
PORT = 1717

USER = "pwn"
PW = "pwn"

def compile():
    log.info("Compile")
    os.system("musl-gcc -w -s -static -o3 oob.c -o exp")

def exec_cmd(cmd):
    r.sendline(cmd)
    r.recvuntil("$ ")

def upload():
    p = log.progress("Upload")

    with open("exp", 

你可能感兴趣的:(CTF,linux,kernel,pwn)