C 为什么我的setenv()调用不起作用?
我编写了以下C代码,将env变量设置为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键
\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