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

为什么我的execve()只有在参数包含/bin/时才有效?

execve()是一个系统调用函数,用于在Linux系统中执行一个新的程序。它的原型如下:

代码语言:txt
复制
int execve(const char *filename, char *const argv[], char *const envp[]);

其中,filename参数是要执行的程序的路径,argv参数是一个字符串数组,包含了要传递给新程序的命令行参数,envp参数是一个字符串数组,包含了新程序的环境变量。

根据你的描述,你的execve()函数只在参数包含"/bin/"时才有效。这是因为在Linux系统中,"/bin/"目录下存放了许多系统命令和可执行文件。当你在execve()函数中指定的路径不包含"/bin/"时,系统无法找到要执行的程序,因此execve()函数调用失败。

举个例子,如果你想执行一个名为"myprogram"的程序,而该程序位于"/home/user/myprogram"目录下,你可以这样调用execve()函数:

代码语言:txt
复制
char *args[] = {"myprogram", NULL};
char *env[] = {NULL};
execve("/home/user/myprogram", args, env);

在这个例子中,execve()函数会执行"/home/user/myprogram"路径下的"myprogram"程序。

需要注意的是,execve()函数的参数是一个字符串数组,最后一个元素必须为NULL,以表示参数列表的结束。

至于腾讯云的相关产品和产品介绍链接地址,由于要求不能提及具体的云计算品牌商,我无法给出相关链接。但你可以通过访问腾讯云官方网站,查找他们的云计算产品和相关文档。

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

相关·内容

C++核心准则R.30: 只有包含明确生命周期语义使用智能指针作参数

R.30: Take smart pointers as parameters only to explicitly express lifetime semantics R.30: 只有包含明确生命周期语义使用智能指针作参数...如果一个函数只是需要一个部件本身,接受一个智能指针作参数是错误。它应该可以接受所有部件对象,而不只是一个生命周期被按照特定方法管理对象。不需要管理生命周期函数应该使用原始指针和引用。...(简单)如果一个函数使用了可拷贝(重载了操作符->和操作符*)智能指针类型参数但是只是调用了运算符*、->或者get(),发出警告并建议使用T*或者T&。...标记定义了(重载了操作符->和操作符*)可拷贝/可移动智能指针类型参数,但在函数体中却从未使用拷贝和移动功能,指针从未被修改也没有交给一个会那么做函数情况。那意味着所有权语义根本没有被使用。

56120

Linux Capabilities 入门:如何管理文件 capabilities?

可以包含多个分组,每一个分组表示形式为 capability[,capability…]+(e|i|p),其中 e 表示 effective,i 表示 inheritable,p 表示 permitted...Securebits : 也没搞清楚这是个什么鬼。 这个命令输出信息比较有限,完整信息可以查看 /proc 文件系统,比如当前 shell 进程就可以查看 /proc/$$/status。...至于 no_new_privs究竟是干嘛,下面单独解释一下。...为了解决这个问题,Linux 内核从 3.5 版本开始,引入了 no_new_privs 属性(实际上就是一个 bit,可以开启和关闭),提供给进程一种能够 execve() 调用整个阶段都能持续有效且安全方法...$(pgrep nginx) 这里你会看到只有主线程才有 capabilities,子线程和其他 workers 都没有 capabilities,这是因为只有 master 需要特殊权限,例如监听网络端口

4.1K10

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

应用程序调用系统调用和系统调用返回都会经过 kauditd ,kauditd 会将这些事件记录下来并通过 Netlink 回传给用户态进程。 用户态进程解析事件日志并输出。...方法很简单,就是不使用execve系统调用。(不是废话) 大家想想为什么会有反弹shell? 为什么要弹shell?...大体操作流程如下: 第一步:首先我们fork出来一个子进程,然后子进程中先调用ptrace,接着执行execve("ls xxxxxx"),这个时候基于execve监控到就是一个假参数。...四.新方法-无"命令"反弹shell 已知绕过方法中,通过shellcode方式绕过内核态execve监控,算是相对优雅方式了,比较喜欢这种,但是这种方式又太麻烦,linux命令我都要重写成...其实需求很简单: 既想要linux命令原有的功能,又不想用execve syscall方式启动。 想了想,为什么不能将linux 命令直接当成shellcode来执行呢?

