Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/wcf/4.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 为什么我的setenv()调用不起作用?_C_Bash - Fatal编程技术网

C 为什么我的setenv()调用不起作用?

C 为什么我的setenv()调用不起作用?,c,bash,C,Bash,我编写了以下C代码,将env变量设置为\x09。但是当我使用echo$EGG | hextump时,我看到它将其设置为00。只有当第一个半字节为零时,才会发生此问题。有什么不对劲的线索吗 char shellcode[] = "\x09"; main() { setenv("EGG", shellcode, 1); system("/bin/bash"); return 0; } 嗯,您的代码工作正常;) 0x09是ASCII代码选项卡键 因此,EGG设置为tab键

我编写了以下C代码,将env变量设置为
\x09
。但是当我使用
echo$EGG | hextump
时,我看到它将其设置为
00
。只有当第一个半字节为零时,才会发生此问题。有什么不对劲的线索吗

char shellcode[] = "\x09";

main() {
    setenv("EGG", shellcode, 1);
    system("/bin/bash");

    return 0;
}

嗯,您的代码工作正常;)

0x09
是ASCII代码选项卡键


因此,
EGG
设置为tab键。当您打印它时,它实际上会打印您在控制台中通常无法识别的选项卡。

问题是字符
0x08、0x09、0x0a、0x0b、0x0c…
被视为空白字符,并从变量值中删除。如果您尝试设置
0x01
,它将在shell中可见

另外,看起来变量设置为
\x09
,但外壳不响应: 事实上:


shell添加了
0x0a
\n
)以在下一行打印值

我的问题与上面的问题无关。您应该用0(NULL)字符终止字符串(char shellcode[])。@axeoth字符串文字总是终止的,除非用于初始化非终止长度的数组。@Veger这绝对不是重复。在离开外壳之前执行
设置| grep EGG
)你会看到它起作用了。OP正在将回声输出传送到
hextump
,所以标签应该是可见的?@Veger-Earl回答说,我猜。你能展示一下关于这种行为的文档吗?我似乎找不到it@Veger参见:
manbash
(部分
分词
);env/var/
IFS
可用于更改此行为(至少对于
bash
)。不管怎样,手册页上说只有
IFS
设置的字符才被允许删除。啊。。。它实际上是正确设置的,但在外壳上有条纹。我在看
setenv()
文档,文档中没有提到任何不允许使用的字符。问题是,然后我尝试将$EGG作为参数提供给另一个程序,但问题仍然存在。例如,如果我使用./prog$EGG,当我调试它时,在argv[1]中,0x09被替换为00,即使IFS被如上所述设置。与其修改
IFS
,只需引用
$EGG
echo“$EGG”| hextump
prev_sh_$ ./so2 
$ export IFS=" \n"
$ echo $EGG | hexdump
0000000 0a09                                   
0000002