首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何使用LD_PRELOAD通过exec* wrapper调用截取execve()?

LD_PRELOAD是一个环境变量,用于指定一个共享库的路径,这个库会在程序启动时被预加载到内存中。通过使用LD_PRELOAD,我们可以在程序执行之前拦截和修改系统调用。

要通过exec* wrapper调用截取execve(),可以按照以下步骤进行操作:

  1. 编写一个共享库,其中包含一个与execve()函数具有相同原型的函数。这个函数将作为execve()的包装器,用于截取和修改execve()的行为。
  2. 在共享库中,使用attribute((constructor))属性将一个初始化函数与共享库关联起来。这个初始化函数将在共享库加载时自动执行。
  3. 在初始化函数中,使用dlsym()函数获取libc.so中的execve()函数的地址,并保存为一个函数指针。
  4. 在初始化函数中,使用LD_PRELOAD环境变量将共享库路径设置为当前路径下的共享库文件。
  5. 在包装器函数中,可以在调用execve()之前或之后添加自定义的逻辑。例如,可以记录程序执行的信息、修改参数、检查权限等。
  6. 编译共享库,并将其放置在与被调用程序相同的路径下。
  7. 在执行目标程序时,设置LD_PRELOAD环境变量为共享库的路径。这样,当程序启动时,共享库将被预加载到内存中,并替换掉系统的execve()函数。

需要注意的是,使用LD_PRELOAD进行系统调用截取是一种高级技术,需要对操作系统和编程语言有深入的了解。同时,这种技术也可能会引入安全风险,因此在实际应用中需要谨慎使用。