1.5K20

Linux进程控制【进程程序替换】

-1 参数1:待替换程序路径,如 /usr/bin/ls 参数2:待替换程序名及其命名构成 指针数组,相当于一张表 注意: 虽然 execv 只需传递两个参数,但在创建 argv 表,最后一个元素仍然要为.../other/CPP", NULL, environ); //继承环境变量表 结论: 如果主动传入环境变量后,待替换程序中原环境变量表将被覆盖 现在可以理解为什么 bash 中创建程序并运行,...,供 execve 参数2使用 execlp 相当于 PATH 中找到目标路径信息后,传给 execve 参数1使用 execle envp 最终也是传给 execve参数3 #include...,触发 写拷贝 机制,令子进程读取另一块区域数据 写拷贝 只读数据区也能触发,因为不能影响到父进程 ---- 总结 以上就是本篇关于 Linux 进程程序替换相关内容了,本文中,我们知道了进行程序替换目的...,期待留下一个小小赞,你支持是分享最大动力!

19820

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

应用程序调用系统调用和系统调用返回都会经过 kauditd ,kauditd 会将这些事件记录下来并通过 Netlink 回传给用户态进程。 用户态进程解析事件日志并输出。...char **, 如果/bin/sh有其它参数的话,整个程序写法就又不一样了 lea edx, [esi+12] # 最后是null地址,注意,是null地址,不是null...方法很简单,就是不使用execve系统调用。(不是废话) 大家想想为什么会有反弹shell? 为什么要弹shell?...大体操作流程如下: 第一步:首先我们fork出来一个子进程,然后子进程中先调用ptrace,接着执行execve("ls xxxxxx"),这个时候基于execve监控到就是一个假参数。...四.新方法-无"命令"反弹shell 已知绕过方法中,通过shellcode方式绕过内核态execve监控,算是相对优雅方式了,比较喜欢这种,但是这种方式又太麻烦,linux命令我都要重写成

3K20

两个主题:躲避execve与分析proc目录

躲避execve,是原来文章基础上补充一个小思路,分析/proc/目录 是为了下一篇讲解内存中修改函数做准备,要让大家提前知道这回事。...躲避execve小思路 之前文章中,讲解过各种躲避execve监控方法,如果有朋友没看到过,可以点下面文章链接熟悉一下: 无"命令"反弹shell-逃逸基于execve命令监控(上) linux...下面来说一下,这种方式按猜想该怎么监控: 复制一份bash,bashMD5是不会变安全基线中有进程文件哈希库:一个名字不是bash文件哈希 和bash一样,你觉得可不可疑呢?...,只有内核编译打开了 CONFIG_STACKTRACE编译选项,才会生成这个文件。...如果当前进程虽然阻塞,但阻塞函数并不是系统调用,则系统调用号值为 -1,后面只有堆栈指针和指令计数器值。如果进程没有阻塞,则这个文件只有一个“ running”字符串。

1.5K30

从一道 CTF 题看 SROP | PWN

SROP 学习过程中,很大一部分人写 smallest 这道题 writeup 让感觉很疑惑,为了证明他们写存在一定问题,被迫走上了 pwntools + gdb 调试路,所以这次只能用视频来进行展示了...除了rcx、r11和rax,其他寄存器都被保留。系统调用编号必须在寄存器rax中传递。系统调用参数限制为6个,不直接从堆栈上传递任何参数。...返回,rax中包含了系统调用结果,而且只有INTEGER或者MEMORY类型值才会被传递给内核。 用户接口 x86-64下通过寄存器传递参数,这样做比通过栈具有更高效率。...它避免了内存中参数存取和额外指令。根据参数类型不同,会使用寄存器或传参方式。如果参数类型是MEMORY,则在栈上传递参数。...所以如果有多于6个INTEGER参数,则后面的参数栈上传递。

