system() 中忽略 IFS 变量

system() 中忽略 IFS 变量

对于我大学的一门课程,我正在努力实现特权升级。我有这个简单的代码,它简单地复制ls并设置了位的输出SUID

int main(void){
  system("/bin/ls");
  return 0;
}

我还在主目录中添加了将充当 shell 的脚本:

#!/bin/bash
/bin/sh

我也添加了.变量$PATH,这是第一个。所以应该发生的是,每当我在 C 中运行代码时,应该调用bin主目录中的脚本,但是该IFS变量被完全忽略,因为它确实运行/bin/ls而不是bin ls.知道为什么吗?

答案1

你的程序不执行“bin主目录中的脚本”。它执行"/bin/ls"。系统调用使用 shell,但也使用绝对路径名(实际上POSIX说它的执行方式是实现定义的)。没有任何方法PATH会影响lsshell 的选择。

POSIX解决 的行为IFS,说:

实现可能会忽略的值IFS在环境中,或者没有IFS从环境中,在调用 shell 时,在这种情况下 shell 应设置IFS<space> <tab> <newline>它被调用的时候。

如果您询问的是一个实现不是以这种方式表现,那么(因为 POSIX 暗示这种做法经常发生,足以引起注意)特定的实现将是相关的。

答案2

system即使调用来执行命令的 shell/bin/ls尊重IFS环境中的值,它也不会影响该命令行的解析:

  1. IFS不用于解析 shell 命令。使用 shell 语法将命令拆分为单词,该语法精确指定如何对行进行标记。 (元字符终止标记;某些元字符也是标记。)

  2. 分词,尊重IFS,仅在未加引号的输入上执行经历某种形式的替代。因此,如果命令是$cmd并且变量的值cmd/bin/lsIFS则将用于对替换文本进行分词。但:

  3. /bin/ls使用 in进行分词/IFS结果为字。第一个是空的。空字不能用作命令,因此会抛出某种错误,而不是尝试执行bin

相关内容