腾讯云提供了丰富的云计算产品和服务,包括云服务器、云数据库、云存储、人工智能等。您可以访问腾讯云官网(https://cloud.tencent.com/)了解更多相关产品和服务的详细信息。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

无需 sendmail:巧用 LD_PRELOAD 突破 disable_functions

LD_PRELOAD 劫持系统函数,却又发现目标根本没安装 sendmail,无法执行命令的 webshell 是无意义的,看我如何突破!...比如,运行 /usr/bin/id,通过 ldd 可查看系统为其加载的共享对象: ?...PHP 脚本中除了调用 system()、exec()、shell_exec() 等等一堆 php 函数外,还有哪种可能启动外部程序呢?php 解释器自身!...比如,php 函数 goForward() 实现“前进”的功能,php 函数 goForward() 又由组成 php 解释器的 C 语言模块之一的 move.c 实现,C 模块 move.c 内部又通过调用外部程序...第一个 execve 是启动 PHP 解释器而已,必须找到第二个 execve,没有则说明并未启动新进程;请求网页,新建 http.php,调用 curl_init(): ?

2K10
  • 干货 | Linux下权限维持实战

    今天我们就从浅入深完整的学习一下什么是 LD_PRELOADLD_PRELOAD 有什么作用,我们可以如何利用 LD_PRELOAD。...LD_PRELOAD Hook 由于 LD_PRELOAD 可以指定在程序运行前优先加载的动态链接库,那我们可以重写程序运行过程中所调用的函数并编译成动态链接库文件,然后通过指定 LD_PRELOAD...4.替换结束,要还原函数调用关系,用命令unset LD_PRELOAD 解除 下面我们通过一个简单的实例进行演示: •passcheck.c #include#include<string.h...-fPIC hook_strncmp.c -o hook_strncmp.so 然后通过环境变量 LD_PRELOAD 来设置 hook_strncmp.so 能被其他调用它的程序优先加载: export...>s 执行以下命令,可以查看进程调用的系统函数明细: strace -f php error_log.php 2>&1| grep -A2 -B2 execve image-20210917174254130

    1.6K30

    反弹shell-逃逸基于execve的命令监控(上)

    在linux中,启动外部进程,是通过execve系统调用进行创建的,我们使用strace 打印一下在bash中启动ls的系统调用,第一句就是通过execve启动ls。 ?...但是我们在开发linux程序的时候,执行系统命令,并没有直接使用execve系统调用,这是因为libc/glibc库对execve系统调用封装成了函数,方便我们调用。...因此基于execve的系统命令监控方式,分成了用户态和内核态。用户态通过劫持libc/glibc的exec相关函数来实现,内核态则通过系统自身组件或者劫持execve syscall 来实现。...1.用户态 在libc/glibc中,对execve syscall 进行了一系列的封装,简称exec族函数。exec系列函数调用时,启动新进程,替换掉当前进程。...因此监控execve系统调用是无法监控这部分的,当然能用作恶意行为的内置命令并不多,算是一个补充。 如何判断是否是内置命令呢?

    3.1K20

    EasyCVR如何通过接口调用使用实时录像功能?

    之前在介绍EasyGBS的时候,我们说到了TSINGSEE青犀视频平台中的三种录像功能,分别是云端录像、设备录像、实时录像,一般我们使用云端录像和设备录像比较多。...现在很多的用户向我们反馈EasyCVR没有EasyGBS的实时录像功能,其实EasyCVR已有实时录像功能,只是我们没有将该功能放在前端页面上展示出来,需要通过接口去调用获取。...下面介绍下EasyCVR如何通过接口调用实时录像。...1、首先,实时录像只能对于国标接入的设备使用,非国标设备不能调用实时录像接口 image.png 通过获取设备信息接口和通道信息接口先获取到设备的deviceid和channelid,然后先调用播放接口...,注意这里必须先调用播放接口,再调用录像接口 image.png 2、然后开始调用开始实时录像接口,输入channel参数,返回OK证明已经开始实时录像了 image.png 3、接着调用关闭实时录像接口

    73730

    无命令反弹shell-逃逸基于execve的命令监控(上)

    在linux中,启动外部进程,是通过execve系统调用进行创建的,我们使用strace 打印一下在bash中启动ls的系统调用,第一句就是通过execve启动ls。 ?...因此基于execve的系统命令监控方式,分成了用户态和内核态。用户态通过劫持libc/glibc的exec相关函数来实现,内核态则通过系统自身组件或者劫持execve syscall 来实现。...1.用户态 在libc/glibc中,对execve syscall 进行了一系列的封装,简称exec族函数。exec系列函数调用时,启动新进程,替换掉当前进程。...因此监控execve系统调用是无法监控这部分的,当然能用作恶意行为的内置命令并不多,算是一个补充。如何判断是否是内置命令呢?...咱们看看有没有用到execve,使用strace打印一下系统调用,没有出现对 ls的调用过程。 为了防止被用户态劫持,里面的所有和系统有关的函数,都是通过系统调用的方式。 ?

    1.6K20

    雪城大学信息安全讲义 六、输入校验

    LD_PRELOAD 许多 UNIX 系统允许你预加载共享库,通过设置环境变量LD_PRELOAD。这允许你做一些有趣的事情,比如将 C 标准库的函数或者甚至系统调用的 C 接口换成你自己的函数。...如何防护它:显式设置 umask 值(使用umask(077)),或者显式设置新创建文件的权限(使用chmod("newfile",0755)。...host.example.com; rm -rf * exec函数、system和popen Exec 函数系列通过将当前进程影响包装成新的,来运行子进程。...有许多 Exec 函数的版本,它们工作方式不同。它们可以归类于以下几种: 使用或者不使用 Shell 来启动子进程 通过 Shell(Shell 可以引入比我们预期的更多功能。...如何安全地调用程序? 避免任何调用 Shell 的东西。不要使用system,而是使用execve,它不调用 Shell,与system不同。

    57410

    ​disable_functions绕过总结

    strace查看imap_open()函数执行过程 strace -f php imap.php 2>&1 | grep execve 此处的localhost作为参数之一,所以可以通过修改hostname...来达到参数注入,与此同时,/usr/bin/rsh会去调用ssh,后者有个-oProxyCommand参数可以执行命令 在写入服务器地址的时候,有些字符可能会被转义,所以一般使用base64编码 使用...POC,并查看完整调用过程,直接去调用系统的echo命令,不受disable_functions影响,所以也就成功bypass 5、LD_PRELOAD劫持 (1)基础知识 C语言执行顺序为: 编辑—...sendmail 于是就类似mail了,可以通过劫持某个特定函数或者利用constructor属性来达到任意命令执行 8、Imagick Imagick在处理一些特定格式的文件时,会调用外部某些程序启动子进程...需要安装才能使用

    88921

    LD_PRELOAD 后门 | bypass disable_functions

    strcmp 后门加固(使用alias) 通过使用alias给命令定义别名,重新定义命令的执行,将暴露后门的内容给过滤掉再输出即可 echo alias echo='func(){ echo $* |...puts()函数,但whoami会执行payload而pwd命令就不会执行payload whoami 命令和 pwd 命令都调用了 puts 函数,使用 ltrace 进行查看的时候还都实际调用执行了...和/usr/bin/pwd是外部函数可以加载外部共享库进而通过覆盖的puts()执行payload 我自己看到的 按照上面文章说法劫持失败原因是因为pwd命令默认执行的是内置命令,但是我自己使用which...-f php function.php 2>&1 | grep -A2 -B2 execve #查看php文件执行后调用了哪些系统命令,然后再使用readelf查看调用的系统命令使用了哪些库函数,对其进行劫持...,所以想了能不能直接通过putenv函数执行代码,但是测试后发现实际上执行的效果是会直接带着/将原字符串原封不动赋给LD_PRELOAD,相当于执行了export LD_PRELOAD=’\ifconfig

    85140

    Linux进程启动过程分析do_execve(可执行程序的加载和运行)---Linux进程的管理与调度(十一)

    execve系统调用 execve系统调用 我们前面提到了, fork, vfork等复制出来的进程是父进程的一个副本, 那么如何我们想加载新的程序, 可以通过execve来加载和启动新的程序。...()函数族 exec函数一共有六个,其中execve为内核级系统调用,其他(execl,execle,execlp,execv,execvp)都是调用execve的库函数。...char __user *const __user *envp); fs/exec.v 1710 execve系统调用的的入口点是体系结构相关的sys_execve, 该函数很快将工作委托给系统无关的...这样的函数名以前缀exec开始。所有的exec函数都是调用execve()系统调用。...、filename、interp成员 调用bprm_mm_init()创建进程的内存地址空间,为新程序初始化内存管理.并调用init_new_context()检查当前进程是否使用自定义的局部描述符表;

    4K31

    一套使用注入和Hook技术托管入口函数的方案

    我们的函数负责和父进程通信传递请求(之前是通过命令行的方式)和结果,并且调用原来的主函数。 ?         这个方案一个基础的技术点便是:如何托管工具的主函数?        ...在linux系统中,我们启动另外一个可执行文件是通过fork和exec系列函数实现的。fork完之后,进程的代码空间还和主进程一样。exec系列函数被执行后,进程的代码空间就变成目标文件的了。...在linux下,一种常见的方案是使用ptrace。这块方案已经比较成熟,我就不再展开。除了这个之外,还有种比较简单的方案,就是使用LD_PRELOAD。.../inject.so", nullptr }; execve("....同时使用LD_PRELOAD让子进程提前加载同目录下的inject.so文件。

    1.1K30

    Linux上的程序是怎样运行的

    进入内核: execve系统调用 execve系统调用实现 该函数定义在fs/exec.c中,其声明如下: SYSCALL_DEFINE3(execve, const char __user *, filename...,我们可以看到,在do_execve中,最终调用了do_execveat_common,其除了使用do_execve中的参数之外,还有额外的两个参数。...然后,对check_unsafe_exec函数的调用将当前进程设置为in_execve状态。...处理参数结构 通过调用exec_binprm函数来存储当前当前任务所在进程的pid retval = exec_binprm(bprm); if (retval < 0) goto out;...如我们所见,execve系统调用不会将控制权返回给进程,但是调用者进程的代码,数据和其他段只是被程序段所覆盖。应用程序的退出将通过退出系统调用实现。 至此,整个程序从开始运行到退出,整个流程完。

    3.4K30

    Linux下程序是怎样执行的

    进入内核: execve系统调用 execve系统调用实现 该函数定义在fs/exec.c中,其声明如下: SYSCALL_DEFINE3(execve, const char __user *, filename...,我们可以看到,在do_execve中,最终调用了do_execveat_common,其除了使用do_execve中的参数之外,还有额外的两个参数。...然后,对check_unsafe_exec函数的调用将当前进程设置为in_execve状态。...处理参数结构 通过调用exec_binprm函数来存储当前当前任务所在进程的pid retval = exec_binprm(bprm); if (retval < 0) goto out; 在...如我们所见,execve系统调用不会将控制权返回给进程,但是调用者进程的代码,数据和其他段只是被程序段所覆盖。 应用程序的退出将通过退出系统调用实现。 至此,整个程序从开始运行到退出,整个流程完。

    5K50

    bypass disable function学习

    strace -f php phpinfo.php 2>&1 | grep execve 可以看到这里调用了sendmail,与网上的文章同样的我们可以追踪sendmail来查看其调用过程,或者使用readelf...geteuid,并且但这事实上是sh调用的而非mail调用的,因此如果我们使用php index.php来调用会发现system执行成功,但如果我们通过页面来访问则会发现执行失败,这是一个在利用过程中需要注意的点...,这也就是为什么我们会使用管道符来选取execve。...中默认使用ssh来代替rsh的功能,也即是说在这俩系统中调用的实际上是ssh,而ssh中可以通过-oProxyCommand=来调用命令,该选项可以使得我们在连接服务器之前先执行命令,并且需要注意到的是此时并不是...也即是说我们可以通过ffi来调用c语言的函数从而绕过disable的限制,我们可以简单使用一个示例来体会一下: $ffi = FFI::cdef("int system(const char *command

    2.2K40

    Linux 创建子进程执行任务的实现方法

    Linux 系统中通过 fork/vfork 系统调用来创建新进程。本文将介绍如何使用 fork/vfork 系统调用来创建新进程并使用 exec 族函数在新进程中执行任务。...使用 vfork 创建的子进程一般会通过 exec 族函数执行新的程序。接下来让我们先了解下 exec 族函数。...exec 族函数 使用 fork/vfork 创建子进程后执行的是和父进程相同的程序(但有可能执行不同的代码分支),子进程往往需要调用一个 exec 族函数以执行另外一个程序。...调用这样的函数时,可以由用户自行设定子进程的环境变量,存放在参数 envp 所指向的字符串数组中。 事实上,只有 execve 是真正的系统调用,其它五个函数最终都调用 execve。...在子进程中执行任务 下面让我们通过 vfork 和 execve 函数实现在子进程中执行 ls 命令: #include #include #include

    3.8K11
    领券