88120

无需 sendmail:巧用 LD_PRELOAD 突破 disable_functions

半月前逛“已黑网站列表”复审一小电商网站,“列表”中并未告知漏洞详情,简单浏览了下功能,只有注册、登录、下单、支付等几个而已。登录接口中,找到个 RCE(远程代码执行,非远程命令执行)漏洞: ?...,想法 c.so 前优先加载可控 c_evil.so,c_evil.so 内含与 b() 同名恶意函数,由于 c_evil.so 优先级较高,所以,a.bin 将调用到 c_evil.so 内...找寻内部启动新进程 PHP 函数。虽然 LD_PRELOAD 为提供了劫持系统函数能力,但前提是得控制 php 启动外部程序行(只要有进程启动行为即可,无所谓是谁)。...go.bin 实现,那么, php 脚本中调用了函数 goForward(),势必启动外部程序 go.bin。...一是 cmd 参数,待执行系统命令(如 pwd);二是 outpath 参数,保存命令执行输出结果文件路径(如 /tmp/xx),便于页面上显示,另外关于该参数,你应注意 web 是否有读写权限、

1.9K10

缓冲区溢出 攻击 「建议收藏」

下面的指令描述了如何设置 zsh 程序: 这里知道Tab可以补全qaq困惑了好久 GCC编译器有一种栈保护机制来阻止缓冲区溢出,所以我们在编译代码需要用 –fno-stack-protector...缓冲区溢出,简单说就是计算机对接收输入数据没有进行有效检测(理想情况是程序检查数据长度并不允许输入超过缓冲区长度字符),向缓冲区内填充数据超过了缓冲区本身容量,而导致数据溢出到被分配空间之外内存空间...但是缓冲区溢出攻击,也可以将整个触发缓冲区溢出攻击过程代码统称为shellcode,按照这种定义可以把shellcode分为四部分: 1、核心shellcode代码,包含了攻击者要执行所有代码..."/bin/sh"; name[1] = NULL; execve(name[0], name, NULL); _exit(0); } shellcode.c...按照前面刚刚讲过系统调用规则,Linux下生成一个shell并结束退出需要以下步骤: 在内存中存放一个以’\0’结束字符串”/bin/sh”; 将字符串”/bin/sh”地址保存在内存中某个机器字中

1.1K30

ROP-Ret2csu详解

