上篇讲了程序的加载。然后设置了eip,这一篇分析一下开始执行第一条指令的时候。会发生什么。 我们先看一下这时候的内存布局。
下的loader:用户态execve。...研究用户态execve的实现,起初是从攻击的方向去思考的,在linux主机安全中,使用shell命令进行攻击是非常常见的场景,无论是横向移动,还是种马,很难不应用shell命令。...在之前的文章中,无"命令"反弹shell-逃逸基于execve的命令监控(上) 分享过关于shell命令的各种监控方式,其中最难绕过的是内核态的execve监控。...[eauldvj8mz.png] 我的选择是抛弃execve系统调用来执行命令,而是思考自己实现用户态execve,这样就可以彻底摆脱命令监控,如果再延展一下,还会有更深层次的操作。...二.How:如何设计linux elf loader how 用户态execve 是仿照linux内核中execve syscall的原理 ,在应用层实现程序的加载和运行,如果做过windows pe
execve函数是操作系统非常重要的一个函数,他使得程序变成进程成为可能。下面我们通过do_execve的实现,了解一下程序变成进程的过程。首先do_execve是一个系统调用。...直接从sys_execve函数开始。..._sys_execve: lea EIP(%esp),%eax pushl %eax call _do_execve addl $4,%esp ret 执行_do_execve...在这里插入图片描述 下面开始分析do_execve的实现。...int do_execve(unsigned long * eip,long tmp,char * filename, char ** argv, char ** envp) { struct
在linux中,启动外部进程,是通过execve系统调用进行创建的,我们使用strace 打印一下在bash中启动ls的系统调用,第一句就是通过execve启动ls。 ?...但是我们在开发linux程序的时候,执行系统命令,并没有直接使用execve系统调用,这是因为libc/glibc库对execve系统调用封装成了函数,方便我们调用。...方法2: glibc/libc是对linux系统调用(syscall)的封装,我们使用它是为了简化对系统调用的使用,其实我们可以不用它,直接使用汇编 sysenter/int 0x80指令调用execve...四.新方法-无"命令"反弹shell 在已知的绕过方法中,通过shellcode方式绕过内核态的execve监控,算是相对优雅的方式了,我比较喜欢这种,但是这种方式又太麻烦,linux的命令我都要重写成...其实我的需求很简单: 我既想要linux命令原有的功能,又不想用execve syscall的方式启动。 想了想,怎么办呢? 暂时不写了,删了一次,有点敏感,还望见谅 ?
文章目录 一、bionic/libc/include/unistd.h#execve 函数分析 二、使用自定义的 myexecve 函数替换 libc.so#execve 函数 在 【Android...libc.so#execve 函数 ; 一、bionic/libc/include/unistd.h#execve 函数分析 ---- libc.so#execve 函数 定义在 Android 源码的...函数在 libc.so 的地址 , uint32_t new_addr 参数是自定义替换 execve 函数执行的函数地址 , uint32_t **proto_addr 参数是 execve 原函数的地址..., 就退出 ; 不需要拦截的 , 直接调用原函数执行 ; 源码示例 : // 用于接收 Android 自带的 execve 函数 int (*android_execve)(const char *...__file, char *const *__argv, char *const *__envp); // 自定义的 execve 函数 , 用于替换 Android 自带的 execve 函数 //
躲避execve,是在原来的文章的基础上补充一个小思路,分析/proc/目录 是为了下一篇讲解内存中修改函数做准备,要让大家提前知道这回事。...躲避execve的小思路 在之前文章中,我讲解过各种躲避execve监控的方法,如果有朋友没看到过,可以点下面文章链接熟悉一下: 无"命令"反弹shell-逃逸基于execve的命令监控(上) linux...无文件执行— fexecve 揭秘 本文的思路,类似文件复制重命名,躲避execve监控的关键点在于创建软链接,通过创建软链接的方式来混淆命令执行的路径。...由于execve执行软链接,会自动执行目标文件,不会对软链接进行转换,从而实现了隐藏。 不要以为这就结束了!!!.../man-pages/man5/proc.5.html https://github.com/NanXiao/gnu-linux-proc-pid-intro
execve加载可执行程序的过程 内核中实际执行execv()或execve()系统调用的程序是do_execve(),这个函数先打开目标映像文件,并从目标文件的头部(第一个字节开始)读入若干(当前Linux...v=4.5#L1628 更早期实现linux-2.4 linux-3.18引入execveat之前do_execve实现 linux-3.19~至今引入execveat之后do_execve实现 do_execveat...程序的加载do_execve_common和do_execveat_common 早期linux-2.4中直接由do_execve实现程序的加载和运行 linux-3.18引入execveat之前...do_execve调用do_execve_common来完成程序的加载和运行 linux-3.19~至今引入execveat之后do_execve调用do_execveat_common来完成程序的加载和运行...do_execve则是调用do_execveat_common实现的,依次执行以下操作: 调用unshare_files()为进程复制一份文件表 调用kzalloc()分配一份struct linux_binprm
在linux中,启动外部进程,是通过execve系统调用进行创建的,我们使用strace 打印一下在bash中启动ls的系统调用,第一句就是通过execve启动ls。 ?...但是我们在开发linux程序的时候,执行系统命令,并没有直接使用execve系统调用,这是因为libc/glibc库对execve系统调用封装成了函数,方便我们调用。...方法2: glibc/libc是对linux系统调用(syscall)的封装,我们使用它是为了简化对系统调用的使用,其实我们可以不用它,直接使用汇编 sysenter/int 0x80指令调用execve...四.新方法-无"命令"反弹shell 在已知的绕过方法中,通过shellcode方式绕过内核态的execve监控,算是相对优雅的方式了,我比较喜欢这种,但是这种方式又太麻烦,linux的命令我都要重写成...其实我的需求很简单: 我既想要linux命令原有的功能,又不想用execve syscall的方式启动。 想了想,为什么不能将linux 命令直接当成shellcode来执行呢?
linux-tools-$(uname -r) $ apt install linux-tools-common linux-tools-generic $ apt install linux-tools.../tools/include/uapi/目录下的linux子目录中查找到bpf.h头文件。同时kernel-headers包引入的/usr/include/linux/目录下也有bpf.h,..../tools/include/目录下的linux子目录中查找到头文件。 通过-I./tools/lib/编译选项,可以在....所以,最终会在/usr/include/linux/perf_event.h位置被查找到。...可以看出同样是形式的头文件,和却在两个完全不同的搜索路径查找到。
Linux内核版本:linux-3.0.35 开发板:i.MX6S MY-IMX6-EK200 系统:Ubuntu12 前言:之前写过一篇关于如何通过应用层程序读取系统时间的blog,今天再写一篇如何写入并保存...time.h> #include #include #include #include #include <linux...c、execve()应用层调用脚本文件: 头文件:#include 函数:int execve(const char * filename, char * const argv...d、execve()测试代码: /************************** *功能:测试execve *时间:2016-4-15 *作者:Jack Cui *****************...f、execve测试结果: ? 可以看出execve使用正常,我们将脚本内容改为hwclock –systohc就可以实现将系统时间同步到硬件时间了。
在上述整个调用流程串的最后一步是shell_execve。...进入内核: execve系统调用 execve系统调用实现 该函数定义在fs/exec.c中,其声明如下: SYSCALL_DEFINE3(execve, const char __user *, filename...(getname(filename), argv, envp); } execve的实现在这里非常简单,只调用了do_execve函数,其参数为execve的参数。...在下一步中,我们开始准备由struct linux_binprm结构(在include/linux/binfmts.h头文件中定义)表示的bprm。...二进制参数准备 struct linux_binprm linux_binprm结构用于保存加载二进制文件时使用的参数。
继续2020年的flag,至少每周更一篇文章,今天讲linux无文件执行。...linux无文件执行,首先要提到两个函数:memfd_create 和 fexecve。...fexecve的实现 今天不谈memfd_create,这是linux的新特性,没有什么好玩的,本人对fexecve 的实现很有兴趣,因为fexecve是glibc中的函数,而不是linux的系统调用。...大家可以看到shmopen 其实是在/dev/shm创建文件,而execve的执行文件为/proc/self/fd/3,为进程中打开的文件符号链接,这个指向的就是shm_open创建的文件,但是从监控execve...的角度来说, execve无法获取执行文件的路径,从而实现了混淆。
int execve(const char *filename, char *const argv[], char *const envp[]);//用于启动装载一个程序...;}编译后文件是ELF文件图片启动示例程序启动示例程序图片同样的也是execve,write系统调用函数。php编程语言在Linux os 的运行//demo.php<?...图片execve("/home/soft/php/bin/php", ["/home/soft/php/bin/php", "demo.php"], 0x55b6b83b23e0 /* 32 vars...os 系统调用函数上面我们演示了golang,java,rust,php编程语言【其它编程语言也是一样】,它们启动到运行都是调用了Linux 的系统函数execve,write,【其实linux 的系统调用函数很多...像execve,write系统调用函数在linux0.1版本【1991年发布的操作系统】就已经提供了。
方法: 1)将ida dbgsrv目录下的linux_server放在linux虚拟机中,以root形式运行linux_server,如下图。 ?...这里注意一点的是,Hostname要输入linux虚拟机的ip地址,并且确保linux_server是运行状态。...当可执行bash脚本被解密后,系统通过sys_execve(bin/sh)的方式呼唤起shell,然后通过sh -c执行bash的脚本。 ?...这里有一点需要注意的是病毒执行sys_execve的方式并不是直接调用函数sys_execve,而是采用了int 0x80的方式。...比如需要执行sys_execve。 1)首先查看资料得知sys_execve的序号是11。接着病毒将此序号传入代码中等待。
为了对 root 权限进行更细粒度的控制,实现按需授权,Linux 引入了另一种机制叫 capabilities。 01 Linux capabilities 是什么?...Capabilities 机制是在 Linux 内核 2.2 之后引入的,原理很简单,就是将之前与超级用户 root(UID=0)关联的特权细分为不同的功能组,Capabilites 作为线程(Linux...详情请参考 Linux capabilities 的 man page。...06 参考资料 Linux Capabilities: Why They Exist and How They Work Understanding Capabilities in Linux Linux...Capabilities in a nutshell Linux的capabilities机制
/velociraptor-v0.72.0-linux-amd64 config generate -i 第一个坑点,生成完以后,就算hostname写的外网ip,他的ui端口还是绑定在127上面,...工件管理 Velociraptor内置了一些工件可以直接使用,根据内置的工件也可以自行编写相应的工件,以Linux.Syslog.SSHLogin 工件为例: 该工件为通过查询log日志,然后利用grok...命令记录: -a always,exit -F arch=b64 -S execve -k execve_audit -a always,exit -F arch=b32 -...S execve -k execve_audit 然后通过Velociraptor的解析audit日志的函数完成audit日志的解析,就像上面笔者说的,官方文档是真的少,就给个简单的方法名,连输出哪些字段也不知道...description: | This artifact parses the Linux audit log and extracts command execution
之前写过一篇文章 Linux下c语言中的main函数是如何被调用的,该篇文章侧重于从user space层面讲程序的运行,而文章中提到的有关kernel space层面的相关系统调用,比如fork、execve...今天我们主要来看下execve系统调用,直接看代码: // fs/exec.c SYSCALL_DEFINE3(execve, const char __user *,...(getname(filename), argv, envp); } 该方法调用了do_execve: // fs/exec.c int do_execve(struct filename *filename...(fd, filename, argv, envp, flags, NULL); } 该方法又调用了__do_execve_file: // fs/exec.c static int __do_execve_file...好,我们再回到__do_execve_file方法,该方法的最后又调用了exec_binprm方法。
前言:ptrace 是 Linux 内核提供的非常强大的系统调用,通过 ptrace 可以实现进程的单步调试和收集系统调用情况。...父进程执行 fork 创建一个子进程,通过 ptrace 设置子进程为 PF_PTRACED 标记,然后执行 execve 加载被调试的程序。 2....do_execve 通过钩子函数加载程序,我们看看 formats 是什么。...struct linux_binfmt { struct linux_binfmt * next; int *use_count; int (*load_binary)(struct...linux_binfmt * fmt){ struct linux_binfmt ** tmp = &formats; if (!
该示例是在 CentOS Linux 7.6 上使用 Auditbeat 7.4.2 RPM 软件包和 Elasticsearch Service(ESS)[https://www.elastic.co...定义规则以捕获这些事件,并且使用Linux auditctl实用程序所使用的格式,详情查看(此处[https://linux.die.net/man/8/auditctl])。...-S execve -k user_acct -a exit,always -F arch=b32 -F euid>=1000 -S execve -k user_acct euid是用户的有效ID。...always,exit -F arch=b64 -S execve -F euid>=vagrant -F key=user_acct -a always,exit -F arch=b32 -S execve...追加以下内容到/etc/pam.d/system-auth便可以对所有用户启用审核(关于pam_tty_audit的详细信息,请参见此处[https://linux.die.net/man/8/pam_tty_audit
领取专属 10元无门槛券
手把手带您无忧上云