对于我大学的一门课程,我正在努力实现特权升级。我有这个简单的代码,它简单地复制ls
并设置了位的输出SUID
。
int main(void){
system("/bin/ls");
return 0;
}
我还在主目录中添加了将充当 shell 的脚本:
#!/bin/bash
/bin/sh
我也添加了.
变量$PATH
,这是第一个。所以应该发生的是,每当我在 C 中运行代码时,应该调用bin
主目录中的脚本,但是该IFS
变量被完全忽略,因为它确实运行/bin/ls
而不是bin ls
.知道为什么吗?
答案1
答案2
system
即使调用来执行命令的 shell/bin/ls
尊重IFS
环境中的值,它也不会影响该命令行的解析:
IFS
不用于解析 shell 命令。使用 shell 语法将命令拆分为单词,该语法精确指定如何对行进行标记。 (元字符终止标记;某些元字符也是标记。)分词,尊重
IFS
,仅在未加引号的输入上执行经历某种形式的替代。因此,如果命令是$cmd
并且变量的值cmd
是/bin/ls
,IFS
则将用于对替换文本进行分词。但:/bin/ls
使用 in进行分词/
的IFS
结果为三字。第一个是空的。空字不能用作命令,因此会抛出某种错误,而不是尝试执行bin
。