利用原理 当在x64环境下函数参数传递凑不齐类似“pop rdi;ret”/“pop rsi;ret”/“pop rdx;ret”等3个传参gadgets,就可以考虑使用_libc_csu_init... 利用_libc_csu_init函数中两个代码片段来实现这三个参数传递 确定gadget1、gadget2地址 由于程序中vul函数并未执行过,而call函数用法是跳转到某地址内所保存地址...,三次溢出] 点击下载-提取码:bpiv 思路 确定csu函数中r13、r14、r15顺序 参数 正序即可 利用csu_gadgets泄露write函数真实地址,并返回至主函数 通用gadgets...+ libc.symbols['execve'] 再次利用csu_gadgets将execve函数地址及‘/bin/sh’写入到程序bss段 csu(read_addr,0,bss_addr,16,main_addr...("Hello, World\n") #gdb.attach(sh) sh.send(p64(execve_addr)+'/bin/sh\x00') #发送execve地址加上/bin/sh到bss段

1.5K20

Linux-Copy On Write写复制机制初探

系统调用execve()对当前进程进行替换,替换者为一个指定程序,其参数包括文件名(filename)、参数列表(argv)以及环境变量(envp)。...---- 为什么有了COW? 早期 Unix 实现 fork 系统调用时,并没有使用该技术,创建新进程开销很大。...现在Linuxfork()使用写拷贝页来实现新进程创建,它是一种可推迟甚至避免数据拷贝技术,刚开始内核并不会复制整个地址空间,而是让父子进程共享地址空间,只有复制地址空间,使得父子进程都拥有独立地址空间...,即资源复制是只有需要写入时才会发生,因此而称之为Copy on Write(COW)。...,也就是说只有当进程空间中各段内存内容发生变化时,父进程将其内容复制一份传给子进程,大大提高了效率。

3.2K10

操作系统·进程

系统对前台作业按照时间片轮转法进行调度,仅当前台无作业把处理机分配给后台作业进程。...圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿便试图取用其左、右最靠近他筷子,只有在他拿到两支筷子时才能进餐。进餐毕,放下筷子继续思考。...解决办法: 觉得解决方法已经不重要了,为什么不先反问一句:为什么会出现这种状况?这不应该是设计方面应该考虑问题吗?...PATH变量查找子程序文件 e 函数传递指定参数envp,允许改变子进程环境,无后缀e,子进程使用当前程序环境 下面找到一些通俗易懂栗子,算是让明白了一点: #ifdef HAVE_CONFIG_H...,适合包含vexec函数参数 char *arg[] = {"ls", "-a", NULL}; /** * 创建子进程并调用函数execl * execl 中希望接收以逗号分隔参数列表

88920

Linux Capabilities 入门:让普通进程获得 root 洪荒之力

作为普通用户,如果想执行某些只有管理员才有权限操作,以前只有两种办法:一是通过 sudo 提升权限,如果用户很多,配置管理和权限控制会很麻烦;二是通过 SUID(Set User ID on execution...这样一来,权限检查过程就变成了:执行特权操作,如果线程有效身份不是 root,就去检查其是否具有该特权操作所对应 capabilities,并以此为依据,决定是否可以执行特权操作。...现在不知道为什么也没关系,后面会通过具体公式来告诉你。...举个例子,一个 Bash 环境中(例如某个正在执行脚本),该环境所在线程 Ambient 集合中包含 CAP_NET_RAW capability,那么该环境中执行 ping 文件可以正常工作...虽然 Kubernetes 官方不支持,但我们可以自己来实现,具体实现方式可以关注后续文章。

8.4K21

linux系统编程之进程(三):exec系列函数和system函数

execv、execvp和execvpe第二个参数是一个字符串数组,新程序启动时会把argv数组中给定参数传递到main 名字含字母“p”函数会搜索PATH环境变量去查找新程序可执行文件...如果可执行程序文件存在SUID和SGID位的话,那么有效用户ID和组ID(euid, egid)会发生变化 程序启动时候,所有的信号处理方式都是默认。...我们前面讲到fcntl 函数未讲到当cmd参数取F_SETFD情形,即设置文件描述符标志,现结合exec系列函数讲解如下: /*********************************...; // 带l为可变参数     //  execvp("ls", args); //args数组参数传递给main     //  execv("/bin/ls", args);     int ret...* 即在执行execve将标准输出文件描述符关闭,      * 即下面替换pid_env程序不会在屏幕上输出信息      */     //  if (ret == -1)     //

2.1K60

CVE-2021-4034 pkexec本地提权漏洞

所以程序编写时候有一个读取argv参数for循环是根据argc来进行参数获取。..., 默认情况下无参数argc = 1 , 同时argc 也是argv数组大小范围。...但是当我们程序中使用execve()执行pkexec如果传入args参数和environ参数均为数组为{NULL}, 那么就会导致pkexe内argc参数值为0。..., 可以看到后面接着是envp变量数组, 这个数组就是我们上面提到execve函数第二个参数environ , 这个是环境变量参数, 使用execve运行pkexeenvp[0]值为pwnkit.so...测试可以本地设置一个文件为具有suid可执行文件file1用于输出全部环境变量, 然后再创建一个可执行文件file用来通过execve执行具有suid权限file1, 并且将execve函数第三个参数

73520

审计 Linux 系统操作行为 5 种方案对比

目前大部分系统执行命令都通过 execv,execve 系统调用执行,这点就和会话无关,几乎所有的情况下,只要通过这两个系统调用执行命令,就会将操作行为记录下来,从目前最新版本(2.4.8)来看,snoopy.../uptime username:root]: uptime -p 上述日志显示 root 用户执行了uptime命令,参数包含 -p对应进程上下文信息都比较全,不过 snoopy 缺点也比较明显...,主要包含以下几点: 仅支持 execv,execve 相关系统调用操作; 不设置规则可能产生日志过多,对日志搜集系统造成很大负担; 暂不支持过滤敏感信息规则;实际使用中,snoopy 记录方式可以很详细记录所有的命令操作信息...其主要几个工具包含如下: auditd 策略规则主要根据 -a 或 -w 参数设置,可以将策略规则保存到默认 /etc/audit/rules.d/audit.rules 配置,也可以通过 auditctl...值得注意是,eBPF 仅适用于 Linux 4.1+ 版本,以 eBPF 开发进度来看,eBPF kernel-4.10 之后支持相对全面,线上使用时候尽量选择较高内核版本发行版(

1.5K20

Linux进程控制

(守护进程):Linux启动启动进程,并在后台运行 进程控制块 Linux中,每个进程创建都会被分配一个数据结构,称为进程控制块(PCB, Process Control Block),描述进程运动变化过程...pid = fork();之前,只有一个进程执行代码,但在该语句之后,有两个进程执行之后代码,根据pid不同执行不同语句。...实际上,只有execve()函数才是真正意义上系统调用,其它都是在此基础上经过包装库函数。...参数status用于保存进程退出一些状态,如果只是想把进程灭掉,可以设置该参数为NULL。 参数pid用于指定所等待线程。...: 宏定义 含义 WIFEXITED(status) 子进程正常退出,返回一个非零值,否则返回零 WEXITSTATUS(status) 当WIFEXITED为真,此宏可用,返回该进程退出代码

2K30

Linux系统-进程控制

拷贝 概念: fork成功之后父子代码共享,当父子不写入数据,数据也是共享,当任意一方试图写入,便以写拷贝方式各自一份副本 为什么数据要进行写拷贝: 进程具有独立性,多进程运行...: 只有main函数return算是终止进程,其他函数return只是结束函数,因为系统调用是main函数,main函数返回才是进程返回 调用main函数运行结束后,main函数...) 注:status不能简单的当作整形来看待,可以当作位图来看待(只有status低16比特位有有效信息) 示图: 注意: 如果是正常退出,我们可以进一步获取子进程退出退出码(退出状态.../ls",MY_acgv); //注:v表示数组形式传入参数列表 execvp("ls",MY_acgv); execve("/user/bin/ls",MY_acgv,env); 示例:替换程序为...execve是真正系统调用,其它五个函数最终都调用execve系统调用上一个封装),所以execveman手册 第2节,其它函数man手册第3节 示图: 注:对于软件或者程序执行,要预先将存在磁盘里软件或者程序加载到

1.5K30

UNIX高级环境编程 第三次实验 实现带参数简单Shell

fork()函数返回值为-1表示出错。 如果子进程只是运行与父进程完全一样程序,那用处是很有限。要让子进程运行不同于父进程程序,就必须调用execve函数,它是 所有其他exec函数基础。...execve函数把调用它进程程序,替换成execve函数参数所指定程序。运行execve函数成功后,进程 将开始运行新程序,也就是execve函数参数所指定程序。...// 注意,argv1 第一个字符串“/bin/ls”中,只有ls是有用。 系统调用waitpid()用于等待子进程结束、获取子进程运行状态,详细说明第八章。...因此token为,设置相应flag:0为正常参数,1代表输入重定向,2代表输出重定向。...**file:**如果参数file中包含/,则就将其视为路径名,否则就按 PATH环境变量,它所指定各目录中搜寻可执行文件 excel 、execv都是需要给出可执行文件名绝对路径,execlp、

89520
领券