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

如何在LD_PRELOAD库中获取命令行参数

LD_PRELOAD是一个环境变量,它允许你在程序运行之前预加载一个或多个共享库。这样,这些库中的函数会在程序原本要调用的库函数之前被调用,从而可以对程序的行为进行修改或扩展。这在调试、性能分析、安全监控等方面非常有用。

基础概念

  • LD_PRELOAD: 这是一个Linux特有的环境变量,用于指定在程序启动时需要预先加载的共享库。
  • 共享库: 一种可以被多个程序共享的代码库,通常以.so(在Linux上)为文件扩展名。

获取命令行参数的方法

要在LD_PRELOAD库中获取命令行参数,你可以使用argcargv这两个全局变量。这些变量在C/C++程序的主函数main(int argc, char *argv[])中被定义,并且在整个程序的生命周期内都是可访问的。

示例代码

以下是一个简单的示例,展示如何在LD_PRELOAD库中打印出命令行参数:

  1. 创建预加载库

首先,创建一个C文件(例如preload.c),并编写以下代码:

代码语言:txt
复制
#include <stdio.h>

extern int argc;
extern char **argv;

void print_args() {
    for (int i = 0; i < argc; ++i) {
        printf("Argument %d: %s\n", i, argv[i]);
    }
}

然后,编译这个文件为一个共享库:

代码语言:txt
复制
gcc -shared -fPIC -o preload.so preload.c
  1. 设置LD_PRELOAD并运行程序

假设你有一个简单的C程序(例如test.c),它只是打印出"Hello, World!":

代码语言:txt
复制
#include <stdio.h>

int main(int argc, char *argv[]) {
    printf("Hello, World!\n");
    return 0;
}

编译这个程序:

代码语言:txt
复制
gcc -o test test.c

现在,设置LD_PRELOAD环境变量,并运行你的程序:

代码语言:txt
复制
LD_PRELOAD=./preload.so ./test arg1 arg2 arg3

你应该会看到类似以下的输出:

代码语言:txt
复制
Argument 0: ./test
Argument 1: arg1
Argument 2: arg2
Argument 3: arg3
Hello, World!

注意事项

  • 这种方法依赖于全局变量argcargv,这些变量在某些情况下可能不可用或被修改。
  • 使用LD_PRELOAD时要小心,因为它可以影响系统上所有使用该库的程序的行为。
  • 在生产环境中使用LD_PRELOAD时要特别小心,以避免引入安全风险或性能问题。

应用场景

  • 调试: 可以用来跟踪程序的命令行参数,帮助开发者理解程序的行为。
  • 性能分析: 可以用来测量函数调用的开销,或者替换某些函数以进行性能测试。
  • 安全监控: 可以用来监控或修改程序的输入,以防止恶意输入或进行安全审计。

遇到的问题及解决方法

如果你在使用LD_PRELOAD时遇到问题,比如无法获取命令行参数,可能是由于以下原因:

  • 全局变量未定义: 确保你的预加载库正确地引用了argcargv全局变量。
  • 编译或链接错误: 检查你的共享库是否正确编译和链接。
  • 环境变量设置错误: 确保LD_PRELOAD环境变量正确设置,并且指向了正确的共享库文件。

解决方法包括检查代码、重新编译共享库、以及确保环境变量正确设置。

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

相关·内容

SpringTask实现数据库中获取任务、调用方法、方法参数

= 0) { jobs.forEach(job -> { // 获取数据库数据 String[] strArgs...,参数:" + a + b); } } 4....用途 将时间跨度较高的任务加到数据表中(比如一个月执行一次),由JobService.execute方法,定时扫描数据库执行,能够避免服务停止导致的定时任务丢失。...可以将JobService.execute方法中的代码抽出,作为其他工具类使用(比如按扫描频度、执行功能等增加多种不同的execute) 本人目前的使用步骤: 在JobService类中添加可能的方法...待完善: 如果扫描频度范围内可能多次扫描数据库(比如上述方法我设置的是每5秒执行一次扫描,那么在数据表中的人物肯定会被多次扫描),那么任务会被重复创建。

93820
  • 无需 sendmail:巧用 LD_PRELOAD 突破 disable_functions

    最后,借助环境变量 LD_PRELOAD 劫持系统函数 getuid(),获取控制权。...一是 cmd 参数,待执行的系统命令(如 pwd);二是 outpath 参数,保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外关于该参数,你应注意 web 是否有读写权限、...web 是否可跨目录访问、文件将被覆盖和删除等几点;三是 sopath 参数,指定劫持系统函数的共享对象的绝对路径(如 /var/www/bypass_disablefunc_x64.so),另外关于该参数...此外,bypass_disablefunc.php 拼接命令和输出路径成为完整的命令行,所以你不用在 cmd 参数中重定向了: $evil_cmdline = $cmd . " > " ....从环境变量 EVIL_CMDLINE 中接收 bypass_disablefunc.php 传递过来的待执行的命令行。

    2K10

    干货 | Linux下权限维持实战

    有趣的 LD_PRELOAD 前言 LD_PRELOAD 是 Linux 系统中的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库...让程序优先加载的这个恶意的动态链接库,最后当程序再次运行时便会加载动态链接库中的恶意函数。...参数:待执行的系统命令,如 id 命令。...•outpath 参数:保存命令执行输出结果的文件路径(如 /tmp/xx),便于在页面上显示,另外该参数,你应注意 web 是否有读写权限、web 是否可跨目录访问、文件将被覆盖和删除等几点。...•sopath 参数:指定劫持系统函数的共享对象的绝对路径(如 /var/www/bypass_disablefunc_x64.so),另外关于该参数,你应注意 web 是否可跨目录访问到它。

    1.8K30

    Linux rootkit 深度分析 – 第1部分:动态链接器劫持

    在我们的插入函数中,我们使用dlsym获取原始函数的地址,然后调用它来获取下一个目录条目。...我们将每个条目的名称与“malicious_file”进行比较,如果匹配,则跳过它,从而有效地将该文件从输出中隐藏起来。 dlsym允许我们在运行时获取共享对象/库中函数的地址。...LD_PRELOAD定义的库在/etc/ld.so.preload中的库之前加载。在野的利用动态链接器劫持 rootkit 技术已被许多攻击者使用。...Libprocesshider 是一个开源工具,旨在通过覆盖函数来隐藏常用进程列表工具(如 ps、top 和 lsof)中的特定进程。这种技术使TeamTNT能够隐藏XMRig加密和其他恶意进程。...在这篇博文中,我们了解了此 rootkit 的工作原理,并提供了有关如何在操作系统上检测它的最佳实践。

    22210

    CTFHub:web-LD_PRELOAD-WP

    解题思路 思路分析 根据资料可得知有四种绕过 disable_functions 的手法: 攻击后端组件,寻找存在命令注入的 web 应用常用的后端组件,如,ImageMagick 的魔图漏洞、bash...大致步骤如下 生成一个我们的恶意动态链接库文件 利用putenv设置LD_PRELOAD为我们的恶意动态链接库文件的路径 配合php的某个函数去触发我们的恶意动态链接库文件 RCE并获取flag 这里面的某个函数需要在运行的时候能够启动子进程...LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库。...这个功能主要就是用来有选择性的载入不同动态链接库中的相同函数。通过这个环境变量,我们可以在主程序和其动态链接库的中间加载别的动态链接库,甚至覆盖正常的函数库。...参数string 的格式为name=value, 如果该环境变量原先存在, 则变量内容会依参数string 改变, 否则此参数内容会成为新的环境变量.

    18910

    GoAhead服务器 远程命令执行漏洞 分析报告

    漏洞的起因是cgi.c文件中的cgiHandler函数使用了不可信任的HTTP请求参数初始化已fork的CGI脚本的环境。...结合glibc动态链接器,攻击者就可以使用特殊的环境变量(如LD_PRELOAD)导致执行任意代码。 安恒信息应急响应中心也将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。...可以看出正式这里对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。...漏洞复现 payload.c 将payload.c编译成动态链接库.so文件 查看编译好的文件 如果用该文件作为LD_PRELOAD动态链接库文件运行,运行任意程序则会有如下效果。...查看CGI程序中的0号fd文件,发现这是一个符号链接,指向一个tmp文件,我们再查看该tmp文件,最终确认该文件正是我们上传的恶意动态链接库文件。

    1.1K100

    干货分享 | GoAhead服务器 远程命令执行漏洞(CVE-2017-17562) 分析报告

    漏洞的起因是cgi.c文件中的cgiHandler函数使用了不可信任的HTTP请求参数初始化已fork的CGI脚本的环境。...结合glibc动态链接器,攻击者就可以使用特殊的环境变量(如LD_PRELOAD)导致执行任意代码。 安恒信息应急响应中心也将对该漏洞进行持续关注,并第一时间为您更新相关漏洞信息。...可以看出正式这里对于参数的过滤不全,导致了用户可以修改CGI程序的LD_PRELOAD环境变量。 ? 漏洞复现 payload.c ? 将payload.c编译成动态链接库.so文件 ?...如果用该文件作为LD_PRELOAD动态链接库文件运行,运行任意程序则会有如下效果。 ? 可以看到payload.so中的代码成功运行。 验证poc: ?...查看CGI程序中的0号fd文件,发现这是一个符号链接,指向一个tmp文件,我们再查看该tmp文件,最终确认该文件正是我们上传的恶意动态链接库文件。 ?

    1.6K120

    共享对象注入

    “如何在不解密的情况下,破解SSL的明文数据?那当然是不要让明文加密了!逻辑鬼才不容反驳” 首先我们得了解一下基础知识 ?...程序库可分三类:静态库,共享库和动态加载库 静态库,是在执行程序运行前就已经加入到执行码中,在物理上成为执行程序的一部分; 共享库,是在执行程序启动时被加载到执行程序中,这样的库可以被多个执行程序共享使用...动态加载库,其实并不是一种真正的库类型,应该是一种库的使用技术,应用程序可以在运行过程中随时加载和使用库。 ?...这时候我们使用export命令将LD_PRELOAD环境变量指向新创建的libc_puts共享库。...LD_PRELOAD环境变量用于指定要由加载程序首先加载的共享库,首先加载共享库使我们能够拦截函数调用,并且使用动态加载程序API,我们可以将最初想要的puts函数绑定到函数指针,并通过它传递我们能控制的参数

    83730

    如何修改容器时间而不改变宿主机时间?

    需求 有时候需要测试业务程序,把时间指定到一个特定的时间去测试,如何在修改容器时间而不影响宿主机时间? 解决方法 GitHub 有一个开源的 libfaketime 项目,能解决这个问题。...github.com/wolfcw/libfaketime.git # 进入项目 $ cd libfaketime # 编译安装 $ sudo make && sudo make install 使用 指定动态链接库使用...="-3d" date Sun Mar 23 21:01:48 CST 2019 # 可以通过设置临时 LD_PRELOAD 环境变量 $ export LD_PRELOAD=/path/to/libfaketime.so....1 # 可以加入到 ~/.bashrc 目录中 $ echo "LD_PRELOAD=/path/to/libfaketime.so.1" >> ~/.bashrc # Linux 系统,可以加入到...ld.so.conf 配置中 $ echo "/path/to/libfaketime.so.1" >> /etc/ld.so.conf.d/local.conf # 使 local.conf 配置生效

    1.7K30

    LD_PRELOAD 后门 | bypass disable_functions

    LD_PRELOAD 后门 用途 主要是用于绕过 disable_functions ,本质上是加载顺序的问题, 动态链接库加载过程中会先加载 LD_PRELOAD 指向的变量,这样我们可以利用这个先加载来进行劫持正常的函数和命令...照常返回正常值(保证命令的正常执行) 漏洞原理 Linux ELF 共享库加载顺序: LD_PRELOAD -> /etc/ld.so.preload -> DT_RPATH(编译指定) ->...劫持命令流程 使用readelf -Ws查看命令使用了哪些库函数, 选取一个函数劫持,再使用strace查看函数的参数写劫持函数, 我们在这里使用命令经常用到的字符串比较函数strcmp() 同时可以看到...的,无法用 :LD_PRELOAD 劫持 获取命令的源码 git clone git://git.sv.gnu.org/coreutils man 可以获得命令的详细使用方法 并不是只要命令使用到劫持函数就会运行...(否则参数类型对不上的话不会执行我们重写的hook函数) strace -f php function.php 2>&1 | grep -A2 -B2 execve #查看php文件执行后调用了哪些系统命令

    87740

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

    LD_LIBRARY_PATH 动态链接目录:在搜索动态库时,UNIX 系统会在由该环境变量提供的特定目录中搜索库。...防护应用可以使用可信库静态链接来避免它。 在 Windows 的机制中,加载 DLL 时,通常在搜索系统目录之前,在当前目录中搜索 DLL。...LD_PRELOAD 许多 UNIX 系统允许你预加载共享库,通过设置环境变量LD_PRELOAD。这允许你做一些有趣的事情,比如将 C 标准库的函数或者甚至系统调用的 C 接口换成你自己的函数。...要注意 Shell 是个强大的程序)处理命令行参数。 启动子进程涉及到依赖和属性继承的问题,我们已经看到它们存在问题。函数execlp和execvp使用 Shell 来启动程序。...一些应用从 Web 表单获取用户输入,之后使用用户输入直接构造 SQL 语句。

    57710

    【Android 逆向】修改运行中的 Android 进程的内存数据 ( Android 命令行中获取要调试的应用进程的 PID | 进程注入调试进程内存的 so 库 )

    文章目录 一、Android 命令行中获取要调试的应用进程的 PID 二、进程注入调试进程内存的 so 库 一、Android 命令行中获取要调试的应用进程的 PID ---- 前置博客 【Android...逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system ) 先安装 Android...PID 为 2328 ; 二、进程注入调试进程内存的 so 库 ---- 在 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝...Android 平台可执行文件和动态库到 /data/system ) 博客中 , 拷贝了 2 个文件到 /data/system/debug/ 目录下 , 先为两个文件赋予 777 权限 , 即所有的执行权限.../tool 2328 命令 , 即可完成 进程 注入操作 ; 如果命令行输出的 hook_entry_addr = 0xa36044e0 不为空 , 是一个实际的地址 , 说明调试动态库注入成功 ; 完整命令行输出

    73710

    F-Stack LD_PRELOAD 测试版介绍

    libff_syscall.so 该动态库主要作用是劫持系统的 socket 相关接口,根据 fd 参数判断是调用 F-Stack的相关接口(通过上下文 sc 与 fsack 实例应用程序交互)还是系统内核的相关接口...F-Stack用户的应用程序 (如 helloworl 或 Nginx)设置 LD_PRELOAD劫持系统的 socket 相关 API 时使用,即可直接接入 F-Stack 开发框架,可以参考如下命令...Nginx 接入libff_syscall.so介绍 Nginx(以 F-Stack 默认携带的 Nginx-1.16.1 为例)目前可以不修改任何代码直接以LD_PRELOAD动态库libff_syscall.so...export FF_INITIAL_LCORE_ID=0x4 如果用于应用程序可以配置 CPU 亲和性,则可以忽略该参数,如 Nginx 配置文件中的worker_cpu_affinity参数。...export FF_PROC_ID=1 如果用于应用程序可以配置 CPU 亲和性,则可以忽略该参数,如 Nginx 配置文件中的worker_cpu_affinity参数。

    1K30

    基于 Wazuh-常见主机入侵检测方法

    https://www.freebuf.com/column/162604.html linux 操作系统的动态链接库在加载过程中,动态链接器会先读取 LDPRELOAD 环境变量和默认配置文件 /etc.../ld.so.preload,并将读取到的动态链接库文件进行预加载,即使程序不依赖这些动态链接库,LDPRELOAD 环境变量和 /etc/ld.so.preload 配置文件中指定的动态链接库依然会被装载...LD_PRELOAD 通过检测 $LD_PRELOAD 是否有值。...此时子进程标准输入输出已被重定向到套接字,getpeername 能真的获取到客户端的 TCP 源端口,如果是 19526 就执行 sh 给个 shell。...通过软连接的方式,实质上 PAM 认证是通过软连接的文件名(如: /tmp/su,/home/su) 在 /etc/pam.d/ 目录下寻找对应的 PAM 配置文件(如: /etc/pam.d/su),

    9.8K50

    【JAVA-Day34】使用Java函数处理命令行参数

    总之,命令行传参是软件开发中一个不可或缺的组成部分,它使得程序更加灵活、通用,并提供了与用户之间的交互接口,从而满足了各种不同的需求。在下一节中,我们将深入研究如何在Java中处理命令行参数。...如何进行命令行传参 使用Java函数处理命令行参数的步骤 在Java中,处理命令行参数通常涉及一系列步骤,以确保参数被正确解析和利用。下面我们将详细介绍如何在Java中处理命令行参数。...通常,您可以使用命令行解析库(如Apache Commons CLI或自定义解析逻辑)来帮助解析参数。...示例:如何在Java中获取和解析命令行参数 在前面的Java示例中,我们展示了如何获取和解析命令行参数。通过使用命令行解析库,您可以更轻松地处理各种选项和参数,从而使您的程序更加灵活和易于使用。...请记住,在实际开发中,您可以根据项目需求自定义选项和参数的语法和含义。 接下来,我们将继续探讨命令行参数的优势和应用场景,以及如何在实际项目中充分利用它们。

    6210

    TryHackMe之Linux提权

    hostname hostname命令可以获取目标机的主机名,虽然这个值可以很容易地改变或者是一个相对无意义的字符串,但在某些时候它可以提供有关目标系统在公司网络中的角色的信息 uname -a 这个命令将为我们提供有关系统使用的内核的更多详细信息...命令的输出内容通常包括以下内容: PID:进程ID(进程唯一) TTY:用户使用的终端类型 时间:进程使用的 CPU 时间量(这不是该进程运行的时间) CMD:正在运行的命令或可执行文件(不会显示任何命令行参数...) -A选项可以查看所有运行中的进程;axjs选项可以查看进程树;aux选项可以查看所有用户的进程、启动进程的用户和未附加到终端的进程,使用这个选项我们可以更好地了解系统和潜在的漏洞 env 这个命令可以获取到系统的环境变量...LD_PRELOAD 是一个允许任何程序使用共享库的函数。...如果启用env_keep选项,我们可以生成一个共享库,它将在程序运行之前加载并执行,注意如果真实用户 ID 与有效用户 ID 不同,LD_PRELOAD 选项将被忽略 这种方法提权的步骤如下: 检查 LD_PRELOAD

    1.3K30

    RASP攻防 —— RASP安全应用与局限性浅析

    image (5) 下午7.56.55.png 替换 Opcode handler 后便可以自定义函数调用前后的操作, 如获取参数、阻断攻击等, 还可以通过 ZEND_USER_OPCODE_DISPATCH...参数获取与分析 在完成对敏感函数调用行为的监控后,通过ZEND_CALL_NUM_ARGS和ZEND_CALL_ARG,我们可以获取到函数的参数个数和内容,便可根据函数的参数制定相应的策略。...如文件类可以关注是否读取了敏感文件, 数据库操作类是否语法结构发生了变化等等。 二、 RASP 安全应用场景介绍 1....比如 mail() 函数的第五个additional_parameters参数可用于设置命令行选项传递给配置为发送邮件时使用的程序。...LD_PRELOAD LD_PRELOAD 是Linux中比较特殊的环境变量,它允许用户指定程序运行前优先加载的动态链接库。

    1.9K30
    领券